2013-07-25 3 views
7

sto imparando clojure ora, ho scritto un file in questo modo:nomi lib all'interno degli elenchi di prefisso non devono contenere periodi

;; File ./mycode/myvoc.clj 

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

; more code here... 

questo file risiede nella ./mycode/, quando corro REPL, voglio usare la funzione in myvoc.clj , come questo:

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

Non so perché. se cambio myvoc.clj come:

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

sarà ok, ma solo il rapporto il no "lettore in questo contesto" per Ho commentato la parte di importazione.

Qualcuno potrebbe risolvere questo problema? Io uso anche require ma ottengo lo stesso tipo di errore.

risposta

15

è necessario rimuovere la citazione dal :use clausola:

(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 è una scorciatoia per (quote clojure.java.io), così il vostro :use clausola originale era

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

Questo sembra come se si stava tentando di :use uno spazio dei nomi con un prefisso quote e il segmento finale clojure.java.io. I punti in quest'ultimo sono la causa diretta dell'errore dal punto di vista di ns.

Per inciso, è molto più comune per (:require [clojure.java.io :as io]) e quindi dire io/file, io/reader ecc. Di quanto non sia per inserire l'intero spazio dei nomi.

Infine, tanto per essere chiari, la citazione è necessaria quando si utilizza la funzione use (come nel tuo (use 'mycode.myvoc) chiamata), al contrario di una clausola :use in una dichiarazione ns.

+0

sì, grazie, questo è ok per me. Ho passato a usare (: require ...) clausola. – user2545464