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