代码之家  ›  专栏  ›  技术社区  ›  J. Mini

是否将非函数重新指定为具有集合的函数!创建一个新的框架?

  •  0
  • J. Mini  · 技术社区  · 2 年前

    下面的代码让我很困惑:

    (define (even-or-odd-letrec x)
      ((lambda (internal-even? internal-odd?)
         (set! internal-even? (lambda (n)
                    (if (= n 0) 'even
                        (internal-odd? (- n 1)))))
         (set! internal-odd? (lambda (n)
                   (if (= n 0) 'odd
                       (internal-even? (- n 1)))))
         (internal-even? x))
       #f #f))
    

    正如我所读到的,环境如下:

    1. even-or-odd-letrec , internal-even? internal-odd? 一开始一定要 #f .他们的母环境是全球环境。
    2. set! 然后将这两个值更改为显而易见的值 lambda s、 但不会改变环境。
    3. 因为环境没有改变,所以有人打电话给 内部平衡? 将在全球环境中寻找 内部奇怪? 什么也找不到。

    那么这个代码是如何工作的呢?

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

    回答问题的标题:不,设置不会创建任何新帧。

    设置设置当前环境框架中绑定的值。不管新旧价值观是什么。功能与否没有区别。

    再一次 set! 不会更改值。它改变了 绑定 价值观绑定是名称及其值的配对。 Set! ting更改该名称的绑定值。

    被重新命名后被视为命名指针- 设置 ,一个名称指向一个新值--提供给 设置 作为第二个论点。

    所以和你说的相反, 设置 改变 当前的环境框架——它改变了它对给定名称的绑定。

      +---------------+                  +---------------+
      |  n1 ---> v1   |                  |  n1 ---> x    |
      |  n2 ---> v2   |   (set! n1 x)    |  n2 ---> v2   | 
      |---------------|  ------------->  |---------------| 
      |  ..code...    |                  |  ..code...    |
      |_______________|                  |_______________|
    

    “有人打电话给我吗?” internal-even? 威尔“……住手!这不是正确的看法。

    有没有提到 内部平衡? 里面 lambda -创建的框架将通过查找名称下的值来解析 内部平衡? 在同样的框架下,一切都会顺利进行。

        2
  •  0
  •   ignis volens    2 年前

    (lambda (internal-even? internal-odd?) ...) 创建一个带有绑定的新环境 internal-even? internal-odd? .在那种环境中,指 内部平衡? 内部奇怪? 将引用这些绑定的当前值。 set! 变异 通过改变绑定的值,使这些绑定的当前值现在成为两个过程,它们本身引用这些绑定的当前值,从而改变环境。


    到目前为止,我认为理解这一点最简单的方法是实现一个小的解释器。做到这一点非常容易:在环境中使用alists,evaluator几乎需要处理 if lambda 设置 作为特例。每个人都应该写一个。