我一直有这个错误,但我似乎无法解决它。
(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中///它在这里结束
答案 0 :(得分:2)
似乎你正在从一些命令式语言(Java?)中翻译一些代码,因为有些东西在clojure中是完全冗余的。
首先,大多数第一个定义(开头的def
个)根本不需要。您不必在clojure中以这种方式定义变量:所有变量都自动引入词法范围,并带有相应的结构(let
,loop
,defn
用于本地参数等。) ,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
必须是整数,但不是你的情况。