在 repl

时间:2021-05-29 01:09:17

标签: clojure

我遇到了与此人类似的问题: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 中定义函数,则一切正常,但我真的很想了解所有这些文件是如何协同工作的,非常感谢您的帮助!

1 个答案:

答案 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