首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Letrec交换变量

使用Letrec交换变量
EN

Stack Overflow用户
提问于 2022-03-25 13:52:25
回答 2查看 63关注 0票数 0

我希望下面的代码可以交换变量,但是我得到了未定义的错误

代码语言:javascript
复制
(let ([me "Tarzan"]
      [you "Jane"])
    (letrec ([you me]
             [me you]
             )
      (list me you)))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-26 02:52:26

您只需在这里使用let

代码语言:javascript
复制
(let ([me "Tarzan"]  ; <-------.
      [you "Jane"])  ; <-------|---.
  (let ([you me]     ; me: ----^   |
        [me you])    ; you: -------^
    (list me you)))
;; '("Jane" "Tarzan")

实际上,您应该在这里使用let,因为letrec绑定相互引用,导致一个变量必须知道另一个变量的值要初始化时的恶性循环,而另一个变量的值指的是第一个变量,无限的。

但是let绑定的初始化表达式仅指外部作用域。

票数 4
EN

Stack Overflow用户

发布于 2022-03-26 07:10:26

注意,这没有交换任何东西,它只是在一个新的作用域中使用相同的名称。

它和

代码语言:javascript
复制
(let ([me "Tarzan"] 
      [you "Jane"]) 
     (letrec ([a b] 
              [b a]) 
         (list b a)))

这使得问题变得明显;letrec中的绑定以一个永不结束的递归方式相互引用。

如果你用let

代码语言:javascript
复制
(let ([me "Tarzan"]
      [you "Jane"])
    (let ([you me]
          [me you])
      (list me you)))

它可以工作,但它仍然没有真正交换任何与上面相同的原因--这相当于

代码语言:javascript
复制
(let ([me "Tarzan"]
      [you "Jane"])
    (let ([a me]
          [b you])
      (list b a)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71618057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档