2010-09-19 19 views

回答

3

Scheme中有许多咖喱实现 - 没有一个可以像Haskell一样优雅,因为函数总是一元函数,所以所有东西都可以被粘贴。 (但这当然可以在一个足够强大的方案中实现,如Racket。)

至于你挖出的宏 - 这是一个非常糟糕的宏:它不仅使用不卫生的宏,它也是明确地调用eval,并依赖于环境的实现等。但使用简单的syntax-rules宏很容易。 AFAICT,这是它实现的:

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

但是这里有一个重要的提示。您引用的页面表明,函数版本的问题在于它是显式的 - 但它也有一个重要的优点:在宏实现中,您必须使用clambda来定义函数,而功能版本可以与任何内置功能。在许多Scheme实现中,有许多工具可以检查函数的参数,并且使用它可以实现知道何时调用原始函数的currying函数版本。