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函数版本。

09-05 03:18