Qual è la differenza tra Lisp-1 e Lisp-2?


94

Ho cercato di capire la differenza tra Lisp-1 e Lisp-2 e come questo si riferisce a Clojure ma ancora non capisco bene. Qualcuno può illuminarmi?

Risposte:


68

Secondo wikipedia :

Se uno spazio dei nomi separato per le funzioni sia un vantaggio è una fonte di contesa nella comunità Lisp. Di solito è indicato come il dibattito Lisp-1 vs Lisp-2. Lisp-1 si riferisce al modello di Scheme e Lisp-2 si riferisce al modello di Common Lisp.

Si tratta fondamentalmente di stabilire se variabili e funzioni possono avere lo stesso nome senza scontrarsi. Clojure è un Lisp-1, il che significa che non consente l'uso dello stesso nome per una funzione e una variabile contemporaneamente.


11
Non è un Lisp-2 più confuso avere funzioni e variabili con gli stessi nomi allora?
appshare.co

39
Parte del motivo è che i programmatori che usano i dialetti Lisp-2 non fanno di tutto per avere funzioni e variabili con lo stesso nome. listè spesso usato come parametro di funzione e nessuno fa niente, OMG che è così confuso poiché (list ...)è una funzione standard. Molte funzioni che hanno listcome variabile non usano la listfunzione, o non la usano vicino a quella variabile. Anche quando ciò dovesse accadere non è troppo male: (list foo list). Questo non è più confuso di una frase come "combatti il ​​buon combattimento" in cui la stessa parola appare come sostantivo e verbo.
Kaz

5
@Zubair Java ha ancora più spazi per i nomi. Puoi definire una classe, un metodo e una variabile con lo stesso nome.
Ceving

19
Come mnemonico, penso che Lisp 1s abbia 1 spazio dei nomi e Lisp 2s abbia 2 spazi dei nomi (uno per le funzioni e uno per le variabili).
Nick McCurdy

4
@NickMcCurdy Come mnemonico, penso che una bicicletta abbia due ruote e un triciclo ne abbia tre.
Kaz

71

Ti potrebbe piacere leggere questo articolo di Richard Gabriel. È un riepilogo delle questioni che la comunità Lisp stava discutendo in Lisp1 vs Lisp2. È un po 'denso e si muove lentamente nelle prime sezioni, ma è molto più facile da leggere quando si supera la sezione 5.

Fondamentalmente, Lisp1 ha un unico ambiente che mappa i simboli sui valori, e questi valori possono essere "regolari" o funzioni. Lisp2 ha (almeno) due spazi dei nomi (i simboli hanno uno slot per il loro valore di una funzione e uno per un valore normale). Quindi, in Lisp2, puoi avere una funzione chiamata foo e un valore chiamato foo, mentre in Lisp1, il nome foo può riferirsi solo a un singolo valore (funzione o altro).

Ci sono diversi compromessi e differenze di gusto tra i due, ma leggi il documento per i dettagli. Anche il libro di Christian Queinnec, "Lisp in Small Pieces" discute delle differenze intessute nel testo.


7
Una delle sezioni più enigmatiche dell'articolo di Gabriel, è la sezione 11 sul multiprocessing. In quella sezione, implica che Lisp1 è più favorevole a uno stile di programmazione funzionale, quindi più favorevole al multiprocessing. Ovviamente, questo è interessante per Clojure. Ma non sono proprio sicuro del motivo per cui Lisp1 è più favorevole a FP. Qualcuno ha un'idea di questo?
Peter McLain

40
probabilmente perché il punto principale di FP è trattare le funzioni come valori di prima classe, quindi è molto più conveniente e concettualmente più pulito trattarle allo stesso modo di tutti gli altri valori
mikera

10
@PeterMcLain Quando gli utenti dei dialetti Lisp-1 dicono che Lisp-1 è più conduttivo per la programmazione funzionale, ciò che intendono è che non devi riempire il codice di operatori funcalle function. Questi scompaiono in un Lisp-1.
Kaz

3
Un esempio di cosa succede quando uno Schemer prova a scrivere Lisp: emacs.stackexchange.com/q/28979/2787
ceving

2
hai usato la frase "almeno" su Lisp-2. La semplice differenziazione tra i 2 casi è: se il simbolo si trova nella posizione iniziale di un'espressione s o meno (in tal caso, cercare nello spazio dei nomi della funzione, altrimenti nello spazio dei nomi della variabile). Puoi fare alcuni esempi di altri, oltre a questi 2 casi?
Daniel Dinnyes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.