使用Letrec交换变量



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

(let ([me "Tarzan"]
[you "Jane"])
(letrec ([you me]
[me you]
)
(list me you)))

您可以在此处使用let

(let ([me "Tarzan"]  ; <-------.
[you "Jane"])  ; <-------|---.
(let ([you me]     ; me: ----^   |
[me you])    ; you: -------^
(list me you)))
;; '("Jane" "Tarzan")

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

但是let绑定的初始化表达式只是引用外部范围

请注意,这不会交换任何内容,只是在新的作用域中使用相同的名称。

它与完全相同

(let ([me "Tarzan"] 
[you "Jane"]) 
(letrec ([a b] 
[b a]) 
(list b a)))

这使得问题显而易见;CCD_ 5中的绑定以永不结束的递归方式相互引用。

如果使用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)))

最新更新