2017-12-16 7 views
1

에서 속성 이름을 확장하여이 속성 목록을 고려리스프 : 매크로

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

이 간단한 전화 :

(getf *some-variable* :foo) 

수익률이 예상대로 "fooval". 이런 식으로 전화, 불행하게도

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

: 나는 모든 속성의 이름을 검색하기 위해 전달할 수있는 것을 제외하고 동일한 기능을 수행 할 예정이다 매크로를 정의 FOO

(my-macro 'foo) 

결과를. 왜?

+0

사용 MACROEXPAND이 디버깅을하지 않는 것이 특징 느슨한. –

+0

@RainerJoswig : 이미 시도해 보았지만 아직 우둔하지 않습니다. –

+0

그리고 무엇이 돌아 왔습니까? –

답변

5

왜 당신은 그냥 자신이 그것을 확인하지 않습니다

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

documentation for getf 당신이 그것에게 4 번째 인수를 주면 키가 발견되지 않는 경우는 값이 있다고 말한다. :|| (키워드 패키지의 빈 기호)가 존재하지 않기 때문에 제공된 기본값 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*