Macros 使用语法规则的Scheme中的隐式curry?

Macros 使用语法规则的Scheme中的隐式curry?,macros,functional-programming,scheme,currying,syntax-rules,Macros,Functional Programming,Scheme,Currying,Syntax Rules,Jeffrey Meunier有一个隐式Curry宏,它使用defmacro。我想知道是否有人用语法规则写过这篇文章?Scheme有很多curry实现——没有一个能像Haskell那样优雅,因为函数总是一元函数,所以一切都可以用curry实现。(但这当然可以在一个足够强大的方案中实现,如。) 至于你挖掘出来的宏——这是一个非常糟糕的宏:它不仅使用了不卫生的宏,还显式调用了eval,并且依赖于环境等的实现。但是,用一个简单的语法规则宏很容易做到这一点。AFAICT,这是它实现的: (define-

Jeffrey Meunier有一个隐式Curry宏,它使用defmacro。我想知道是否有人用语法规则写过这篇文章?

Scheme有很多curry实现——没有一个能像Haskell那样优雅,因为函数总是一元函数,所以一切都可以用curry实现。(但这当然可以在一个足够强大的方案中实现,如。)

至于你挖掘出来的宏——这是一个非常糟糕的宏:它不仅使用了不卫生的宏,还显式调用了
eval
,并且依赖于环境等的实现。但是,用一个简单的
语法规则
宏很容易做到这一点。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函数版本,该版本知道何时调用原始函数