-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で完全に冗長なものがあるためです。

まず第一に、最初の定義のほとんど(最初はdefsの数)はまったく必要ありません。clojureでこのように変数を定義する必要はありません。すべての変数は、対応する構造(、、、ローカルパラメーターなど)を使用してレキシカルスコープに自動的に導入され、グローバルlet変数のようなものを作成することになっています。loopdefndef

次に、これらの構造で何をするつもりですか:((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.

参照してください。最初の引数としてコレクションを使用し、他のすべての引数としてこのコレクションに挿入する要素を使用して呼び出す必要があります。したがって、コレクションに追加abする場合は、を実行する必要があります。output1(conj output1 ab)

ただし、修正conjしてもコードは機能しないことに注意してください。コードにはさらに多くの間違いがあり(たとえば、私の答えの2番目のポイントで言及したもの)、修正する必要があります。

于 2013-01-11T08:49:48.543 に答える
1

まず第一に、タイプミスがあります。conj少なくとも2つの引数を取ります(conj collection elem1 ...)。しかし、ベクトルの-番目の要素([output1] ab)を取得しようとする引数は1つだけです。したがって、整数である必要がありますが、あなたの場合はそうではありません。ab[output1]ab

于 2013-01-11T05:21:35.927 に答える