将boundp与宏中生成的符号一起使用

时间:2010-12-30 00:20:50

标签: emacs elisp

我正在尝试编写以下代码:

(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 个答案:

答案 0 :(得分:1)

您提供的代码似乎运行正常,但您没有提供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)检查宏扩展到的代码。