我希望下面的代码交换变量,但我得到了未定义的错误
(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)))