2012-09-21 8 views
9

Sto provando il clojure il mio secondo giorno e non capisco quasi nulla ancora. Sto lavorando con Programming Clojure 2nd ed. e sono bloccato con le librerie.non è possibile caricare una nuova libreria clojure

Ho Leiningen e ho il REPL in esecuzione. Il libro prima dice al lettore per eseguire una semplice

(require 'clojure.java.io) 

che funziona bene (ho un nullo). Poi si vuole caricare un file chiamato introduction.clj eseguendo un altro semplice

(require 'examples.introduction) 

dove ricevo un messaggio di errore

FileNotFoundException Could not locate clojure/java/introduction__init.class 
or clojure/java/introduction.clj on classpath: clojure.lang.RT.load (RT.java:432) 

Ho scaricato il file introduction.clj e guardò dove dovrei metterla. L'errore e il libro dicono che il comando cercherà nel mio classpath, ma non ho idea di dove o cosa sia (dopo 1h di ricerca e lettura non riesco ancora a capirlo, scusa). Ho eseguito alcuni comandi e ho elencato molti classpath (dai quali nessuno contiene clojure/java/io.clj).

così ho cercato un altro approccio - trovare il file io.clj sul mio disco e semplicemente copiare il file lì ed eseguirlo con un comando

(require 'clojure.java.introduction) 

Questo non sembra funzionare. A proposito, il file io.clj che ho trovato era in "C: \ Programmi \ clojure \ src \ clj \ clojure \ java". Ho provato a eseguire diversi altri file .clj dalla cartella java e dalla cartella clojure, come javadoc.clj o inspector.clj e tutti sembrano funzionare bene con il comando sopra menzionato. Solo il nuovo file non sembra caricare in questo modo.

Qualsiasi aiuto apprezzato :)

+0

che cos'è questo esempi.introduzione? un file jar o ra clj? – ssedano

risposta

6

Clojure corre sulla Java Virtual Machine, quindi sarà necessario per imparare un po 'PATH e CLASSPATH concetti:

See: http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

Per quanto riguarda il messaggio di errore , il runtime Clojure si aspetta di trovare introduction.clj nella directory clojure\java\example\introduction.clj (non dove dovrebbe essere davvero - vedi sotto).

La convenzione per gli spazi dei nomi Clojure è che l'ultimo componente è il nome del file, mentre tutti i componenti precedenti sono directory padre. Così

clojure.java.introduction 

avrebbe dovuto essere nella directory (alla sorgente di "root" o classpath)

clojure\java\introduction.clj 

(Il Lein REPL aggiunge automaticamente la radice di origine al percorso di classe).

Un altro concetto che è necessario capire è dove si trova la "radice" del codice sorgente. Per Leiningen (lo strumento di costruzione che si sta utilizzando) il valore predefinito è "src" o "src/main/clojure" - come documentato in Leiningen sample project file on GitHub).

Infine, se rimani davvero bloccato, sembra il progetto completo per il libro is available on GitHub.

Guardando il progetto, vedo che si dovrebbe effettivamente essere messa il file con src\examples\introduction.clj

+0

Grazie per la risposta, ho letto il documento sui percorsi e i percorsi di classe e mi ha aiutato un po '. Il problema rimane comunque. Ho provato a collocare il file letteralmente ovunque nella cartella principale del clojure (e nelle sottocartelle) e semplicemente non funziona. ''examples.introduction' non funziona,'' clojure.examples.introduction' non funziona, per dirla in breve non credo che questo sia il problema. Ogni altro file clj viene caricato correttamente dalle cartelle ma quando inserisco il file introduction.clj non riesce a trovarlo. Dovunque. Ci può essere qualche altra ragione per questo? Io davvero non so cosa fare. Grazie – xificurC

+1

Hai anche bisogno di '(ns examples.introduction)' nella parte superiore del file clj. Lo spazio dei nomi nel file generalmente deve corrispondere alla posizione nel file system. A meno che tu non abbia in anticipo compilato il sorgente del clojure in una classe Java e lo abbia confezionato in un barattolo (puoi farlo in seguito). – noahlz

+0

Anche quello non aiuta. Ho anche provato a prendere il file introduction.clj nella stessa cartella in cui si trova il file io.clj. Quello funziona con il comando '(richiede 'clojure.java.io)' e la prima riga dice 'ns clojure.java.io'. Così ho modificato la prima riga del file introduttivo.clj in 'ns clojure.java.introduction'. Voglio dire che dovrebbe funzionare, giusto? Bene, anche quello non lo è. Stessa cartella, stesso percorso, ma non funziona. Sto iniziando a pensare che ho saltato l'installazione di qualcosa, anche se Leiningen dovrebbe occuparsi di tutto, no? – xificurC

0

Stai leggendo il libro "Programmazione Clojure"?

Ho riscontrato lo stesso problema. Si divieto essere sovled come segue:

  1. se si avvia clojure da Java: Io lavoro in Windows, il clojure.jar è posto in D: \ backup \ clojure-1.5.1, e il codice sorgente del libro "Programmazione Clojure" è posto in D: \ study \ clojure \ shcloj-code \ code. Dovresti prima cancellare il file user.clj nella cartella D: \ study \ clojure \ shcloj-code \ code.

java -cp d: \ backup \ clojure-1.5.1 \ clojure-1.5.1.jar; d: \ studio \ clojure \ shcloj-code \ code clojure.main -r

Se lavori in linux, sostituisci ";" con ":"

  1. se si avvia clojure da Lein Si dovrebbe primo cd al D: \ studio \ clojure \ shcloj-code cartella \ code, e quindi

Lein repl

Si dovrebbe anche cancellare il file user.clj nella cartella D: \ study \ clojure \ shcloj-code \ code.