我遇到了与此人类似的问题:Problems while creating a deps.edn file
但是,我使用的是 MacOS 并试图按照本书进行操作并使用 deps.edn 而不是 leiningen,因此我无法通过阅读该帖子中的答案来解决我的问题。
我正在使用我的终端窗口和文本文件,或者 Emacs。
在终端内,我创建了一个名为tennisProject 的文件夹。然后我在该文件夹中创建了 2 个文件,deps.edn 和网球项目.clj。然后我把网球数据的csv文件放在那个文件夹中。
然后我回到终端并重新启动它。我将网球项目设为当前目录。我输入“clj”来启动一个repl。然后我做 (in-ns 'packt-clj.tennisProject) 进入正确的命名空间。然后,我输入(第一场比赛“match_scores_1991-2016_unindexed_csv.csv”),我得到一个错误:
在 (REPL:1:1) 处编译时出现语法错误。 无法解析符号:此上下文中的第一个匹配
内容如下(我从书上复制粘贴的)
deps.edn:
{:deps
{org.clojure/data.csv {:mvn/version "1.0.0"}
semantic-csv/semantic-csv {:mvn/version "0.2.1-alpha1"}}}
网球项目.clj:
(ns packt-clj.tennisProject
(:require
[clojure.data.csv :as csv]
[clojure.java.io :as io]
[semantic-csv.core :as sc]))
(defn first-match [csv]
(with-open [r (io/reader csv)]
(->> (csv/read-csv r)
sc/mappify
first)))
我有一些与本书不同的地方:我将名称从网球更改为网球项目,因为我在出错后不断制作新文件夹。我还将 data.csv 版本从“0.1.4”更改为“1.0.0”,因为这就是我链接的答案中的内容,但这并没有解决我的问题。然后我也有semantic-csv/semantic-csv,但在书中它只是semantic-csv。我更改了它,因为 repl 建议我进行更改。
如果我只是在 repl 中一一要求依赖项,并在 repl 中定义函数,则一切正常,但我真的很想了解所有这些文件是如何协同工作的,非常感谢您的帮助!
答案 0 :(得分:0)
默认情况下,Clojure CLI / deps.edn
假定您的源代码将位于名为 src
的文件夹下的树中。
Clojure 文件中的命名空间必须“匹配”其相对于 src
的文件路径,因此对于 packt-clj.tennisProject
,文件应该是 src/packt_clj/tennisProject.clj
-- 注意 -
命名空间对应于文件路径中的 _
。
如果您像这样重新组织您的项目,并重新启动您的 REPL,您应该能够require
您的代码并使用它。
作为文体说明,我们在 Clojure 中很少使用驼峰命名法:使用 tennis-project
作为命名空间(这意味着 tennis_project.clj
作为文件名)会更惯用。
(编辑添加此示例会话)
(! 556)-> pwd
/Users/sean/clojure/tennisProject
(! 557)-> ls
deps.edn example.csv src
(! 558)-> tree
.
|____deps.edn
|____example.csv
|____src
| |____packt_clj
| | |____tennisProject.clj
(! 559)-> clj
Clojure 1.10.3
user=> (require 'packt-clj.tennisProject)
nil
user=> (in-ns 'packt-clj.tennisProject)
#object[clojure.lang.Namespace 0x128c502c "packt-clj.tennisProject"]
packt-clj.tennisProject=> (first-match "example.csv")
{:some "42", :headers "A value", :in "1", :this "2", :file "3.333"}
packt-clj.tennisProject=> ^D
(! 560)-> cat src/packt_clj/tennisProject.clj
(ns packt-clj.tennisProject
(:require
[clojure.data.csv :as csv]
[clojure.java.io :as io]
[semantic-csv.core :as sc]))
(defn first-match [csv]
(with-open [r (io/reader csv)]
(->> (csv/read-csv r)
sc/mappify
first)))
(! 561)-> cat example.csv
some,headers,in,this,file
42,"A value",1,2,3.333