我正在用《勇敢与真实的克鲁茹尔》一书学习Clojure,并使用emacs,苹果酒和leiningen。我已经创建了一个项目。
lein new app the-divine-cheese-code
然后我已将源文件添加到项目中。
神芝代码\ src \神芝代码\ core.clj 神圣的奶酪代码\ src \ the_divine_cheese_code \ visualization \ svg.clj
在“ core.clj”中,我指的是“ svg.clj”命名空间。
神圣的奶酪代码\ src \ the_divine_cheese_code \ core.clj
(ns the-divine-cheese-code.core)
;; Ensure that the SVG code is evaluated
(require 'the-divine-cheese-code.visualization.svg)
;; Refer the namespace so that you don't have to use the
;; fully qualified name to reference svg functions
(refer 'the-divine-cheese-code.visualization.svg)
(def heists [{:location "Cologne, Germany"
:cheese-name "Archbishop Hildebold's Cheese Pretzel"
:lat 50.95
:lng 6.97}
{:location "Zurich, Switzerland"
:cheese-name "The Standard Emmental"
:lat 47.37
:lng 8.55}
{:location "Marseille, France"
:cheese-name "Le Fromage de Cosquer"
:lat 43.30
:lng 5.37}
{:location "Zurich, Switzerland"
:cheese-name "The Lesser Emmental"
:lat 47.37
:lng 8.55}
{:location "Vatican City"
:cheese-name "The Cheese of Turin"
:lat 41.90
:lng 12.45}])
(defn -main
[& args]
(println (points heists)))
神奶酪代码\ src \ the_divine_cheese_code \ visualization \ svg.clj
(ns the-divine-cheese-code.visualization.svg)
(defn latlng->point
"Convert lat/lng map to comma-separated string"
[latlng]
(str (:lat latlng) "," (:lng latlng)))
(defn points
[locations]
(clojure.string/join " " (map latlng->point locations)))
这是项目的整个目录结构。
the-divine-cheese-code
the-divine-cheese-code\.gitignore
the-divine-cheese-code\.hgignore
the-divine-cheese-code\.nrepl-port
the-divine-cheese-code\CHANGELOG.md
the-divine-cheese-code\doc
the-divine-cheese-code\doc\intro.md
the-divine-cheese-code\LICENSE
the-divine-cheese-code\project.clj
the-divine-cheese-code\README.md
the-divine-cheese-code\resources
the-divine-cheese-code\src
the-divine-cheese-code\src\the_divine_cheese_code
the-divine-cheese-code\src\the_divine_cheese_code\core.clj
the-divine-cheese-code\src\the_divine_cheese_code\visualization
the-divine-cheese-code\src\the_divine_cheese_code\visualization\svg.clj
the-divine-cheese-code\target
the-divine-cheese-code\target\default
the-divine-cheese-code\target\default\classes
the-divine-cheese-code\target\default\classes\META-INF
the-divine-cheese-code\target\default\classes\META-INF\maven
the-divine-cheese-code\target\default\classes\META-INF\maven\the-divine-cheese-code
the-divine-cheese-code\target\default\classes\META-INF\maven\the-divine-cheese-code\the-divine-cheese-code
the-divine-cheese-code\target\default\classes\META-INF\maven\the-divine-cheese-code\the-divine-cheese-code\pom.properties
the-divine-cheese-code\target\default\repl-port
神奶酪代码\目标\默认\陈旧
神奶酪代码\ target \ default \ stale \ leiningen.core.classpath.extract-native-dependencies
神奶酪代码\测试
神奶酪代码\测试\神奶酪代码
神奶酪代码\ test \ the_divine_cheese_code \ core_test.clj
当我使用'lein run'运行项目时,它会成功执行。但是,当我使用emacs / cider打开core.clj文件并尝试对其进行编译时,出现类路径错误。
CompilerException java.io.FileNotFoundException: Could not locate
the_divine_cheese_code/visualization/svg__init.class or
the_divine_cheese_code/visualization/svg.clj on classpath. Please check
that namespaces with dashes use underscores in the Clojure file name.,
compiling:(c:/temp/the-divine-cheese-code/src/the_divine_cheese_code/core.clj:2:1)
如果将源放置在同一目录中(相应地更改名称空间),CIDER会成功编译源。
(ns the-divine-cheese-code.core)
(require 'the-divine-cheese-code.svg)
(refer 'the-divine-cheese-code.svg)
(def heists [{:location "Cologne, Germany"
...
因此,问题可能与操作系统有关。我使用Windows 7,它不是Emacs / CIDER的主要操作系统。
经过一些试验,我发现CIDER无需:refer
(ns the-divine-cheese-code.core
(:require [the-divine-cheese-code.visualization.svg]))
在这种情况下,这看起来像是CIDER错误,并且“ lein run”可以预料地出错。 如果我做对了
(ns the-divine-cheese-code.core
(:require [the-divine-cheese-code.visualization.svg :refer :all]))
CIDER现在出现另一个错误:
Caused by java.lang.IllegalStateException
latlng->point already refers to:
#'the-divine-cheese-code.svg/latlng->point in namespace:
the-divine-cheese-code.core
答案 0 :(得分:0)
建议使用ns
宏提供的选项,而不要使用裸露的require
和refer
语句-这是在Clojure中执行导入/要求的推荐方法,并且大多数使用这种管理名称空间的方式编写工具。即使下面的代码在CIDER中仍然不起作用,也将更易于诊断:
;; the-divine-cheese-code\src\the_divine_cheese_code\core.clj
(ns the-divine-cheese-code.core
(:require [the-divine-cheese-code.visualization.svg :refer :all]))
(def heists ...)
(defn- main ...)
答案 1 :(得分:0)
就我而言,在我将src/the_divine_cheese_code/
文件夹重命名(具有相同的名称)后,错误消失了,并且它的内容是递归的。
不确定是什么原因导致了问题。我的猜测是字符编码搞砸了。我在Emacs中创建了文件和文件夹,并在Double Commander中完成了重命名。