【问题标题】:Implicit currying in Scheme with syntax-rules?使用语法规则在 Scheme 中进行隐式柯里化?
【发布时间】:2011-04-14 07:37:37
【问题描述】:

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

【问题讨论】:

    标签: macros functional-programming scheme currying syntax-rules


    【解决方案1】:

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

    至于你挖出来的宏——这是一个非常糟糕的宏:它不仅使用了不卫生的宏,而且还显式调用了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 实现中,有一些工具可以检查函数的数量,并且使用它可以实现知道何时调用原始函数的柯里化函数版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2010-10-16
      • 2010-09-14
      • 2014-12-30
      相关资源
      最近更新 更多