7

我现在正在学习clojure,我写了一个这样的文件:

;; File ./mycode/myvoc.clj

(ns mycode.myvoc
    (:use 'clojure.java.io)
    (:import (java.io.File)))

; more code here...

该文件位于 中./mycode/,当我运行 REPL 时,我想使用中的函数myvoc.clj,如下所示:

user=> (use 'mycode.myvoc)
java.lang.Exception: lib names inside prefix lists must not contain periods (myv
oc.clj:1)

我不知道为什么。如果我更改myvoc.clj为:

(ns mycode.myvoc)
;    (:use 'clojure.java.io)
;    (:import (java.io.File)))

没关系,但只报告没有“在这种情况下的读者”,因为我评论了导入部分。

有人可以解决这个问题吗?我也使用require但得到同样的错误。

4

1 回答 1

16

您需要从您的:use条款中删除引号:

(ns mycode.myvoc
  (:use clojure.java.io)  ; note no '
  (:import java.io.File)) ; extra parens removed here; they do no harm,
                          ; though

'clojure.java.io是 的简写(quote clojure.java.io),所以你原来的:use条款是

(:use (quote clojure.java.io))

这看起来好像您正在尝试:use使用前缀为quote和最终段的名称空间clojure.java.io。后者中的点是从角度来看错误的直接原因ns

顺便说一句,与拉入整个命名空间相比,使用(:require [clojure.java.io :as io])然后说io/file等更常见。io/reader

最后,为了清楚起见,在使用函数 use时(例如在您的(use 'mycode.myvoc)调用中),引号是必需的,而不是声明中的:use子句ns

于 2013-07-25T09:40:20.187 回答