2014-10-11 9 views
8

da "La gioia di Clojure" libro:Clojure quando è un apostrofo necessario prima vettore

primo esempio:

(def fifth (comp first rest rest rest rest)) 
(fifth [1 2 3 4 5]) 
;=> e 

secondo esempio:

(defn fnth [n] 
    (apply comp 
    (cons first 
     (take (dec n) (repeat rest))))) 
((fnth 5) '[a b c d e]) 
;=> e 

perché nel secondo esempio (ma non nel primo) ho bisogno di un apostrofo? senza uno il secondo esempio genererà un errore.

risposta

7

Nel secondo esempio è necessario utilizzare l'apostrofo perché si desidera impedire la valutazione degli elementi del vettore. Se rimuovi l'apostrofo, Clojure proverà a risolvere i simboli a, b, ecc., Come se fossero legati ad alcuni valori.

Esempio:

user> '[a b c d e] 
;; => [a b c d e] 
user> [a b c d e] 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: a 
user> (let [a 1 
      b 2 
      c 3 
      d 4 
      e 5] 
     [a b c d e]) 
;; => [1 2 3 4 5] 

Si prega di notare che non c'è bisogno di usare aphostrophe con i numeri, dal momento che valutano a se stessi:

user> 1 
;; => 1 
user> 2 
;; => 2 
user> [1 2 3] 
;; => [1 2 3] 

mentre i simboli non lo fanno, Clojure sarà la ricerca di una valore a cui viene assegnato un determinato simbolo:

user> x 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: x 

Quindi, conoscere queste informazioni e il fatto che un Gli strumenti di una funzione vengono valutati prima di entrare nella funzione, dovrebbe essere chiaro perché e quando usare un apostrofo prima di un vettore.

2

Nel secondo esempio la citazione ' è lì per impedire al valutatore di valutare il modulo dopo di esso (il vettore).

I simboli al suo interno non sono auto-valutanti (leggi di più qui http://clojure.org/evaluation) e il valutatore cercherebbe di risolverli.

E. g.

(def foo 42) 

[foo] 
=> [42] ;; vector with number 42, resolved via foo 

'[foo] 
=> [foo] ;; vector with the symbol foo, decoupled from the var foo 

Si consiglia di leggere un altro quote esempio qui http://clojure.org/special_forms#quote, e scavare più a fondo per conoscere il lettore e la sintassi citazione qui: http://clojure.org/reader

Problemi correlati