5

このコードが機能しないのはなぜですか?

(setf x '(foo bar (baz)))

(labels 
    ((baz () (print "baz here"))) 
    (baz) ;works
    (eval (third x))) ;fails with the below message

*** - EVAL: undefined function BAZ

GNU CLISP を使用しています。

4

2 に答える 2

3

Common Lisp ではeval、null 字句環境でその引数を評価するため、字句的にバインドされた関数bazが見つかりません。

Common Lisp 標準はレキシカル環境にアクセスして eval を呼び出すための移植可能な方法を提供していませんが、実装にはこの機能があるかもしれません。たとえば、CLISP では次のようになります。

cs-user> (setf x '(foo bar (baz)))

(foo bar (baz))
cs-user> (labels ((baz () (print "baz here"))) 
           (eval-env (third x) (the-environment)))

"baz here" 
"baz here"
cs-user> 

他のアプローチについては、geocar の回答を参照してください。

于 2013-06-23T19:41:13.640 に答える