0

我試圖編寫一個函數來處理一行字符串,通過調用str \ split,函數如果我直接在LEIN REPL窗口中調用它,但會在嘗試從LEIN RUN運行該程序時遇到上述調用錯誤時正常工作。 有什麼建議嗎?Clojure clojure.string/split命中java.lang.ClassCastException:clojure.lang.LazySeq不能轉換爲java.lang.CharSequence

(let [num-letters (count (apply str line)) 
     num-spaces-needed (- column-length num-letters) 
     num-words (count (clojure.string/split line #"\s")) 
     num-space-in-group (if (= 1 num-words) num-spaces-needed (/ num-spaces-needed (- num-words 1))) 
     group-of-spaces (repeat num-space-in-group " ") 
     padding (create-list-spaces num-spaces-needed (dec (count line)))] 
    ( clojure.string/join "" (if (empty? padding) (cons line group-of-spaces) 
       (cons (first line) (interleave (rest line) padding))))) 
+0

你能否準確地顯示你是如何調用這段代碼的,都是用'lein repl'和'lein run'? –

回答

1

我想你傳遞line作爲參數傳遞給你的函數,雖然它從您的代碼段省略。

當從這兩個不同的入口點調用函數時,應檢查line參數的差異。首先,爲方便起見,我們將其命名爲tokenize。現在,在Leiningen香草app模板創建一個-main,看起來與此類似,之後我加入tokenize電話:

(defn -main 
    [& args] 
    (tokenize args)) 

的參數被解構,其餘的運營商&,它建立的參數的序列args)。因此,在lein run I want this to work!上運行時,最終會調用帶有序列的tokenize函數。 clojure.string/split不能應用於一個序列,並且你得到一個堆棧跟蹤。

但是,當您從lein repl調用函數時,自然的方法是使用類似(tokenize "Iä! Iä! Cthulhu fhtang!")的拼寫。這將起作用,因爲你的調用參數現在只是一個字符串,而不是一個序列。

最後,這歸結於你如何調用你的函數。更爲自信的回答需要詳細的信息,正如@ sam-estep所評論的那樣。

相關問題