5
杰弗里Meunier有一个隐含的咖喱宏here,它使用defmacro。我想知道是否有人用语法规则写过这个东西?在语法规则中隐式加入Scheme中?
杰弗里Meunier有一个隐含的咖喱宏here,它使用defmacro。我想知道是否有人用语法规则写过这个东西?在语法规则中隐式加入Scheme中?
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函数版本。