我正在尝试编写以下代码:
(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))))))
答案 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)
检查宏扩展到的代码。