最近、Common Lispを学び始めました。(ちょっと楽しかったので)ラムダマクロの名前を変更することにしました。Common Lispでlambdaの名前を変更
私の試みはこれだった:
> (defmacro λ (args &body body) `(lambda ,args ,@body))
それ自体でたときに、正しく展開するようだ:
> (macroexpand-1 '(λ (x) (* x x)))
(LAMBDA (X) (* X X))
しかし、それは表現の内側にネストされていたときに、実行が失敗します。
> ((λ (x) (* x x)) 2)
(Λ (X) (* X X)) is not a function name; try using a symbol instead
私はおそらく、マクロ展開について明白な何かを見逃していますが、それが何であるかを知ることはできませんでした。
多分あなたは私を助けることができますか?
編集: それはラムダで動作ん:
> ((lambda (x) (* x x)) 2)
4
編集2:(ライナーにより示唆されるように)それを動作させるために 一つの方法:
> (set-macro-character #\λ (lambda (stream char) (quote lambda)))
(Clozure CLでテスト)
'lambda'の拡張で問題となるのは' function'ではなく、 'lambda'を使った関数アプリケーションのハードワイヤードの動作です。あなたの説明では私は変更したいと思います: "適用されたラムダ式も有効です" "適用された' lambda'式も有効です( 'lambda'のみで、それを展開するマクロではありません)。 –
今、感謝します! ラムダ式をエミュレートする(λ...)方法はありませんか? – ibab
@ qrl:((λ(x)...)4)構文は、その文字をサポートするCL実装での読取りマクロで可能です。 LispリーダーはλをLAMBDAに拡張しなければならないでしょう。 –