Scheme中使用语法规则进行隐式currying?

Jay*_*Jay 5 macros scheme functional-programming syntax-rules currying

Jeffrey Meunier 在这里有一个隐含的Curry宏,它使用defmacro.我想知道是否有人用语法规则编写了这个?

Eli*_*lay 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)))))))
Run Code Online (Sandbox Code Playgroud)

但这里有一个重要的注意事项。您引用的页面说函数版本的一个问题是它是显式的 - 但它也有一个重要的优点:使用宏实现,您必须使用 定义函数clambda,而函数版本可以与任何内置函数一起使用。在许多方案实现中,都有检查函数数量的工具,并且使用它可以实现知道何时调用原始函数的柯里化函数版本。