5

Jeffrey Meunier は、defmacro を使用する暗黙の Curry マクロをここに持っています。誰かがこれを構文規則で書いたことがあるかどうか疑問に思っていましたか?

4

1 に答える 1

3

Scheme には多数のカリー実装があります。関数は常に単項関数であり、すべてをカリー化できるため、Haskell ほどエレガントなものはありません。(しかし、もちろん、これは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 実装には、関数のアリティを検査する機能があり、これを使用して、元の関数をいつ呼び出すかを知っているカリー化関数バージョンを実装することができます。

于 2010-09-25T18:26:07.990 に答える