找不到应用/clojure/core/vector__init.class或在类路径上应用/ clojure / core / vector.clj

时间:2015-04-09 08:56:54

标签: java clojure filenotfoundexception

当我尝试运行程序时出现以下错误:Exception in thread "main" java.io.FileNotFoundException: Could not locate apply /clojure/core/vector__init.class or apply/clojure/core/vector.clj on classpath: , compiling:(erbium/compile.clj:1:1)。它似乎指向下面的文件,并建议我需要将clojure.core/vector放在我的依赖项中。它是否默认包含在内?

(ns erbium.compile
    (require `[clojure.string :as string])
)

(defn produce-out "Convert 'command %1 %2 %3' with stack [5 6 7] to 'command 5 6 7'" [word stack definitions]
    (let [
            code (definitions word) ; dictionary/hash lookup. eg. "println" -> "echo $1"
            replacement (fn [match] (-> match second Long/parseLong dec stack str))
         ]
        ; evaluate arguments. eg. "echo %1"
        ;                         stack=["blah"]
        ;                         -> "echo blah"
        (string/replace code #"%(\d)" replacement)
    )
)

(defn parse-word "Verifies that word is in defintitions and then returns (produce-out word stack)" [word stack definitions]
    (if (some #{word} (keys definitions))
        (produce-out word stack)
    )
)

(defn compile "Main compile function" [code]
    (let [
            split-code (string/split code #"\s")
            definitions {
                "println" "echo %1"
                "+" "%1 + %2"
                "-" "%1 - %2"
            }
            stack []
        ]

        (for [word [split-code]]
            (if (integer? (read-string word))
                (do
                    (println "Found integer" word)
                    (def stack (conj stack (read-string word)))
                    (println "Adding to argument stack:" stack)
                )

                ; else
                (do
                    (parse-word word stack definitions)
                    (def stack [])
                )
            )
        )
    )
)

核心文件通过(load "compile")加载此文件,如果这有所不同。

2 个答案:

答案 0 :(得分:2)

我看到的第一个错误是:

(require `[clojure.string :as string])

应该是这样的:

(:require [clojure.string :as string])

在常规的clojure源文件中。这为我修好了。

也就是说,这里有一些一般性建议:

  1. 有很多格式化的“错误”。当然,您可以按照自己的意愿格式化代码,但是,如果您坚持基本的格式原则,其他人也可以更轻松地遵循。以下是一个很好的集合:https://github.com/bbatsov/clojure-style-guide大多数编辑器都实现了一些格式化工具。
  2. split-code (str/split code #"\s")这不会按您的要求运行[clojure.string :as string]因此请将其更改为:split-code (string/split code #"\s")
  3. 我不确定(加载...)以及在哪种情况下通常会使用它。然而,为了开始学习clojure,我推荐Lighttable,因为它内置了即时反馈,这在学习新东西时非常有价值。

答案 1 :(得分:0)

为了扩展答案,"要求"出现在名称空间声明" ns"中。 ns实际上是一个宏,它扩展为一系列语句来创建命名空间,并进行一些设置。

此宏将(:require ...)之类的语句视为对名为require的函数的调用,并自动引用任何后续参数。既然你自己指定了一个引用:

(ns erbium.compile
  (require '[clojure.string :as string]))

然后结果被双引号,对require的调用最终成为:

... (require (quote (quote [clojure.string :as string])))

因此它最终试图加载名为" quote"的命名空间。然后是一个语法错误的向量。 :)

ns宏是设置命名空间的标准方便方法,但我花了很长时间才能正确学习它。我发现最好的方法是复制其他人的设置代码,直到我学会了如何做到这一点。

顺便提一下,使用require代替:require无关紧要,但标准是使用:require,因此它看起来不像是对该函数的直接调用。