【问题标题】:Issue with dependencies & function being recognized in the repl在 repl 中识别依赖项和函数的问题
【发布时间】:2021-05-29 01:09:17
【问题描述】:

我和这个人有类似的问题:Problems while creating a deps.edn file

但是,我在 MacOS 上并试图按照这本书并使用 deps.edn 而不是 leiningen,所以我无法通过阅读该帖子中的答案来解决我的问题。

我正在使用我的终端窗口,只使用文本文件或 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)))

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

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

    默认情况下,Clojure CLI / deps.edn 假定您的源代码将位于名为 src 的文件夹下的树中。

    Clojure 文件中的命名空间必须“匹配”其相对于src 的文件路径,因此对于packt-clj.tennisProject,文件应为src/packt_clj/tennisProject.clj——注意命名空间中的- 对应于_文件路径。

    如果您像这样重新组织您的项目,并重新启动您的 REPL,您应该能够require 您的代码并使用它。

    作为一种风格说明,我们在 Clojure 中并没有大量使用 camelCase:将 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
    

    【讨论】:

    • 嗨,肖恩。谢谢你的帮助。我添加了以下文件夹。所以我有tennisProject > src > packt_clj。然后我移动了其他文件,使它们都在 packt_clj 文件夹中:deps.edn、tennisProject.clj 和 csv 文件。然后我回到终端,将我的目录更改为 packt_clj 文件夹,输入 clj,然后 (in-ns 'packt-clj.tennisProject),然后尝试 (first-match "match_scores_1991-2016_unindexed_csv.csv") 并得到再次出现同样的错误,它无法解析符号。我感谢任何进一步的建议。感谢您也让我知道样式!
    • 是否总是使用“-”来附加单词,而只使用“_”来附加文件名?是因为 JVM 的原因吗?
    • 在tennisProject文件夹中运行clj:Clojure期望在你运行它的目录中找到src文件夹,从那里它会向下查找树以“匹配”你需要的命名空间(不要使用in-ns 直到您成功要求您的代码)。我会用更多的例子来更新我的答案,以使其更清楚。
    • 添加了示例会话。如果你有一种互动的方式来提问和获得答案,你可能会发现学习更容易:我建议加入 Clojurians Slack 并在#beginners 频道​​中提问——注册clojurians.net
    • 非常感谢肖恩!!!它起作用了,现在我觉得我更好地理解了文件树中的事物必须如何组织。我以前从未使用过 slack,但我会确定的!
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2021-03-27
    • 2023-02-07
    • 2012-02-04
    • 2012-04-06
    • 2023-01-18
    • 2016-09-25
    • 2021-04-16
    相关资源
    最近更新 更多