2017-12-16 16 views
1

でプロパティ名を展開しますが、このプロパティリストを考えてみましょう:Lispのマクロ

(defvar *some-variable* (list :foo "fooval" :bar "barval")) 

この単純なコール:

(getf *some-variable* :foo) 

利回り予想通り"fooval"FOO

(my-macro 'foo) 

結果:このようにそれを呼び出して、残念ながら

(defmacro my-macro (property-name) 
    `(getf *some-variable* :,property-name)) 

:私は、私が取得する任意のプロパティの名前を渡すことができることを除いて同じことを行うことになっているマクロを定義します。どうして?

+0

使用マクロ展開とみなされているという特徴を失います。 –

+0

@RainerJoswig:私はすでにそれを試みましたが、私はまだ無知です。 –

+0

そして、何が戻ったのですか? –

答えて

5

なぜあなたはちょうどそれを自分でチェックアウトしません:

(macroexpand-1 '(my-macro 'foo)) 
; ==> (getf *some-variable* :|| 'foo) ; 
T 

documentation for getfは、あなたがそれを第四引数を与えるならば、鍵が見つからない値であることを述べています。 :||(キーワードパッケージの空のシンボル)が存在しないため、指定されたデフォルトのfooが返されます。だからここ

は何をしたいん機能である:

(defun get-field (name) 
(getf *some-variable* 
     (intern (symbol-name name) "KEYWORD"))) 

(defparameter *test* 'foo) 
(get-field *test*) 
; ==> "fooval" 

はマクロにする唯一の理由は、それが構文作ることで、構文と機能の主な違いは、引数がないということです評価される。

(defmacro get-mfield (name) 
    `(get-field ',name)) 

(get-mfield foo) 
; ==> "fooval" 

(get-mfield *test*) 
; ==> nil 

あなたは裸のリテラルに来てもらうが、あなたは*test*はこれをデバッグするための変数ではなく、キー:*test*