Aprial 29th Sunday (四月 二十九日 日曜日)

本文详细介绍了Scheme语言中模块的执行时机及其内部工作原理。当一个模块被声明时,其主体部分会被语法扩展并编译,但并不会立即执行。模块只有在通过require或require-for-syntax表达式在顶层调用或通过dynamic-require函数调用时才会被执行。此外,文章还解释了模块之间的导入关系如何影响执行顺序,并强调每个模块在响应调用时最多只执行一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  When a scheme module can be executed?  When a module declaration is evaluated, the module's body is syntax-expanded and complied, but not executed.  The body is executed only when the module is explicitly invoked, via a "require" or "require-for-syntax" expression at the top level, or a call to "dynamic-require".

  Here, in actual fact, a scheme interpretor make a module according to the text entering by you at this phrase.  When you "require" a module, the scheme interpretor just import the actual content (because of macro) into another module or top-level environment.

  When a module is invoked, its body definitions and expressions are evaluated.  First, however, the definitions and expressions are evaluated for each module imported (via require) by the invoked module.  The import-initialization rule applies up the chain of modules, so that every module used (directly or indirectly) by the invoked module is executed before any module that uses its exports.  A module can only import from previously declared modules, so the module-import relationship is acyclic.

  Every module is executed at most once in reponse to an invocation, regardless of the number of times that it is imported
into other modules.

  Note:  The template of an exported macro may refer to an identifier definded in the module or imported into the module;
uses of the macro in other modules expand to references of the identifier defined to imported at the macro-definition site,
as opposed to the use site.  Uses of a macro in a module must not expand to a "set!" assignment of an identifier from
any other module, including the module that defines the macro.

(module a mzscheme
  (provide xm)
  (define y 2)
  (define-syntax xm  ;a macro that expands to y
    (syntax-rules ()
      [(xm) y])))

(module b mzscheme
  (require a)
   (printf "~a~n" (xm)))

(require b) ;=> prints2

  If a module is invoked before it is re-declared, each re-declaration of the module is immediately invoked.
The immediate invocation is necessary to keep the module-specific namespace consistent with the module
declaration.

When a modulere-declaration implies invocation, the invocation can fail at the definition of a binding
that was constant in the original module (where any definition without a "set!" within the module counts as
a constant definition);  preventing re-definition protects potential optimizations (for the original
declaration) that rely on constant bindings.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值