Syntax-Ruleを使用したスキームの暗黙のカレー?
-
04-10-2019 - |
質問
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
, 、一方、機能バージョンは、組み込みの機能で使用できます。多くのスキームの実装では、関数のアリニティを検査する機能があり、これを使用すると、元の関数を呼び出す時期を把握するカレー関数バージョンを実装することができます。
所属していません StackOverflow