我现在正在学习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
但是会遇到同样的错误。
答案 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/file
,io/reader
等,而不是拉入整个命名空间。
最后,为了清楚起见,使用函数 use
(如(use 'mycode.myvoc)
调用中),而不是:use
时,引号是必要的ns
声明中的}子句。