代码之家  ›  专栏  ›  技术社区  ›  lightning_missile

词法范围和共享对象

  •  1
  • lightning_missile  · 技术社区  · 6 年前

    考虑SICP中的记账程序。

    (define (make-account balance)
      (define (withdraw amount)
        (if (>= balance amount)
            (begin
              (set! balance (- balance amount))
              balance)
            "Insufficient funds"))
      (define (deposit amount)
        (set! balance (+ balance amount))
        balance)
      (define (dispatch m)
        (cond ((eq? m 'withdraw) withdraw)
              ((eq? m 'deposit) deposit)
              (else (error "Unknown request: MAKE-ACCOUNT" m))))
      dispatch)
    

    例如:

    (define peter-acc (make-account 100))
    (define paul-acc peter-acc)
    

    脚注:

    单个计算对象被更多用户访问的现象 多个名称称为别名。联合银行账户情况 演示了一个非常简单的别名示例。

    。。。

    Bugs可以 如果我们忘记了对象的更改可能会 另外,作为一种副作用,更改不同的对象,因为 –different–objects实际上是出现在下面的单个对象 不同的别名。这些所谓的副作用bug太难了 定位并分析一些人提出的 编程语言的设计应确保 效果或锯齿

    。。。“”

    在正常情况下,这里的人会说:“保罗·阿克指的是彼得·阿克”。

    据我所知,彼得·阿克和保罗·阿克实际上是指向一个计算对象的名字。所以他们是一样的。

    我对如何在评估的环境模型中建模感到困惑。例如:

    (define (f bank-account) ((bank-account 'deposit) 69))
    
    (define peter-acc (make-account 100))
    (define paul-acc peter-acc)
    (f paul-acc)
    

    我无法绘制环境图,因为我的眼睛被破坏了。我认为互动应该是这样的:

    • 使account和f具有指向全局环境的指针。
    • (定义peter acc(使帐户100))进行评估。make account创建新环境e1。封闭环境是全局的。创建了内部取款、存款和派送程序,并具有指向e1的指针。将返回Dispatch,并在全局环境中绑定到名称peter acc。
    • (定义paul acc peter acc)进行评估。peter acc的名字出现在全局框架中。paul acc绑定到e1中的dispatch procedure对象,因为peter acc指向该对象。因此,e1中的Dispatch与全球环境中的peter acc和paul acc的名称绑定。
    • (f paul acc)进行评估。新环境e2由f创建。封闭环境是全局的。paul acc位于global。在e2中,banck帐户绑定到e1中的dispatch procedure对象,因为paul acc指向该对象。因此,全球环境方面的peter acc、全球环境方面的paul acc和e2方面的bank acount都指向e1中的调度程序。
    • 身体被执行。

    这些都对吗?

    让我困惑的是,当我在SICP练习中遇到这样的事情时,在构建环境图时,我在网上看到人们说“银行账户指的是paul-acc。paul-acc指的是peter-acc。”为什么这里使用“reference”这个词?关于e2的银行账户是否实际指向paul acc而不是其值?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Will Ness Derri Leahy    6 年前

    你的第2点到第5点是正确的。在你的观点1中, f make-account 不要“拥有”指向全局环境的指针——它们本身不需要。它们都是条目、绑定、, 在里面 全球环境。这两个“引用”或“指向”简单值在这两种情况下都起作用。

    bank-account 关于 e2 实际上指向 价值 其中 paul-acc 点(与 peter-acc 点或引用)。在方案中, (define n1 n2) 表示“在当前环境中设置新绑定,名为 n1 ,并指向表达式的值 n2 “。如果 氮气 恰好是一个变量,它的值就是该变量的值 .这就是为什么我们要讨论Scheme的 评价 语义。

    函数调用 (fun arg) 通过查找 价值 属于 arg 表示 ,将函数的参数绑定到此 价值 ,然后在生成的环境中评估函数的主体:

    ( (lambda (param) body) arg )
    =
    (let ( (param arg) )
       body)