2010-09-19 13 views

Respuesta

3

Hay una serie de implementaciones de curry para Scheme: ninguna puede ser tan elegante como Haskell, ya que sus funciones son siempre unarias, por lo que todo se puede curry. (Pero esto puede por supuesto implementarse en un Esquema suficientemente poderoso como Racket.)

En cuanto a la macro que ha desenterrado, es bastante mala: no solo utiliza una macro antihigiénica, sino que también llamando al eval explícitamente, y se basa en una implementación de entornos, etc. Pero es fácil hacerlo con una simple macro syntax-rules. AFAICT, esto es lo que implementa:

(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))))))) 

Pero hay una nota importante aquí. La página a la que hace referencia dice que un problema de la versión de la función es que es explícita, pero también tiene una ventaja importante: con la implementación de la macro debe definir una función usando clambda, mientras que la versión funcional se puede usar con cualquier función. En muchas implementaciones de Scheme hay instalaciones para inspeccionar el valor de una función, y al usar esto es posible implementar una versión de la función currying que sabe cuándo llamar a la función original.