2012-03-04 14 views
11

最近、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でテスト)

答えて

20

共通Lisp LAMBDAでは、マクロとLAMBDA式で使用できるシンボルの2つの異なるものがあります。

LAMBDA式:Anはラムダ式を適用

#'(lambda (x) (foo x)) 

として書かれた短い

(function (lambda (x) (foo x))) 

も有効です。

両方の形式上
((lambda (x) (+ x x)) 4) 

はのコア構文の一部でありますCommon Lisp。

Common Lispの定義の後半にLAMBDAというマクロが追加されました。十分に戸惑っていますが、良い意図を持っています。 ;-)それはMacro LAMBDAと記載されています。

(lambda (x) (+ x x)) 

は、それはCommon Lispのコードはより多くのSchemeのコードのようにわずかに見える

(function (lambda (x) (+ x x)) 

に展開し、我々が

を書くことができます LAMBDAマクロで

(mapcar #'(lambda (x) (+ x x)) some-list) 

を書き込む必要はありません

(mapcar (lambda (x) (+ x x)) some-list) 

例が失敗します。

((my-lambda (x) (* x x)) 2) 

は有効なCommon Lisp構文ではありません。

Common Lispは期待いずれか

  • データオブジェクト
  • 形態における可変
  • 関数呼び出し(function args...)
  • 形態における関数呼び出し((lambda (arglist ...) body) args...)
  • (macro-name forms...)ようなマクロ形
  • 組み込みの特殊演算子の1つを使用する特殊形式lあなたは

    ((macro-name forms...) forms...) 
    

    の構文を見ることができるようにCommon Lispの

special operatorsのリストで定義されたIKE FUNCTIONLETは、... のCommon Lispの一部ではありません。

LAMBDAとして文字λを読み取ることが可能である:

(defun λ-reader (stream char) 
    (declare (ignore char stream)) 
    'LAMBDA) 

(set-macro-character #\λ #'λ-reader) 

例:

CL-USER 1 > ((λ (x) (* x x)) 3) 
9 

CL-USER 2 > '(λ (x) (* x x)) 
(LAMBDA (X) (* X X)) 
+2

'lambda'の拡張で問題となるのは' function'ではなく、 'lambda'を使った関数アプリケーションのハードワイヤードの動作です。あなたの説明では私は変更したいと思います: "適用されたラムダ式も有効です" "適用された' lambda'式も有効です( 'lambda'のみで、それを展開するマクロではありません)。 –

+0

今、感謝します! ラムダ式をエミュレートする(λ...)方法はありませんか? – ibab

+3

@ qrl:((λ(x)...)4)構文は、その文字をサポートするCL実装での読取りマクロで可能です。 LispリーダーはλをLAMBDAに拡張しなければならないでしょう。 –

2

あなたはまた、用語や無料のリストを与え、オペレータとしてLAMBDAと考えるかもしれません変数は、関数を返します。このp.o.v.少なくともインタプリタが関係する限り、基本機能と基本マクロのファミリーからLAMBDAを取り除きます。