在 repl 中识别依赖项和功能的问题

Issue with dependencies & function being recognized in the repl

我和这个人有类似的问题:

但是,我在 MacOS 上并尝试按照本书的说明使用 deps.edn 而不是 leiningen,所以我无法通过阅读 post 中的答案来解决我的问题.

我正在使用我的终端 window 并且只使用文本文件或 Emacs。

在终端中,我创建了一个名为 tennisProject 的文件夹。然后我在该文件夹中创建了 2 个文件,deps.edn 和 tennisProject.clj。然后我把网球数据的csv文件放在那个文件夹里。

然后我回到终端并重新启动它。我将 tennisProject 作为当前目录。我输入“clj”以启动 repl。然后我 (in-ns 'packt-clj.tennisProject) 进入正确的命名空间。然后,我输入 (first-match "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"}}}

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)))

我有一些与书不同的地方:我将名称从 tennis 更改为 tennisProject,因为我在遇到错误后一直在创建新文件夹。我还将 data.csv 版本从“0.1.4”更改为“1.0.0”,因为这是我链接的答案中的内容,但这并没有解决我的问题。然后我也有 semantic-csv/semantic-csv 但在书中它只是 semantic-csv。我更改了它,因为 repl 建议我进行更改。

如果我只是在 repl 中一一要求依赖项,并在 repl 中定义函数,一切正常,但我真的很想了解所有这些文件是如何协同工作的,感谢您的帮助!

默认情况下,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