CompilerException java.lang.IllegalArgumentException:键必须是整数,

时间:2013-01-11 05:01:20

标签: clojure

我一直有这个错误,但我似乎无法解决它。

(ns stack)


(def output [[1, 2 ,3]])
(def condensedrecords 0)
(def i 0)
(def currentDateTime 0)
(def timeDiffinSeconds 0)
(def secondLastOutputValue 0)
(def outlier [])
(def isOutlier false)
(def timeDiffinSeconds 20)
(def for1 true)
(def ab [1])

;just for testing 
(def a [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30])
(def b [a, a])


(def NoOfLines 3)
(defn getOutlierConfidence [p i]
  0.5)

 (defn processNewTransaction [p i] 1)
(defn exceedTimeThresholdwDistance [p i] false)

(defn doRunThroughSplit [vector]
(loop [i 1
       condensed 0
       output1 output
       outlier1 outlier] 

  (if (< i (- NoOfLines 1))  
    (let [p ((peek output1) 1)] ;function doesnt work 
      (cond 
        ;cond1
        (= ((vector i) 27) ((peek output1) 1)) (do(let [condensed (inc condensed)]
                                                      (println "in cond1")
                                                      (recur (inc i) condensed output1 outlier1)))
        ;cond2
        (> timeDiffinSeconds 480) (do (let [i (processNewTransaction p i)] (println "in cond2") (recur (inc i) condensed output1 outlier1)))

        ;cond3
        (> timeDiffinSeconds 600) (do (let [i (processNewTransaction p i)] (println "in cond3") (recur (inc i) condensed output1 outlier1)))

        ;cond4
        (exceedTimeThresholdwDistance p i) (do (let [i (processNewTransaction p i)] (println "in cond4") (recur (inc i) condensed output1 outlier1)))

        (and (not= ((peek output) 1) ((vector i) 27)) (not= secondLastOutputValue ((vector i) 27))) 
                       (do ;perform the following statements

                           (println "in cond5")
                           (let [secondLastOutputValue ((peek vector) 27)]                                                               
                            ***output1 (conj ([output1] ab))]*** ;error starts at here/// ab is a vector by commenting this line the error is removed
                             (println "reached")
                                 (recur (inc i) condensed output1 outlier1)))


        );cond ending 
    );let ending
[condensed, output1, outlier1]);if ending
);loop ending
);func ending

(def sa (doRunThroughSplit b))

该错误已被注释掉,这就是该行 output1(conj([output1] ab)) 但我似乎无法解决这个错误。大多数代码似乎都很好但是一旦它在cond5中遇到let语句就会出错。

输出为

在cond5中

///它在这里结束

2 个答案:

答案 0 :(得分:2)

似乎你正在从一些命令式语言(Java?)中翻译一些代码,因为有些东西在clojure中是完全冗余的。

首先,大多数第一个定义(开头的def个)根本不需要。您不必在clojure中以这种方式定义变量:所有变量都自动引入词法范围,并带有相应的结构(letloopdefn用于本地参数等。) ,def应该创建类似全局变量的东西。

接下来,您打算将这些结构用于做什么:((peek output1) 1)((vector i) 27)?它们完全没有意义。如果您想通过索引从集合中获取元素,则必须执行(get collection 123)甚至(collection 123)之类的操作,前提是collection是某些集合,例如矢量。

最后,你的问题。 (conj)函数实际上不应该被调用。 A piece from documentation

Usage: (conj coll x)
       (conj coll x & xs)

conj[oin]. Returns a new collection with the xs
'added'. (conj nil item) returns (item).  The 'addition' may
happen at different 'places' depending on the concrete type.

请参阅,它应该使用集合作为第一个参数调用,并且您希望作为所有其他参数插入到此集合中的元素。因此,如果您要将ab添加到output1集合,则应(conj output1 ab)

但请注意,修复conj不会使您的代码生效。代码中有更多错误(例如我在答案的第二点中提到的错误)需要修复。

答案 1 :(得分:1)

首先你有一个错字。 conj至少需要两个参数(conj collection elem1 ...)。但是只有一个参数([output1] ab)试图得到ab - [output1]向量的元素。所以ab必须是整数,但不是你的情况。