2013-07-25 7 views
7

ich clojure jetzt lerne, schrieb ich eine Datei wie folgt aus:lib Namen innerhalb Präfix-Listen nicht Perioden enthalten

;; File ./mycode/myvoc.clj 

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

; more code here... 

diese Datei befindet sich in ./mycode/, wenn ich REPL laufen, möchte ich die Funktion in myvoc.clj verwenden , wie folgt:

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

Ich weiß nicht warum. wenn ich myvoc.clj wie ändern:

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

würde es in Ordnung, aber berichtet nur keinen „Leser in diesem Zusammenhang“ denn ich den Import Teil kommentiert.

Kann jemand das reparieren? Ich benutze auch require aber bekomme die gleiche Art von Fehler.

Antwort

15

Sie müssen das Zitat aus Ihrer :use Klausel entfernen:

(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 ist eine Abkürzung für (quote clojure.java.io), so Ihre ursprüngliche :use Klausel

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

war Dies sieht aus, als ob Sie zu :use versucht wurden ein Namespace mit dem Präfix quote und das letzte Segment clojure.java.io. Die Punkte in den letzteren sind die direkte Ursache des Fehlers aus der Sicht von ns.

Übrigens ist es viel üblicher zu (:require [clojure.java.io :as io]) und dann sagen io/file, io/reader usw. als es ist, den gesamten Namespace einzuziehen.

schließlich nur klar zu sein, ist das Zitat notwendig, wenn die Funktionuse (wie in Ihrem (use 'mycode.myvoc) Call) verwendet wird, wie es in einer ns Erklärung zu einer :use Klausel gegenüber.

+0

ja, danke, das ist ok für mich. Ich wechselte zur Verwendung (: require ...) -Klausel. – user2545464