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-xmake-pospos-p 等。所以你需要谈论符号的方式:从其他符号创建符号,创建只有你知道并且与任何其他符号不同的秘密符号等等。

我有点不同意他定义的 symb 函数是 必不可少的 ,但您确实需要能够操作符号。

Symbols name 函数和宏,所以如果你的宏定义了函数,就必须构造symbols。

例如,当您执行 (defstruct foo a b c) 时,您正在定义这些函数:

  1. MAKE-FOO
  2. FOO-P
  3. COPY-FOO
  4. FOO-A
  5. FOO-B
  6. FOO-C
  7. (SETF FOO-A)
  8. (SETF FOO-B)
  9. (SETF FOO-C)

这需要构建上面的6个符号。

PS。您可能会发现 (macroexpand-1 (defstruct foo a b c)) 的输出很有启发性。