2016-07-21 20 views
0

Ich habe versucht, eine Liste innerhalb der Liste in Clojure zu deklarieren.Clojure Liste innerhalb der Liste Erklärung

Expected behavior: `(`()) => (()) 
Actual behavior: `(`()) => ((clojure.core/list)) 

Was bedeutet diese Ausgabe?

Auch würde ich gerne verstehen, wie das Verhalten unten konsistent ist.

`()  =>() 
`("hi") => ("hi") 
`(`()) => ((clojure.core/list)) 

Unrelated auf meine Frage, hier ist ein Code-Schnipsel, die (()) tatsächlich zurückgibt:

(conj `() `()) 

Antwort

2

Grundsätzlich nicht Nest Anführungszeichen. Ich werde hier das grundlegende spezielle Formular verwenden, aber die gleichen Konzepte gelten auch für die komplexere Syntax Zitat.

Wenn Sie schreiben dies:

'() 
;;=>() 

Das ist genau das gleiche wie das Schreiben dieses:

(quote()) 
;;=>() 

Also, wenn Sie schreiben:

'('()) 
;;=> ((quote())) 

, dass das gleiche wie Schreiben dieses:

(quote ((quote()))) 
;;=> ((quote())) 

Eine Sache, die Sie tun können, nur die äußerste Liste zitieren:

'(()) 
;;=> (()) 

oder Sie können die list-Funktion, die eine weit allgemeinere Lösung ist:

(list) 
;;=>() 

(list "hi") 
;;=> ("hi") 

(list (list)) 
;;=> (()) 

(list 1 (+ 1 1) 3) 
;;=> (1 2 3)