我刚开始使用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))))
我尝试使用“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
我做错了什么?
答案 0 :(得分:14)
您使用了来自clojure核心的仅 slurp,这意味着您现在无法使用其他所有核心功能:)尝试将ns
更改为使用:require
而不是{ {1}},因为这更加惯用。
有一点需要注意的是,顺序在clojure中很重要,所以如果你不在文件的顶部声明一个函数,就像在C和其他一些语言中那样,早期的函数将无法生成参考他们。这就是之前导致错误的原因,也是我想在底部定义:use
函数的原因。这是一种风格问题。
另一件事是你的-main
函数现在正在使用变量args而不使用它们。在Clojure中,使用-main
来引用一个不被使用的参数是不恰当的。您可以使用_
来避免错误消息,因为当用户传入不必要的args时,我会从一开始就让-main函数无参数。这是因为在运行程序时不需要向main提供任何内容,并且错误确实使调试更容易。很高兴知道什么是使用和在哪里。 & _
文件已经提供并且正在调用sample.csv
,因此如果read-file
函数正确并且read-file
文件位于正确的位置,则应运行该程序。
关于你的sample.csv
函数,最好在那里放一点测试,看看它在运行时是否正常执行,所以我改了它以将csv文件的内容打印到你的控制台上。这种从文件打印的方式是有效的,值得研究。
最后,请务必在-main
文件中加入clojure-csv.core
。
core.clj:
project.clj
project.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"))))
您需要将fileops.core声明为:main,如上所示。这告诉Leiningen当您输入...
:dependencies [[org.clojure/clojure "1.5.1"]
[clojure-csv/clojure-csv "2.0.1"]
...]
:main fileops.core
时要执行的功能。非常重要和棘手的东西。
现在请确保您位于项目目录的根目录中,并在终端上运行以下命令:
lein run
祝你好运!
进一步阅读:
答案 1 :(得分:0)
读取文件应该在源文件中的main之前,或者应该在-main文件中放置类似这样的声明原因:
(declare read-file)