我有一個簡單的函數,工作原理:爲什麼沒有這個引號形式評估預期
(defun ifelse (the-test)
(cond (the-test (format t "passed test, true!"))
(t (format t "failed test, boo hoo"))))
如果我這樣做,我得到你所期望:
(ifelse (funcall (lambda() nil)))
failed test, boo hoo
NIL
我很好奇,爲什麼這不也是導致「失敗」:
CL-USER> (ifelse '(funcall (lambda() nil)))
passed test, true!
NIL
我的想法是,而不是在PL評估funcall
ace,然後將返回值傳遞到ifelse
,整個funcall
被傳遞到ifelse
未被評估 - 但是,函數中如何處理引用的表單?難道它本質上不會被複制,然後被視爲真正的Lisp形式嗎?
我建議不要在這裏使用'eval'。首先,你不需要它:爲什麼你想要通過一個列表,並期望它被評估?這很愚蠢。內置的'if'不能這樣工作。你打開自己的東西,如不能訪問代碼中其他地方定義的變量。引用列表不是虛假的原因不是「因爲你需要評估」;原因是「因爲你通過了一個列表,列表是真的」。 – zck