Использование boundp с символом, сгенерированным в макросе - PullRequest
0 голосов
/ 30 декабря 2010

Я пытаюсь написать следующий код:

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

Однако символы foo-1 и bar-1 должны генерироваться с помощью макроса.Я попробовал что-то вроде следующего, но похоже, что boundp не работает так, как я хочу.Я не очень опытен с макросами;я делаю что-то явно не так?Кроме того, я здесь злоупотребляю макросами? ..

(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))))))

1 Ответ

1 голос
/ 03 января 2011

Код, который вы предоставили, кажется, работает нормально, хотя вы не предоставили код для assign-bar-to-foo, поэтому неясно, что это делает.В любом случае, это макрос, который должен делать то, что вы объяснили в своем примере:

(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).

...