Jeffrey Meunier有一个隐式的Curry宏here,它使用defmacro。我想知道是否有人用语法规则写过这篇文章?
最佳答案
Scheme有许多Curry实现-没有一个可以像Haskell那样优雅,因为其中的功能始终是一元函数,因此所有内容都可以进行curry。 (但是,这当然可以通过功能强大的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实现中,都具有检查功能Arity的功能,并且使用此功能,可以实现知道何时调用原始函数的currying函数版本。