macros - 让出 Lambda : symbolic representation in macros

标签 macros lisp metaprogramming

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

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

最佳答案

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

例如,当您执行 (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 个符号。

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

关于macros - 让出 Lambda : symbolic representation in macros,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36160499/

相关文章:

c - 类型定义,#define

emacs - 在 emacs-lisp 中,如何将点定位在文本字符串的中间?

c++ - 在代码中修改预处理器宏是一种好的风格吗?

c++ - 如何将多参数模板传递给宏?

c++ - HAVE_* 宏的目的是什么?

Haskell、Lisp 和冗长

lisp - 如何获取所有内置函数的列表?

javascript - 拦截 JavaScript 数组访问器

Ruby 捕获 NoMethodError 并从发生异常的地方继续执行

C++ 部分特化不适用于不同大小的特征矩阵