阅读 Doug Hoyte 的书“Let Over Lambda”,我发现了以下#.
符号描述,也就是 read-macro:
COMMON LISP 内置的基本读取宏是#。读取时评估宏。这个读取宏允许您将对象嵌入到您读取的无法序列化但可以使用一些 lisp 代码创建的表单中。
它来自第 4 章,本书的大部分内容可以在这里找到:http: //letoverlambda.com/index.cl/toc
这是书中的一个例子,它展示了相同的表达方式每次都可能以不同的方式阅读:
* '(football-game
(game-started-at
#.(get-internal-real-time))
(coin-flip
#.(if (zerop (random 2)) 'heads 'tails)))
(FOOTBALL-GAME
(GAME-STARTED-AT 187)
(COIN-FLIP HEADS))
* '(football-game
(game-started-at
#.(get-internal-real-time))
(coin-flip
#.(if (zerop (random 2)) 'heads 'tails)))
(FOOTBALL-GAME
(GAME-STARTED-AT 309)
(COIN-FLIP TAILS))
接下来,作者演示了一些核心技巧,使用#
宏创建变体。
所以,原来它#'
也是某种阅读宏,它通常用在表示函数名称的符号之前。但有必要吗?他在那里的工作到底是什么?
#'
我可以为带有或不带有它的高阶函数放置符号:
CL-USER> (defun test nil t)
TEST
CL-USER> (funcall #'test)
T
CL-USER> (funcall 'test)
T
以同样的成功。