Let Over Lambda:宏中的符号表示
Let Over Lambda: symbolic representation in macros
Doug Hoyte 在他对 Let Over Lambda 的介绍中将 symb 函数定义为使用宏进行元编程的基本实用程序:
在剪辑中:
(defun mkstr (&rest args)
(with-output-to-string (s)
(dolist (a args) (princ a s))))
(defun symb (&rest args)
(values (intern (apply #'mkstr args))))
为什么符号在宏编程中如此重要?
符号是 Lisp 中事物的命名方式,而宏通常想谈论名称。
假设您想编写自己的 defstruct
版本:就像
这样的形式
(defstruct pos x y)
将需要创建名称——符号——如 pos-x
、make-pos
、pos-p
等。所以你需要谈论符号的方式:从其他符号创建符号,创建只有你知道并且与任何其他符号不同的秘密符号等等。
我有点不同意他定义的 symb
函数是 必不可少的 ,但您确实需要能够操作符号。
Symbols name 函数和宏,所以如果你的宏定义了函数,就必须构造symbols。
例如,当您执行 (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))
的输出很有启发性。
Doug Hoyte 在他对 Let Over Lambda 的介绍中将 symb 函数定义为使用宏进行元编程的基本实用程序:
在剪辑中:
(defun mkstr (&rest args)
(with-output-to-string (s)
(dolist (a args) (princ a s))))
(defun symb (&rest args)
(values (intern (apply #'mkstr args))))
为什么符号在宏编程中如此重要?
符号是 Lisp 中事物的命名方式,而宏通常想谈论名称。
假设您想编写自己的 defstruct
版本:就像
(defstruct pos x y)
将需要创建名称——符号——如 pos-x
、make-pos
、pos-p
等。所以你需要谈论符号的方式:从其他符号创建符号,创建只有你知道并且与任何其他符号不同的秘密符号等等。
我有点不同意他定义的 symb
函数是 必不可少的 ,但您确实需要能够操作符号。
Symbols name 函数和宏,所以如果你的宏定义了函数,就必须构造symbols。
例如,当您执行 (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))
的输出很有启发性。