lisp - 读取时评估宏与准引用

标签 lisp common-lisp

简而言之,有什么区别?

(setq var1 `(,(get-internal-real-time)))
var1
-->(1358995178904535)
var1
-->(1358995178904535)

(setq var2 '(#.(get-internal-real-time)))
var2
-->(1358995195568422)
var2
-->(1358995195568422)

我认为也许“读取时评估”意味着它会在我每次读取变量时进行评估,但我想我错了,quasiquote eval 也不会这样做。

最佳答案

差异很重要的示例:

* (defun foo () `(,(get-internal-real-time)))
FOO
* (defun bar () '(#.(get-internal-real-time)))
BAR
* (foo)
(44577)
* (foo)
(47651)
* (bar)
(41929)
* (bar)
(41929)

如您所见,当您不直接使用该值时(如在 (setq var1 ...) 情况下),每次都会扩展准引号,返回不同的值.然而,对于读取时评估,它只被调用一次,一次又一次地返回相同的值。

关于lisp - 读取时评估宏与准引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14493175/

相关文章:

common-lisp - 基于宏创建日志记录抽象

lisp - 与密码作斗争

macos - 在 Mac OS X 上从源代码编译 SBCL

lambda - 为什么在 lambda 中使用#'?

cocoa - ccl 和 *.nib 文件

macros - 如何在 lisp 中编写 'destructive' dolist 宏

lisp - 如何在 AutoLisp 中访问带引号的变量数据?

list - 在 Lisp 中,如何将给定元素添加到给定列表中的每个列表中?

file-io - 用 Common Lisp 就地替换文件中的正则表达式

programming-languages - 任何人都可以向我解释 Autolisp/visual lisp 背后的设计决策吗?