Ho cercato di capire la differenza tra Lisp-1 e Lisp-2 e come ciò si riferisce a Clojure, ma non riesco ancora a capire correttamente. Qualcuno può illuminarmi?Qual è la differenza tra Lisp-1 e Lisp-2?
risposta
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.
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.
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? –
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
@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
- 1. Qual è la differenza tra = e: =
- 2. Qual è la differenza tra Verilog! e ~?
- 3. Qual è la differenza tra? : e ||
- 4. qual è la differenza tra [[], []] e [[]] * 2
- 5. Qual è la differenza tra $ e $$?
- 6. Qual è la differenza tra ("") e (null)
- 7. Qual è la differenza tra dict() e {}?
- 8. Qual è la differenza tra " " e ""?
- 9. Qual è la differenza tra {0} e ""?
- 10. Qual è la differenza tra `##` e `hashCode`?
- 11. Qual è la differenza tra {0} e +?
- 12. Qual è la differenza tra .ToString() e + ""
- 13. qual è la differenza tra:.! e: r !?
- 14. Qual è la differenza tra "è Nessuno" e "== Nessuno"
- 15. Unix: Qual è la differenza tra la fonte e l'esportazione?
- 16. Qual è la differenza tra il callback e la promessa
- 17. Qual è la differenza tra la sezione .got e .got.plt?
- 18. Qual è la differenza tra la lista() e []
- 19. Qual è la differenza tra GHC e la piattaforma Haskell?
- 20. Qual è la differenza tra sé e la finestra?
- 21. Qual è la differenza tra la cartella vim72 e vimfiles?
- 22. Qual è la differenza tra la serratura e RLock
- 23. Qual è la differenza tra la funzione() {}() e function() {}()
- 24. Qual è la differenza tra la crittografia SHA e AES?
- 25. Qual è la differenza tra la [OptionalField] e [NonSerialized]
- 26. Qual è la differenza tra Chisel e Lava e CLaSH?
- 27. Qual è la differenza tra queste funzioni
- 28. Qual è la differenza tra queste funzioni?
- 29. Qual è la differenza tra Response.Write() eResponse.Output.Write()?
- 30. Qual è la differenza tra applicationDidReceiveMemoryWarning, didReceiveMemoryWarning?
Non è un Lisp-2 più confuso avere funzioni e variabili con gli stessi nomi allora? – Zubair
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
@Zubair Java ha ancora più spazi per i nomi. È possibile definire una classe, un metodo e una variabile con lo stesso nome. – ceving