macros - 使用语法规则在Scheme中隐式柯里化(Currying)?

标签 macros functional-programming scheme currying syntax-rules

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

最佳答案

Scheme 有很多柯里化(Currying)实现——没有一个能像 Haskell 那样优雅,因为函数总是一元函数,所以所有东西都可以柯里化(Currying)。 (但这当然可以在像 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 定义函数,而函数版本可以与任何内置函数一起使用。在许多方案实现中,都有检查函数数量的工具,并且使用它可以实现知道何时调用原始函数的柯里化(Currying)函数版本。

关于macros - 使用语法规则在Scheme中隐式柯里化(Currying)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745539/

相关文章:

functional-programming - 为什么 J 短语 '(2&*~) 15 7 3 1' 会生成一个表,为什么是那个特定的表?

java - Lambda 表达式函数式编程

scheme - 字符串反转操作

scheme - 重新定义 `if`时无限递归,为什么?

struct - 如何在 Racket 中定义递归结构?

android - 从 Android 代码定义 C 宏

macros - 如何通过 Erlang 的预处理器有条件地排除整个子句?

添加到类型名称的 C 宏

基于宏函数参数的c++宏输出类型

javascript - JavaScript 箭头函数的 raku 等价物是什么?