【发布时间】:2008-10-06 00:55:00
【问题描述】:
在理解(引用)之后,我很好奇如何导致语句执行。我的第一个想法是
(defvar x '(+ 2 21))
`(,@x)
但这只是评估为(+ 2 21),或x 的内容。如何运行放在列表中的代码?
【问题讨论】:
-
我想你问错问题了。你真的想做什么?
标签: lisp common-lisp
在理解(引用)之后,我很好奇如何导致语句执行。我的第一个想法是
(defvar x '(+ 2 21))
`(,@x)
但这只是评估为(+ 2 21),或x 的内容。如何运行放在列表中的代码?
【问题讨论】:
标签: lisp common-lisp
(eval '(+ 2 21))
【讨论】:
@克里斯蒂安·罗莫:
反引号示例:您可以使用 eval 和反引号来实现 apply,因为您可以将参数拼接到表单中。不会是世界上最高效的东西,但是:
(eval `(and ,@(loop for x from 1 upto 4 collect `(evenp ,x))))
等价于
(eval '(and (evenp 1) (evenp 2) (evenp 3) (evenp 4)))
顺便说一句,这与(更有效)具有相同的结果
(every 'evenp '(1 2 3 4))
希望能满足你的好奇心!
【讨论】:
在http://lisperati.com/ 上查看有趣的 Lisp 教程。有 Common Lisp 和 Emacs Lisp 的版本,它演示了 quasiquote 和宏的使用。
【讨论】: