0

私は動作する単純な関数を持っています:

(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

私の考えでは、そのfuncall場で を評価してから戻り値を に渡すのではなくifelse、全体funcallが評価されずに に渡されますifelse-しかし、引用された形式は関数内でどのように扱われますか? それは本質的にその場でコピーされ、真の Lisp フォームとして扱われるのではないでしょうか?

4

2 に答える 2

0

example では、リストを引数として渡します (引用符のため)。eval を使用して、引用符で囲まれたリストを評価して「失敗」する必要があります。このような

(ifelse  (eval '(funcall (lambda () nil))))

または引用符を削除する

(ifelse  (funcall (lambda () nil)))
于 2013-11-01T07:08:18.747 に答える