首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在加载文件时EVAL- with with : LOAD -TOPLEVEL不运行主体?

为什么在加载文件时EVAL- with with : LOAD -TOPLEVEL不运行主体?
EN

Stack Overflow用户
提问于 2022-04-15 21:26:08
回答 2查看 82关注 0票数 1

我编写了这个Lisp程序:

代码语言:javascript
复制
(eval-when (:load-toplevel)
  (princ "Hello!"))

但是,当我加载程序时,eval-when的主体不运行。

代码语言:javascript
复制
$ sbcl
* (load "hello.lisp")
T
*

这是怎么回事?在eval-when中,我使用:load-toplevel指定在加载文件时应该运行它的主体。当我加载文件时,(princ "Hello!")没有运行,我感到很惊讶。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-15 21:33:10

来自CLHS

:compile-toplevel (或compile)和:load-toplevel (或load)在由compile-file处理的代码中以顶级形式出现时,eval-when的使用控制着计算是否以及何时发生。

由于您没有加载已编译的文件,所以:load-toplevel情况不适用。在加载源时使用:execute执行代码。

票数 3
EN

Stack Overflow用户

发布于 2022-04-16 15:41:18

请参考用户"Barmar“的答案,以获得HyperSpec参考。

当使用compile-file编译文件时,:load-toplevel指示编译器安排在编译程序被load编辑时运行eval-when主体。

因此,要运行OP示例中的eval-when主体,首先编译文件,然后加载生成的fasl文件:

代码语言:javascript
复制
$ 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
* 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71889093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档