2011-01-02 28 views

risposta

46

Secondo wikipedia:

Se uno spazio dei nomi separato per le funzioni è un vantaggio è una fonte di contesa nella comunità Lisp. Solitamente viene definito 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.

Principalmente si tratta di variabili e funzioni possono avere lo stesso nome senza interferire. Clojure is a Lisp-1 significa che non consente di utilizzare lo stesso nome per una funzione e una variabile contemporaneamente.

+9

Non è un Lisp-2 più confuso avere funzioni e variabili con gli stessi nomi allora? – Zubair

+26

Parte del motivo per cui 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 nessuna cosa, OMG che è così confuso dato che' (list ...) 'è una funzione standard. Molte funzioni che hanno 'list' come variabile non usano la funzione' list', o non la usano vicino a quella variabile. Anche quando ciò accade, non è poi così male: '(list foo list)'. Questo non è più confuso di una frase come "combattere il buon combattimento" in cui la stessa parola appare come un nome e un verbo. – Kaz

+2

@Zubair Java ha ancora più spazi per i nomi. È possibile definire una classe, un metodo e una variabile con lo stesso nome. – ceving

58

Si potrebbe leggere questo paper di Richard Gabriel. È una sintesi dei problemi che la comunità Lisp stava discutendo in Lisp1 vs Lisp2. È un po 'denso e lento nelle prime sezioni, ma è molto più facile da leggere quando si passa alla sezione 5.

Fondamentalmente, Lisp1 ha un singolo ambiente che mappa i simboli ai valori, e quei valori possono essere sia "normale" o funzioni. Lisp2 ha (almeno) due namespace (i simboli hanno uno slot per il loro valore di 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 la carta per i dettagli. Il libro di Christian Queinnec, "Lisp in Small Pieces", ha anche discusso delle differenze tessute attraverso il testo.

+7

Una delle sezioni più enigmatiche del documento Gabriel, è la sezione 11 su Multiprocessing. In quella sezione, implica che Lisp1 è più favorevole a uno stile funzionale di programmazione, quindi più favorevole al multiprocessing. Ovviamente, questo è di interesse per Clojure. Ma non sono proprio sicuro * perché * Lisp1 è più favorevole alla FP. Qualcuno ha un'idea di questo? –

+30

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

+9

@PeterMcLain Quando gli utenti dei dialetti Lisp-1 dicono che Lisp- 1 è più conduttivo per la programmazione funzionale, il loro significato è che non devi riempire il codice pieno di operatori 'funcall' e' function'. Questi scompaiono in un Lisp-1. – Kaz

Problemi correlati