我编写了这个Lisp程序:
(eval-when (:load-toplevel)
(princ "Hello!"))但是,当我加载程序时,eval-when的主体不运行。
$ sbcl
* (load "hello.lisp")
T
*这是怎么回事?在eval-when中,我使用:load-toplevel指定在加载文件时应该运行它的主体。当我加载文件时,(princ "Hello!")没有运行,我感到很惊讶。
发布于 2022-04-15 21:33:10
来自CLHS
当
:compile-toplevel(或compile)和:load-toplevel(或load)在由compile-file处理的代码中以顶级形式出现时,eval-when的使用控制着计算是否以及何时发生。
由于您没有加载已编译的文件,所以:load-toplevel情况不适用。在加载源时使用:execute执行代码。
发布于 2022-04-16 15:41:18
请参考用户"Barmar“的答案,以获得HyperSpec参考。
当使用compile-file编译文件时,:load-toplevel指示编译器安排在编译程序被load编辑时运行eval-when主体。
因此,要运行OP示例中的eval-when主体,首先编译文件,然后加载生成的fasl文件:
$ sbcl
* (compile-file "hello.lisp")
; compiling file "/home/user/programs/hello.lisp" (written 16 APR 2022 12:34:56 PM):
; wrote /home/user/programs/hello.fasl
; compilation finished in 0:00:00.003
#P"/home/user/programs/hello.fasl"
NIL
NIL
* (load "hello.fasl")
Hello!
T
* https://stackoverflow.com/questions/71889093
复制相似问题