我刚开始使用lein开始我的第一个clojure项目,代码在这里:
(ns fileops.core
(:use
[clojure.core :only (slurp)]
[clojure-csv.core :only (parse-csv)]
[fileops.core]))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(read-file "sample.csv"))
(defn read-file
"open and read the csv file"
[fname]
(with-open [file (clojure.java.io/reader fname)]
(parse-csv (slurp fname))))
Run Code Online (Sandbox Code Playgroud)
我尝试使用"lein run"运行它,但我一直收到此错误:
Caused by: java.lang.RuntimeException: Unable to resolve symbol: read-file in this context
at clojure.lang.Util.runtimeException(Util.java:219)
at clojure.lang.Compiler.resolveIn(Compiler.java:6874)
at clojure.lang.Compiler.resolve(Compiler.java:6818)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779)
at clojure.lang.Compiler.analyze(Compiler.java:6343)
... 52 more
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
kur*_*une 15
您已经使用仅来自Clojure的核心发出声音,这意味着每一个其他核心功能,因此目前无法给你:)试着改变你ns使用:require的不是:use,因为这是更地道.
需要注意的一点是,顺序在clojure中很重要,因此如果你没有在文件的顶部声明一个函数,就像在C和其他一些语言中那样,早期的函数将无法引用它们.这就是之前导致错误的原因,也是我喜欢-main在底部定义我的功能的原因.这是一种风格问题.
另一件事是你的-main函数现在正在使用变量args而不使用它们.在Clojure中,_用于引用未使用的参数是惯用的.您可以使用& _以避免错误消息,因为当用户传入不必要的args时,但我会从一开始就让-main函数无参数.这是因为在运行程序时不需要向main提供任何内容,并且错误确实使调试更容易.很高兴知道什么是使用和在哪里.该sample.csv文件已经提供并且正在read-file调用它,因此如果您的read-file函数正确且sample.csv文件位于正确的位置,程序应该运行.
关于你的-main功能,最好在那里放一点测试,看看它在运行时是否正确执行,所以我改变了它,将csv文件的内容打印到你的控制台上.这种从文件打印的方式是有效的,值得研究.
最后,请确保包含clojure-csv.core在您的project.clj文件中.
core.clj:
(ns fileops.core
(:require
[clojure-csv.core :refer [parse-csv]]))
(defn read-file
"open and read the csv file"
[fname]
(with-open [file (clojure.java.io/reader fname)]
(parse-csv (slurp fname))))
(defn -main []
(println (clojure.string/join "\n" (read-file "resources/test.csv"))))
Run Code Online (Sandbox Code Playgroud)
project.clj:
...
:dependencies [[org.clojure/clojure "1.5.1"]
[clojure-csv/clojure-csv "2.0.1"]
...]
:main fileops.core
Run Code Online (Sandbox Code Playgroud)
您需要将fileops.core声明为:main,如上所示.这告诉Leiningen当你进入时要执行什么功能lein run.非常重要和棘手的东西.
所以现在确保您位于项目目录的根目录和终端,运行以下命令:
lein clean
lein deps
lein run
Run Code Online (Sandbox Code Playgroud)
祝好运!
进一步阅读: