杰弗里·梅尼尔(Jeffrey Meunier)有一个隐含的咖喱宏 这里, ,使用Defmacro。我想知道有人是否曾经用语法勒尔写这篇文章?

有帮助吗?

解决方案

方案有许多咖喱实现 - 没有一个像Haskell那样优雅,因为功能始终是单一功能,因此所有功能都可以咖喱。 (但是,这当然可以在足够强大的方案中实施 球拍.)

至于您已经挖出的宏 - 这是一个非常糟糕的:它不仅使用不卫生的宏,而且还在调用 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, ,而功能版本可以与任何内置功能一起使用。在许多方案实现中,都有可以检查函数的ARITY的功能,并且可以实现知道何时调用原始功能的咖喱功能版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top