2012-03-18 2 views
20

In clojure, mi piacerebbe sapere quali sono le differenze tra i tre di seguito.In Clojure, differenza tra la funzione, la funzione e la funzione citato sharp-quote

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

I risultati sono

(5 7 9) 

(4 5 6) 

(5 7 9) 

non riesco a capire il secondo di un comportamento.

Ritengo che il primo e il terzo siano gli stessi in clojure che è Lisp-1 e non fa distinzione tra la valutazione di una variabile e la funzione con lo stesso nome.

Questa potrebbe essere una domanda di base, ma non sembra esserci abbastanza informazione. Per favore insegnami.

Grazie.

+2

Per inciso, in clojure è idiota descrivere sequenze letterali con vettori anziché elenchi citati. –

+0

Oh, capisco. Grazie, Alex. –

risposta

32

Per quanto riguarda il terzo caso, a differenza di Common Lisp, #'+ non letto come (function +) e si riferiscono al valore del simbolo + nella funzione di spazio dei nomi, dal momento che Clojure non ha una funzione di spazio dei nomi. Invece, si legge come (var +) e si riferisce allo var chiamato +. L'applicazione di var equivale ad applicare il valore memorizzato nello var.

Nel secondo caso, si sono più volte applicando un simbolo per una coppia di numeri. Questo è valido per caso. L'applicazione di un simbolo per una mappa è lo stesso di indicizzazione in quella mappa:

user> ('a {'a 1, 'b 2, 'c 3, '+ 4}) 
1 
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4}) 
4 

Se si fornisce un secondo argomento, è usato come valore di default nel caso in cui nessun tasto viene trovato nella mappa:

user> ('+ {'a 1, 'b 2, 'c 3} 4) 
4 

Poiché in ogni iterazione, si applica il simbolo + a una coppia di numeri e poiché un numero non è una mappa e pertanto non contiene + come chiave, il secondo argomento viene restituito come valore predefinito di una partita fallita.

user> ('+ 'foo 4) 
4 
user> ('+ {} 4) 
4 
user> ('+ 1 4) 
4 
+0

Ottima risposta. Chiara spiegazione del comportamento non immediatamente evidente. Grazie. – sw1nn

+0

Grazie mille, Matthias. Potrei capire cosa significa "#". Non avevo realizzato Var e l'ho ignorato, ma questa volta l'ho capito più profondamente. Ho anche potuto capire il comportamento del secondo codice. Grazie. –