Clojure clojure.string/split хит java.lang.ClassCastException: clojure.lang.LazySeq не может быть приведен к java.lang.CharSequence

Я попытался написать функцию для обработки строки строки, вызвав str\split, функция работает нормально, если я вызываю ее непосредственно в окне LEIN REPL, но при попытке запустить программу из LEIN RUN произойдет ошибка вышеупомянутого вызова. Любое предложение?

(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 ответ

Я полагаю, вы проходите line в качестве параметра для вашей функции, хотя он был опущен в вашем фрагменте кода.

Вы должны проверить различия в line параметр, при вызове функции из этих двух разных точек входа. Во-первых, давайте назовем вашу функцию как tokenize для удобства. Теперь ваниль app шаблон в Лейнингене создает -main это выглядит примерно так, после того как я добавлю tokenize вызов:

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

Аргументы деструктурированы с помощью оператора rest &, который строит последовательность аргументов (args). Таким образом, при запуске этого с lein run I want this to work! в итоге вы вызываете tokenize функция с последовательностью. clojure.string/split не может быть применен к последовательности, и вы получите трассировку стека.

Тем не менее, когда вы вызываете свою функцию из lein repl естественный способ сделать это с помощью заклинания, как (tokenize "Iä! Iä! Cthulhu fhtang!"), Это будет работать, так как ваш параметр вызова теперь просто строка, а не последовательность.

В конце концов, все сводится к тому, как вы вызываете свою функцию. Более уверенный ответ потребует подробностей об этом, как прокомментировал @sam-estep.

Другие вопросы по тегам