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]

Defines: (seed)

Assembled in LP初始化依赖的装配计划

(define seed 3)

program. LP初始化示例的依赖值[lp-answer]

Defines: (answer)

Assembled in LP初始化依赖的装配计划

Initial requires: seed

(define answer (+ seed 1))

module. LP初始化依赖的装配计划[lp-initialization]

Checks: LP显式初始化依赖的结果为4

Exports: (answer)

Initialization order: 片段按下列清单建立;函数体依赖可以相互引用。

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)