2010-12-30 5 views
0

에서 생성 된 기호 boundp 사용 :나는 다음과 같은 코드를 작성하려고 매크로

(unless (boundp 'foo-1) 
(setq foo-1 bar-1)) 
(find-file foo-1) 

그러나, 기호 foo는-1과 바-1은 매크로를 통해 생성해야합니다. 나는 다음과 같은 것을 시도했지만, boundp은 내가 원하는 방식으로 작동하지 않는다. 나는 매크로에 익숙하지 않다. 나는 분명히 잘못된 것을하고 있습니까? 또한, 나는 내가 여기에 매크로를 학대? ... 당신은 그래서 그 무엇 분명하지 않다 assign-bar-to-foo에 대한 코드를 제공하지 않았더라도

(defmacro foo-setq-bar (X) 
    `(setq ,(intern (concat "foo-" (number-to-string X))) (assign-bar-to-foo ,X))) 
(defmacro foo-find-file (X) 
    `(progn 
    (unless (boundp (quote ,(intern (concat "foo-" (number-to-string X))))) 
     (foo-setq-bar ,X)) 
    (find-file ,(intern (concat "foo-" (number-to-string X)))))) 
+0

분명히 잘못된 것은 없지만 코드가 필요 이상으로 복잡 할 가능성이 있습니다. 전체 코드 ('assign-bar-to-foo'의 정의가 빠짐)와 잘못된 것 (''''(어떤 표현식)''을 갖기를 바랍니다.) 대신에 (어떤 효과가 있지만) 어떤 다른 효과) "). 높은 수준의 문제를 설명하면 누군가가 더 나은 해결책을 제안 할 수 있습니다. – Gilles

답변

1

제공 한 코드가 잘 실행 것으로 보인다.

(defmacro find-foobar (X) 
    (let* ((X-as-string (number-to-string X)) 
     (foo (intern (concat "foo-" X-as-string)))     
     (bar (intern (concat "bar-" X-as-string))))   
    `(progn (unless (boundp (quote ,foo))    
      (setq ,foo ,bar)) 
      (find-file ,foo)))) 

당신이 당신의 매크로 (macroexpand FORM)에로 확장 코드를 확인할 수 있습니다 기억 : 어떤 경우에, 이것은 당신이 당신의 예를 설명 어떻게해야 매크로입니다.

관련 문제