Antwort

3

Es gibt eine Reihe von Curry-Implementierungen für Schema - keiner kann als Haskell so elegant sein, da es Funktionen immer einstellige Funktionen sind, so kann alles curried werden. (Aber das kann natürlich in einem ausreichend leistungsfähigen Schema wie Racket implementiert werden.)

Was das Makro, das Sie ausgegraben haben - es ist ein ziemlich schlechtes: nicht nur, dass es einen unhygienisch Makro verwendet, ist es auch ruft explizit eval auf und verlässt sich auf eine Implementierung von Umgebungen usw. Aber es ist einfach, das mit einem einfachen syntax-rules Makro zu tun. AFAICT, das ist was es implementiert:

(define-syntax-rule (clambda (x ... . r) b ...) 
    (let ([len (length '(x ...))] [real (lambda (x ... . r) b ...)]) 
    (let loop ([argss '()] [n 0]) 
     (lambda args 
     (let ([n (+ n (length args))] [argss (cons args argss)]) 
      (if (>= n len) 
      (apply real (apply append (reverse argss))) 
      (loop argss n))))))) 

Aber es gibt eine wichtige Anmerkung hier. Die Seite, die Sie verweisen, sagt, dass ein Problem der Funktion Version ist, dass es explizit ist - aber es hat auch einen wichtigen Vorteil: Mit der Makro-Implementierung Sie eine Funktion definieren, müssen mit clambda, während die funktionsfähigen Version mit jedem gebaut werden kann Funktion. In vielen Scheme-Implementierungen gibt es Einrichtungen einer Funktion arity zu untersuchen und mit diesem ist es möglich, eine currying Funktion Version zu implementieren, die weiß, wann die ursprüngliche Funktion aufzurufen.