在clisp中:
(defun mkstr (&rest args)
(with-output-to-string (s)
(dolist (a args) (princ a s))))
(defun symb (&rest args)
(values (intern (apply #'mkstr args))))
为什么符号在宏编程中如此重要?
答案 0 :(得分:4)
符号名称函数和宏,因此如果您的宏定义函数,则必须构造符号。
例如,当你(defstruct foo a b c)
时,你正在定义这些功能:
MAKE-FOO
FOO-P
COPY-FOO
FOO-A
FOO-B
FOO-C
(SETF FOO-A)
(SETF FOO-B)
(SETF FOO-C)
需要构建上面的6个符号。
PS。您可能会发现(macroexpand-1 (defstruct foo a b c))
的输出具有启发性。
答案 1 :(得分:2)
符号是Lisp中命名的方式,宏通常想谈论名称。
想象一下,你想编写自己的defstruct
版本:像
(defstruct pos x y)
需要创建名称 - 符号 - 如pos-x
,make-pos
,pos-p
等。所以你需要谈论符号的方法:从其他符号创建符号,创建只有你知道的秘密符号,以及与其他任何符号不同的秘密符号等等。
我有点不同意他定义的symb
函数是必需,但你确实需要能够操作符号。