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

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

  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.
 

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值