当我尝试运行程序时出现以下错误: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")
加载此文件,如果这有所不同。
答案 0 :(得分:2)
我看到的第一个错误是:
(require `[clojure.string :as string])
应该是这样的:
(:require [clojure.string :as string])
在常规的clojure源文件中。这为我修好了。
也就是说,这里有一些一般性建议:
split-code (str/split code #"\s")
这不会按您的要求运行[clojure.string :as string]
因此请将其更改为:split-code (string/split code #"\s")
答案 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
,因此它看起来不像是对该函数的直接调用。