Gödel, Escher, Elisp:宏的奇妙之美
Gödel, Escher, Elisp: The Beauty of Macros

作为 Emacs 用户,你是否注意到在 Emacs Lisp 中,代码即数据?这种同像性(homoiconic)让程序与数据之间没有隔阂,而宏正是利用这一特性的利器。宏在编译期将代码转换为新代码,让你能像构建语言一样扩展 Emacs Lisp 的表达力。从 `when`、`unless` 到 `defun`,甚至 `use-package`,它们都是宏的杰作。本文将带你穿越 Hofstadter 的怪圈与 Escher 的版画,揭示宏如何模糊程序与数据的边界,让你真正理解“代码即数据”的深层含义。
在 Emacs Lisp 中,程序与数据是同一枚莫比乌斯带的两面。
- meken
为了提前回答一个常见问题:为什么 my-unless 不能是一个函数?因为函数参数是急切求值的,在函数看到它们之前就已经被求值了。
挺有意思,所以如果你用的是惰性求值语言,这里就不需要宏,可以直接把 my-unless 写成函数。
- kimi
记住 Lisp 宏的黄金法则:别写宏。
- KeenanKeenan
如果宏能实现任意的语言特性,那为什么 elisp 从来没构建过类型系统?