我希望下面的代码可以交换变量,但是我得到了未定义的错误
(let ([me "Tarzan"]
[you "Jane"])
(letrec ([you me]
[me you]
)
(list me you)))发布于 2022-03-26 02:52:26
您只需在这里使用let:
(let ([me "Tarzan"] ; <-------.
[you "Jane"]) ; <-------|---.
(let ([you me] ; me: ----^ |
[me you]) ; you: -------^
(list me you)))
;; '("Jane" "Tarzan")实际上,您应该在这里使用let,因为letrec绑定相互引用,导致一个变量必须知道另一个变量的值要初始化时的恶性循环,而另一个变量的值指的是第一个变量,无限的。
但是let绑定的初始化表达式仅指外部作用域。
发布于 2022-03-26 07:10:26
注意,这没有交换任何东西,它只是在一个新的作用域中使用相同的名称。
它和
(let ([me "Tarzan"]
[you "Jane"])
(letrec ([a b]
[b a])
(list b a)))这使得问题变得明显;letrec中的绑定以一个永不结束的递归方式相互引用。
如果你用let,
(let ([me "Tarzan"]
[you "Jane"])
(let ([you me]
[me you])
(list me you)))它可以工作,但它仍然没有真正交换任何与上面相同的原因--这相当于
(let ([me "Tarzan"]
[you "Jane"])
(let ([a me]
[b you])
(list b a)))https://stackoverflow.com/questions/71618057
复制相似问题