3 回答
TA贡献1868条经验 获得超4个赞
EVAL
.
初学者的主要原因是:你不需要它。
(let ((ops '(+ *))) (dolist (op ops) (print (eval (list op 1 2 3)))))
(let ((ops '(+ *))) (dolist (op ops) (print (funcall op 1 2 3))))
EVAL
EVAL
EVAL
EVAL
FUNCALL
, REDUCE
APPLY
FUNCALL
-调用带有参数的函数: (funcall '+ 1 2 3)
REDUCE
-调用值列表上的函数,并将结果合并: (reduce '+ '(1 2 3))
APPLY
-调用以列表作为参数的函数: (apply '+ '(1 2 3))
.
EVAL
您希望确保编译了您的代码,因为编译器可以检查代码中的许多问题,并生成更快的代码,有时(即因子1000;-)更快。 构建并需要评估的代码不能尽早编译。 任意用户输入的Eval存在安全问题。 评估的一些用途 EVAL
可能在错误的时间发生并造成构建问题。
(defmacro foo (a b) (list (if (eql a 3) 'sin 'cos) b))
SIN
COS
.
(foo 3 4)
(sin 4)
(foo 1 4)
(cos 4)
.
(foo (+ 2 1) 4)
FOO
(defmacro foo (a b) (list (if (eql (eval a) 3) 'sin 'cos) b))(foo (+ 2 1) 4)
(defun bar (a b) (foo a b))
EVAL
:
TA贡献1943条经验 获得超7个赞
eval
goto
和朋友 基于锁的线程 延续 宏(高元或其他) 指针 可重新启动的例外 自修改码 .还有成千上万的演员
“我为什么要用 eval
“因为福”为什么有必要“因为.”
TA贡献1788条经验 获得超4个赞
添加回答
举报