累计器实例的创建与状态结果[#31]

instantiate-program在新的宿主命名空间中按计划执行定义。每次调用都表示创建独立实例;instance-binding只开放声明的入口:

@(define first-instance (instantiate-program accumulator))
@(define second-instance (instantiate-program accumulator))
@(define add-first (instance-binding first-instance 'accumulate))
@(define add-second (instance-binding second-instance 'accumulate))

example. 累计器两个实例的结果为 (2 5 10)[lp-accumulator-test]

(let ((first (add-first 2)))
      (let ((next (add-first 3)))
        (list first next (add-second 10))))

⇒ (2 5 10) · checked

2和5来自同一个实例的两次调用;10来自另一个total从0开始的实例。checked-example使用equal?核验这个列表,表达式中的let明确调用顺序。阅读或嵌入结果tree不会再次增加总量。