2014-05-18 5 views
8

ich an meinem ersten clojure Projekt gerade begonnen lein mit dem Code hier:Clojure: Lein läuft nicht in der Lage zu lösen Symbol

(ns fileops.core 
    (:use 
    [clojure.core :only (slurp)] 
    [clojure-csv.core :only (parse-csv)] 
    [fileops.core])) 

(defn -main 
    "I don't do a whole lot ... yet." 
    [& args] 
    (read-file "sample.csv")) 

(defn read-file 
    "open and read the csv file" 
    [fname] 
    (with-open [file (clojure.java.io/reader fname)] 
    (parse-csv (slurp fname)))) 

Ich habe versucht, dies mit „lein run“ zu laufen, aber ich erhalte immer diese Fehlermeldung:

Caused by: java.lang.RuntimeException: Unable to resolve symbol: read-file in this context 
    at clojure.lang.Util.runtimeException(Util.java:219) 
    at clojure.lang.Compiler.resolveIn(Compiler.java:6874) 
    at clojure.lang.Compiler.resolve(Compiler.java:6818) 
    at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779) 
    at clojure.lang.Compiler.analyze(Compiler.java:6343) 
    ... 52 more 

Was mache ich falsch?

+4

read-Datei sollte in Ihrer Quelle vor Haupt sein. –

+0

@DiegoBasch du bist ein Lebensretter. Ich bin neu in Clojure und ich habe viel zu viel Zeit damit verbracht, herauszufinden, warum ich einen Fehler bekommen habe, dass meine Funktion im falschen Kontext aufgerufen wurde. Das war es ... Das war es die ganze Zeit. Guter Eintrag. –

Antwort

9

Sie haben nur schlürfen aus clojure Kern, was bedeutet, dass jeder andere Kernfunktion Sie benutzt jetzt nicht verfügbar ist :) Versuchen Sie ns Ändern :require statt :use zu verwenden, da dies mehr idiomatische ist.

Eine Sache zu beachten ist, dass die Reihenfolge in clojure eine Rolle spielt. Wenn Sie also keine Funktion oben in Ihrer Datei deklarieren, wie in C und einigen anderen Sprachen, können die früheren Funktionen keine Referenz erstellen zu ihnen. Dies ist, was Ihren Fehler vorher verursacht hat und deshalb möchte ich meine -main Funktion am unteren Rand definieren. Es ist eine Frage des Stils.

Eine andere Sache ist, dass Ihre -main Funktion variable Argumente gerade jetzt nimmt und sie nicht verwendet. In Clojure ist es idiomatisch, _ zu verwenden, um auf einen Parameter zu verweisen, der nicht verwendet wird. Sie könnten & _ verwenden, um Fehlermeldungen zu vermeiden, wenn der Benutzer unnötige Argumente übergibt, aber ich hätte einfach die Funktion -main von Anfang an parameterlos. Dies liegt daran, dass main bei der Ausführung des Programms nichts bereitstellen muss und dass Fehler das Debuggen erleichtern. Es ist gut zu wissen, was gebraucht wird und wo. Die sample.csv Datei ist bereits vorhanden und hat read-file aufgerufen, so dass das Programm ausgeführt werden sollte, wenn Ihre read-file Funktion korrekt ist und die sample.csv Datei an der richtigen Stelle ist.

In Bezug auf Ihre -main Funktion wäre es schön, einen kleinen Test dort zu sehen, ob es richtig ausgeführt wird, wenn Sie es ausführen, also habe ich es geändert, um den Inhalt der CSV-Datei auf Ihrer Konsole auszudrucken. Diese Art, aus einer Datei zu drucken, ist effizient und lohnt sich selbst.

Schließlich, stellen Sie sicher, dass Sie clojure-csv.core in Ihre project.clj Datei einschließen.

core.clj:

(ns fileops.core 
    (:require 
    [clojure-csv.core :refer [parse-csv]])) 

(defn read-file 
    "open and read the csv file" 
    [fname] 
    (with-open [file (clojure.java.io/reader fname)] 
    (parse-csv (slurp fname)))) 

(defn -main [] 
     (println (clojure.string/join "\n" (read-file "resources/test.csv")))) 

project.clj:

... 

:dependencies [[org.clojure/clojure "1.5.1"] 
       [clojure-csv/clojure-csv "2.0.1"] 
       ...] 
:main fileops.core 

Sie müssen fileops.core als erklären: Haupt, wie oben gezeigt. Dies teilt Leiningen mit, welche Funktion ausgeführt werden soll, wenn Sie lein run eingeben. Sehr wichtige und knifflige Sachen.

So, jetzt stellen Sie sicher, in der Wurzel Ihrer Projektverzeichnis und am Terminal sind, führen Sie die folgenden Schritte aus:

lein clean 
lein deps 
lein run 

Viel Glück!

Weiterführende Literatur:

8th light blog on name-spaces

flying machine studios explanation of lein run

+1

Dies ist meine erste akzeptierte Antwort auf SO. Danke vielmals! :) – kurofune

Verwandte Themen