このコードが機能しないのはなぜですか?
(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 を使用しています。
このコードが機能しないのはなぜですか?
(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 を使用しています。
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 の回答を参照してください。