让Over Lambda:宏中的符号表示

时间:2016-03-22 16:51:26

标签: macros lisp metaprogramming

Doug Hoyte在他的 Let Over Lambda 介绍中将symb函数定义为使用宏进行元编程的基本实用工具:

在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))))

为什么符号在宏编程中如此重要?

2 个答案:

答案 0 :(得分:4)

符号名称函数和宏,因此如果您的宏定义函数,则必须构造符号。

例如,当你(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)
  10. 需要构建上面的6个符号。

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

答案 1 :(得分:2)

符号是Lisp中命名的方式,宏通常想谈论名称。

想象一下,你想编写自己的defstruct版本:像

这样的形式
(defstruct pos x y)

需要创建名称 - 符号 - 如pos-xmake-pospos-p等。所以你需要谈论符号的方法:从其他符号创建符号,创建只有你知道的秘密符号,以及与其他任何符号不同的秘密符号等等。

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