2013-04-16 4 views
1

S-expresions을 사용하고 조명기의 어휘 적 컨텍스트 내에서 평가하는 함수를 만드는 매크로를 만들려고합니다. 여기에 내가 쓴 매크로입니다 :이 양식이 let 양식의 어휘 문맥에서 평가되지 않는 이유

(defmacro def-fixture (name bindings) 
    "Return a function that takes the form to execute but is wrapped between a let of the bindings" 
    `(defun ,(intern (symbol-name name)) (body) 
    (let (,bindings) 
     (unwind-protect 
      (progn 
      body))))) 

는하지만 그것을 실행할 때 내가 Btw는

(def-fixture test-fixture '(zxvf 1)) 

(test-fixture '(= zxvf 1)) 
let: Symbol's value as variable is void: zxvf 

를 제공 어휘 컨텍스트 외부에서 실행 것으로 보인다, 나는 변수 어휘 바인딩을 사용할 수있다. 내 실수는 무엇입니까?

답변

2

이것은 어휘 범위와 아무 관련이 없습니다. 의도하지 무엇 물론이다

(defun test-fixture (body) 
    (let ((quote (zxvf 1))) 
    (unwind-protect (progn body)))) 

: 매크로 호출로 확장됩니다. (test-fixture '(= zxvf 1))에서 귀하가 인용 한 오류 (즉, variable is void)가 발생했다고 생각하지 않습니다. 대신, 을 평가하려고하기 때문에 신호음이 (void-function zxvf)입니다. (= zxvf 1) 표현식은 따옴표로 처리되었으므로 평가되지 않습니다.

(defmacro def-fixture (name bindings) 
    "Return a macro that takes the form to execute but is wrapped between a let of the bindings" 
    `(defmacro ,name (body) 
    `(let (,',bindings) 
     (unwind-protect 
      (progn 
      ,body))))) 

을 다음과 같이 사용 :

당신처럼 더 뭔가를 시도하는 것 같아서

(def-fixture test-fixture (zxvf 1)) 
(test-fixture (= zxvf 1)) 
+0

당신이 중첩 된 역 인용 부호를 사용하고있는 것을보고, 그것이 필요한 것인지 궁금해하고있었습니다. 감사 – PuercoPop

1

다음 노트는 emacs manual이다 : 또한

는 A defun는 바디 또는 defmacro 어휘 변수 주변 참조 할 수있는 코드를 포함 할 수있다.

문제 일 수 있습니다.

또한 def-fixture의 두 번째 인수를 인용해야하는지 여부는 알 수 없습니다. 나는 결과 매크로를 검사하기 위해 macrostep 패키지를 사용했고, 결과는 따옴표없이 더 잘 보인다.

+0

감사합니다! 나는 람다를 반환하고 매크로의 반환 expresion을 변수에 바인드하려고한다. – PuercoPop