代码之家  ›  专栏  ›  技术社区  ›  NielsK

破坏:这怎么可能奏效?

  •  3
  • NielsK  · 技术社区  · 11 年前

    作为对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
    

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

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

    我想用一些类似的东西 apply recur 但从那时起 重现 是一种特殊的形式,这是不可能的。所以我试着不使用它,它奏效了。做 重现 有神奇的自动应用财产,或者还有其他我没有看到的东西。

    1 回复  |  直到 11 年前
        1
  •  3
  •   Michał Marczyk    11 年前

    答案分为两部分:

    1. 变分函数的“rest”参数成为任何 recur 重复到函数顶部的窗体。在这一点上,它在任何方面都不再特别。您通常希望确保在该位置传递的任何值实际上都是连续的,但即使这样也不会强制执行。 1.

    2. 解构只是由 fn let 宏。一个 fn 在参数向量中使用析构函数的表单接受一定数量的正则参数,然后在 允许 形状包裹整个身体。因此,如果您重复到在其参数向量中使用析构函数的函数的顶部,新值将在下一次迭代中被析构函数。


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