Clojure - einfache Funktion wirft NullPointerException

S.Kara

Captain
Registriert
Okt. 2013
Beiträge
3.407
Der Titel sagt eigentlich schon alles:
Code:
(defn x[l]
  (if (empty? l) (println "finished")
    (
      (println "jo")
      (x (rest l))
    )
  )
)

Nehme ich das "(println "jo")" weg, funktioniert es. Jemand eine Ahnung woran das liegen könnte?
 
Ich kenn mich in Clojure nicht wirklich aus; aber deine Einrückung zeigt schon, dass Lisp-Dialekte für dich neu sind.
Klammern geben nicht wie in C-Sprachen die Syntax unter irgendwelchen Anweisungen vor, sondern Klammern sind das syntaktische Konstrukt für eine Liste. Eine Liste als Code wird (fast immer) nach der einfachen Regel evaluiert:

Das erste Listenelement (evaluiert) stellt die aufgerufene Funktion dar; die weiteren Elemente (evaluiert) die Parameter. Dein else-Zweig ist:
Code:
    ((println "jo") (x (rest l)))
Es werden also (println "jo") und (x (rest l)) evaluiert und das Ergebnis von (println "jo") wird als Funktion aufgerufen (mit einem Parameter, nämlich dem Ergebnis von (x (rest l))). Das ist nicht das, was du willst. Du willst, dass die beiden Funktionen einfach nacheinander aufgerufen werden. In Lisp wäre das der special operator "progn" und in Scheme "begin". In Clojure wird er ähnlich heißen.
 
Ah danke, es hat ein "do" gefehlt. :)

Und ja ich bin tatsächlich neu in der Materie, danke. :)
 
Zurück
Oben