2015-03-31 21 views
6

In Common Lisp, il let utilizza un elenco per un binding, vale a dire:Clojure lasciare vs Common Lisp lasciare

(let ((var1 1) 
     (var2 2)) 
    ...) 

Mentre Clojure utilizza un vettore invece:

(let [a 1 
     b 2] 
    ...) 

C'è un motivo specifico , oltre alla leggibilità, per Clojure usare un vettore?

+2

La sintassi 'LET' non è una caratteristica specifica di Common Lisp. Fondamentalmente ogni Lisp (Emacs Lisp, ISLisp, Scheme, ...) supporta questa sintassi. Clojure no. –

+4

Clojure 'let' si lega in sequenza. Quindi è equivalente a CL e Schema 'let *'. – Sylwester

risposta

8

È possibile trovare l'argomento di Rich Hickey a Simple Made Easy - slide 14, circa 26 minuti in:

Simple Made Easy - slide 14

+0

Sì, penso che l'indizio sia in questa frase: "sovraccarico per le chiamate ang grouping". Grazie! – kamituel

+2

Ora le parentesi quadre sono sovraccariche con (meno) il raggruppamento e la sintassi del vettore. –

+1

@RainerJoswig Se non fosse che si legano in sequenza, potrebbe essere stato più logico utilizzare una mappa letterale '{...}' invece di un vettore letterale '[...]' per Clojure 'let' e' loop'. – Thumbnail

2

linea di Rich su questo è stato il seguente

"Dal momento che stavamo parlando di sintassi , diamo un'occhiata al classico Lisp . Sembra essere la più semplice della sintassi, tutto è un elenco di simboli, numeri e alcune altre cose tra parentesi, potrebbe essere più semplice? In realtà, non è il più semplice, dal momento che a raggiungere quell'uniformità, ci deve essere un sostanziale sovraccarico di il significato delle liste. Possono essere chiamate di funzione, raggruppamenti di costrutti o letterali di dati, ecc. E determinare quale richiede utilizzando il contesto, aumentando il carico cognitivo quando si esegue la scansione del codice su valutarne il significato. Clojure aggiunge un paio di ulteriori dati letterali compositi agli elenchi e li utilizza per la sintassi. In tal modo, significa che gli elenchi sono quasi sempre elementi simili a una chiamata, mentre i vettori vengono utilizzati per il raggruppamento, e le mappe hanno i loro letterali. Si spostano da una struttura di dati per tre riduce il carico cognitivo sostanzialmente."

Una delle cose in cui crede è stato sovraccaricato nella sintassi standard è stato il tempo di accesso. Sintassi vettore Così in argomenti è legato al tempo di accesso costante quando Li ha usati:

Sembra strano anche se è valido solo per quel modulo ... non appena viene memorizzato in una variabile o passato in alcun modo l'informazione viene "persa". ..

(defn test [a] 
    (nth a 0)) ;;<- what is the access time of and element of a? 

Personalmente preferisco s duro yntax cambia come parentesi da riservare a quando il programmatore deve cambiare i modelli mentali, ad es. per le lingue incorporate.

;; Example showing a possible syntax for an embedded prolog. 

{size [],0} 
{size([H|T],N) :- size(T,N1), N is N1+1} 

(size '(1 2 3 4) 'n) ;; here we are back to lisp code 

Tale concetto è sintatticamente costante. Non si esegue la "pass through" della struttura in fase di esecuzione. Prima del runtime (leggere/macro/tempo di compilazione) è un altro problema, anche se, dove possibile, è spesso meglio mantenere le cose come liste.

[edit] La fonte originale sembra essere andato, ma qui è un altro record del colloquio: https://gist.github.com/rduplain/c474a80d173e6ae78980b91bc92f43d1#file-code-quarterly-rich-hickey-2011-md

+2

April fools? Il tempo di accesso non può essere sovraccaricato. Non in una sintassi, non in generale. Il tempo di accesso può essere osservato o previsto. I vettori in Clojure non hanno un tempo di accesso costante. I nomi di riferimento non trasmettono il tipo o le informazioni sul tempo di accesso a meno che non li nominiate in modo tale che lo facciano. In ogni caso ciò è irrilevante per la sintassi e la costruzione tramite letterali. Clojure non "incorpora" il Prolog o alcuna lingua, quindi la preferenza per conservare le parentesi per le lingue di inclusione è come chiedere ad un'auto di avere le ali al posto delle porte. La macro di definizione delle funzioni di primo livello di Clojures si chiama 'defn', non" defun ". –

+0

Ho corretto l'errore di battitura e per chiarire, la linea di Rich (sto cercando di trovare la fonte) era che la lista dei modi in cui era usato era sovraccaricata. Non solo in termini di raggruppamento ma anche in termini di tempo di accesso. Poiché il tempo di accesso di un elemento è un elenco e un elemento in un vettore non è uguale, quindi i vettori per raggruppare gli argomenti sono una scelta migliore in quanto riflette il tempo di accesso (approssimativo) costante. Inoltre non ho detto che il clojure ha incorporato il prolog, ho detto * preferisco * la sintassi è riservata all'uso di cose come i linguaggi incorporati. Potresti anche aver notato il tag common-lisp nella domanda ... – Baggers

+0

..questo significa che ci saranno risposte relative a cose che puoi fare in comune lisp come estendere il lettore – Baggers