Clojure:Lein跑不能解决符号

jwe*_*nga 12 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))))
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)

祝好运!

进一步阅读:

关于名称空间的第8个轻博客

飞行器工作室的解释 lein run