質問

Jeffrey Meunierには、暗黙のカレーマクロがあります ここ, 、defmacroを使用します。 Syntax-Ruleで誰かがこれを書いたことがあるのだろうかと思っていましたか?

役に立ちましたか?

解決

スキームには多くのカレーの実装があります - 機能が常に単位関数であるため、ハスケルほどエレガントなものはありません。 (しかし、これはもちろん、ような十分に強力なスキームで実装できます ラケット.)

あなたが掘ったマクロに関しては、それはかなり悪いものです:非衛生的なマクロを使用するだけでなく、呼び出しています 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, 、一方、機能バージョンは、組み込みの機能で使用できます。多くのスキームの実装では、関数のアリニティを検査する機能があり、これを使用すると、元の関数を呼び出す時期を把握するカレー関数バージョンを実装することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top