1

编辑:这不是减少或减少功能的问题。我遮蔽了这个clojure.core/range功能。

我有一个功能

(defn- roundfn [[xi ci bi oi :as state] r]
  (let [[xn cn bn] (newstate [xi ci bi] 0)
        exfn (word<-x xn)]
    [xn cn bn
     (into oi
           [(exfn [6 3 6 1])
            (exfn [4 1 4 7])
            (exfn [2 7 2 5])
            (exfn [0 5 0 3])])]))

其中 x1、x2 和 x4 本身就是向量。x3 是一个值。

当我减少这个功能时

(reduce roundfn [[][] 0 []] (range 3))

或者

(reduce roundfn [[][] 0 []] (vec (range 3)))

我正在接收 IndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:107)

当我减少这个功能时

(reduce roundfn [[][] 0 []] [0 1 2])

它按预期工作

4

2 回答 2

2

(使用此版本的源代码- 链接到问题评论中提到的文件的当前修订版。)

首先,在你列出的所有情况下,运行你的代码都会在我的 REPL 中产生异常,包括文字[0 1 2]情况。如果不是这样,那将是令人震惊的。(注意。我使用rabbit-round代替roundfn,因为这是问题文本中引用的函数的名称,可以在 GitHub 上的源代码中找到。)

问题的来源如下(基于对问题的评论中给出的完整来源的链接):

  1. roundfn问题文本中列出的函数rabbit-round在源代码中被调用。有问题的电话是(reduce rabbit-round [[] [] 0 []] [0 1 2]).

  2. 带有初始参数的reduce比调用;rabbit-round其中发生了调用roundfnroundfn在原始源代码中是一个单独的函数)(roundfn [[] [] 0] 0):. 正是在这里引发了异常。

  3. roundfn是两个函数的组合;第一个结果已经成为问题的根源:(update-counter-system [[] [] 0] 0)抛出。

  4. 那里有一个进一步的reduce调用,使用counter-system-round作为归约函数。首次应用后者时会引发异常:(counter-system-round [[] 0] 0).

  5. 看着counter-system-round我们看到它试图(nth c round)在第一行进行计算。此时,c绑定到[](一个空向量)并且round将是0。因此,此调用相当于(nth [] 0)并正确 throws IndexOutOfBoundsException

于 2013-06-10T22:19:47.687 回答
0

clojure.core\range我用我的[lower upper :as range]解构来隐藏函数

以下是无效的版本

(generate-keystream [_ {:keys [ss] :as initmap} [lower upper :as range]]
  (let [ns (conj ss [])]
    (reduce rabbit-round ns (range 3))))

以下按预期工作(注意更改为:as rng而不是:as range

(generate-keystream [_ {:keys [ss] :as initmap} [lower upper :as rng]]
  (let [ns (conj ss [])]
    (reduce rabbit-round ns (range 3))))

这解释了为什么(range 3)两者(vec (range 3))都不起作用,但[0 1 2]确实起作用了。前两个正在评估([0 0] 3)(vec ([0 0] 3))在我的原始代码中,而[0 1 2]正在评估[0 1 2]并成功。

学过的知识。不要隐藏函数

作为旁注,这也有效......

(generate-keystream [_ {:keys [ss] :as initmap} [lower upper :as range]]
  (let [ns (conj ss [])]
    (reduce rabbit-round ns (clojure.core/range 3))))
于 2013-06-10T22:29:14.130 回答