在 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
我和这个人有类似的问题:
但是,我在 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