1

可能重复:
为什么 ns 表单中的 require 行为与 require 函数不同

我正在涉足 clojure 并且遇到了导入问题。来自 REPL

clojure.core=>(import '(java.io FileReader))
clojure.core=>(import 'java.io.FileReader)
clojure.core=>(import java.io FileReader)

每个都完美地工作,但从文件中只有以下作品:

(ns project.core
  (import java.io.FileReader))

这些都失败了

(ns project.core
  (import 'java.io.FileReader)) 

(ns project.core
  (import '(java.io FileReader))

出现以下错误:

ClassNotFoundException quote.java.io.FileReader  java.net.URLClassLoader$1.run (URLClassLoader.java:366)

ClassNotFoundException quote.(java.io FileReader)  java.net.URLClassLoader$1.run (URLClassLoader.java:366)

分别。

实际上,我需要导入的不仅仅是java.io.FileReader,但这是问题的提炼版本。

有什么想法可能会出错吗?我似乎无法在其他任何地方找到问题

4

1 回答 1

3

解决方案是:

(ns project.core
  (:import [java.io FileReader BufferedReader FooBar]))

至于为什么这是必要的,ns宏接受几个指令,包括:import. 由于宏的实现方式,它期望导入指令的参数采用类似列表的形式 - 因此,[java.io ...]. 顺便说一句,这样的列表也(java.io ...)可以工作。

有关如何使用的完整ns概要,请查看 ClojureDocs 页面:http ://clojuredocs.org/clojure_core/clojure.core/ns 。ClojureDocs 是解决这类问题的宝贵资源。

于 2012-10-15T05:36:34.363 回答