Clojure clojure.string / split命中java.lang.ClassCastException:clojure.lang.LazySeq无法强制转换为java.lang.CharSequence

时间:2017-07-24 23:53:57

标签: clojure casting leiningen read-eval-print-loop charsequence

我尝试编写一个函数来通过调用str \ split来处理一行字符串,如果我直接在LEIN REPL窗口中调用它,该函数工作正常,但是在尝试从LEIN运行程序时会遇到上述调用错误跑。 有什么建议吗?

(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)))))

1 个答案:

答案 0 :(得分:1)

我想您将line作为参数传递给您的函数,尽管它已从您的代码段中省略。

从这两个不同的入口点调用函数时,应检查line参数的差异。首先,为方便起见,我们将您的函数命名为tokenize。现在,在我添加app调用后,Leiningen中的vanilla -main模板创建了一个与此类似的tokenize

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

使用rest运算符&对参数进行解构,该运算符构建参数(args)的 Seq 。因此,当使用lein run I want this to work!运行此操作时,最终会使用序列调用tokenize函数。 clojure.string/split无法应用于序列,并且您获得了堆栈跟踪。

然而,当你从lein repl调用你的函数时,一种自然的方法是使用像(tokenize "Iä! Iä! Cthulhu fhtang!")这样的咒语。这将起作用,因为您的调用参数现在只是一个字符串,而不是一个序列。

最后,它归结为你如何调用你的功能。正如@ sam-estep评论的那样,一个更自信的答案需要详细说明。