-1

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

(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 ///这里结束

4

2 回答 2

2

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

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

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

最后,你的问题。(conj)函数真的不应该这样调用。来自文档的一段

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.

看,它应该用一个集合作为第一个参数来调用,你希望插入到这个集合中的元素作为所有其他参数。所以,如果你想添加aboutput1集合中,你应该做(conj output1 ab).

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

于 2013-01-11T08:49:48.543 回答
1

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

于 2013-01-11T05:21:35.927 回答