前缀列表中的lib名称不得包含句点

时间:2013-07-25 09:36:31

标签: clojure lisp read-eval-print-loop

我现在正在学习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但是会​​遇到同样的错误。

1 个答案:

答案 0 :(得分: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/fileio/reader等,而不是拉入整个命名空间。

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