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個贊
添加回答
舉報