Clojure:Lein跑不能解决符号

时间:2014-05-18 00:06:59

标签: clojure

我刚开始使用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

我做错了什么?

2 个答案:

答案 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
祝你好运!

进一步阅读:

8th light blog on name-spaces

flying machine studios explanation of lein run

答案 1 :(得分:0)

读取文件应该在源文件中的main之前,或者应该在-main文件中放置类似这样的声明原因:

(declare read-file)