gpt4 book ai didi

clojure - 解构:这怎么行得通?

转载 作者:行者123 更新时间:2023-12-01 23:57:57 28 4
gpt4 key购买 nike

作为对 SO 问题的回答,我构建了一个循环函数,并构建了我迄今为止最复杂的解构,这奇迹般地起作用了:

(defn fib?
[a b & [c & r]]
(if (= c (+ a b))
(if r
(recur b c r)
true)
false))

(fib? 0 1 1)
=> true

(fib? 2 3 5 8 13)
=> true

但我不知道它为什么会起作用。 recur 中使用的 r 是一个集合,它会使原始函数失败。

(fib? 2 3 [5 8 13])
=> false

我想在那里使用 apply recur 之类的东西,但是由于 recur 是一种特殊形式,所以这是不可能的。所以我尝试没有它并且它有效。 recur 是否具有神奇的自动应用属性,或者是否有其他我没有看到的东西。

最佳答案

答案分为两部分:

  1. 可变函数的“rest”参数成为任何 recur 形式的最后一个参数,它会递归到函数的顶部。在这一点上,它不再有任何特殊之处。您通常会希望确保传递到该位置的任何值实际上是连续的,但即使这样也没有强制执行。1

  2. 解构只是 fnlet 宏提供的语法糖。在其参数向量中使用解构的 fn 形式的脱糖版本采用一定数量的常规参数,然后在包裹整个主体的 let 形式中解构它们。因此,如果您返回到在其参数向量中使用解构的函数的顶部,新值将在下一次迭代中被解构。


1 例如,((fn [& xs] (if (seq? xs) (recur (first xs)) xs)) 1 2 3) 返回1

关于clojure - 解构:这怎么行得通?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751204/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com