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

use*_*464 7 lisp clojure read-eval-print-loop

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

;; File ./mycode/myvoc.clj

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

; more code here...
Run Code Online (Sandbox Code Playgroud)

这个文件驻留在./mycode/,当我运行REPL时,我想使用该函数myvoc.clj,如下所示:

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

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

(ns mycode.myvoc)
;    (:use 'clojure.java.io)
;    (:import (java.io.File)))
Run Code Online (Sandbox Code Playgroud)

它会没问题但只是报告没有"读者在这种情况下",因为我评论了导入部分.

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

Mic*_*zyk 16

您需要删除:use子句中的引用:

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

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

(:use (quote clojure.java.io))
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,它的更平常(:require [clojure.java.io :as io]),然后说io/file,io/reader等比它在整个命名空间来拉.

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