LP依赖声明与初始化错误[#66]
Requires描述函数运行等阶段需要的名称;Initial requires描述整个片段开始建立时已经需要的名称。例如保存初始值的片段必须排在使用这个值的初始化片段之前:
(code-fragment "seed" "初始值" (define seed 3)) (code-fragment "answer" "初始化时读取初始值" #:initial-requires (seed) (define answer (+ seed 1)))
顺序写反时,诊断包含计划、片段、缺少的名称与来源位置。重复定义会指出两个提供者及其来源;导入与本地定义重名、项目内名称未导出也会被拒绝。Initial requires是作者声明的片段级屏障,不是自动分析器:同一片段内部的初始化顺序、未声明依赖和运行时异常仍由执行核验发现。
以下实际片段展示Initial requires如何链接到提供者;正确顺序的实例得到4:
program. LP初始化示例的初始值[lp-seed]
program. LP初始化示例的依赖值[lp-answer]
module. LP初始化依赖的装配计划[lp-initialization]
example. LP显式初始化依赖的结果为4[lp-initialization-result]
(instance-binding (instantiate-program initialization-plan) 'answer)⇒ 4 · checked
错误顺序只构造计划就会被拒绝,不需要等到运行。这里捕获诊断以便阅读;普通构建中不捕获这个异常时,构建会失败:
misc-error: (#f "~A ~S ~S ~S ~S" ("Initialization dependency must precede fragment" "lp-reversed" "lp-answer" seed ((file . "/home/jinser/vie/writing/flora/plants/lp-000A.plant") (line . 83) (column . 6) (end-line . 83) (end-column . 32) (start-offset . 3916) (end-offset . 3942))) #f)