使用trampoline和Y组合器的代码是否可以在具有动态范围的lisp中工作?


布偶的表弟派大星丶
2025-02-07 05:31:40 (11天前)
  1. 我有javascriptlisp,类似于scheme。它可以与词法和动态范围一起使用。我不确定动态范围是如何工作的,它似乎没问题但是这个代码在范围是......时不起作用

2 条回复
  1. 0# 子阳 | 2019-08-31 10-32



    不。蹦床和Y组合器可以使用闭合装置。



    动态范围没有闭包,因此引用自由变量的过程/函数意味着程序的调用堆栈中具有该名称的任何变量。



    在词法范围中,它是创建lambda时捕获的变量。因此代码:




    1. (define test 10)

    2. (define (make-adder test)
      (lambda (v) (+ test v)))

    3. (define add20 (make-adder 20))

    4. (add20 5)
      ; ==> 25 in lexical scope
      ; ==> 15 in dynamic scope

    5. </code>


    共鸣很简单。函数返回的函数

    make-adder

    存储价值

    20



    test

    ,在动态范围内

    test

    是最接近的是什么,所以它是局部变量

    10

    。同时致电:




    1. (let ((test 30))
      (add20 5))
      ; ==> 25 in lexical scope
      ; ==> 35 in dynamic scope

    2. </code>


    现在Common Lisp具有动态范围和词法范围。动态范围的变量是在顶级定义的变量

    defvar



    defparameter

    或宣布特别。这很容易出错,我们对这些变量使用了特殊的命名

    earmuffs




    Scheme具有可变对象的参数,并且存在用于更新和恢复它的语法,以便它将充当动态变量。




    编辑
    </强>



    我已经测试了你的词法和动态lisp,两者似乎都按预期工作。


登录 后才能参与评论