使用 Letrec 交换变量
Using Letrec to swap variables
我希望下面的代码可以交换变量,但我得到了未定义的错误
(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
绑定的初始化表达式仅引用 outer scope.
请注意,这不会交换任何内容,它只是在新范围内使用相同的名称。
完全一样
(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)))
我希望下面的代码可以交换变量,但我得到了未定义的错误
(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
绑定的初始化表达式仅引用 outer scope.
请注意,这不会交换任何内容,它只是在新范围内使用相同的名称。
完全一样
(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)))