我尝试编写一个函数来通过调用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)))))
答案 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评论的那样,一个更自信的答案需要详细说明。