Quale dialetto del Lisp dovrei imparare? [chiuso]


89

So che ci sono diversi dialetti del Lisp. Avendo deciso che imparare il Lisp sarebbe stata una nuova esperienza intellettuale, mi piacerebbe sapere quale dialetto Lisp imparare e perché.

Ce n'è uno più popolare degli altri? Qualcuno di loro è più "completo", come in, meglio documentato e supportato? Quali sono i pro e i contro di questo dialetto?



Ho fatto una ricerca su questo prima di chiederlo, ma la natura della domanda si è evoluta mentre la scrivevo. Mi assicurerò di non reinventare la ruota.
Humphrey Bogart,

Allora qual è la differenza tra questa domanda e quella che Greg menziona sopra?
cjs

2
Penso che quello che stava cercando di dire fosse: quando ho formulato per la prima volta la mia domanda nella mia mente, era completamente diversa da quella attuale e guardare le domande nella ricerca correlata non ha rivelato nessuna che corrispondesse a ciò che voleva Chiedi. Ma quando ha digitato la domanda, questa era cambiata e quindi è arrivata a SO nella sua forma attuale, che era stata posta in precedenza.
J. Polfer

Risposte:


77

Vuoi cercare un equilibrio tra semplicità e pulizia, caratteristiche attraenti e una piattaforma che ti permetta di scrivere software interessante e utile (per te stesso) oltre a servire come strumento di apprendimento. (Quest'ultimo ti farà andare avanti e imparare per molto più tempo.) Ecco alcune possibilità:

  1. Schema. Probabilmente il più pulito di tutti i dialetti. Questo è senza dubbio il motivo per cui The Little Schemer è stato tradotto da LISP in Scheme. La quinta specifica dello standard Scheme, R5RS , è un'istruzione meravigliosa in sé e per sé; potrebbe essere il linguaggio e le specifiche della libreria più belli che abbia mai letto, nonché il più breve che è ragionevolmente completo. La piattaforma PLT Scheme (ora Racket) include un interprete e un compilatore abbastanza decenti, è utile per lo scripting e ha anche alcuni strumenti visivi che lo rendono eccellente per l'apprendimento.

  2. Common Lisp. Probabilmente la variante più portatile e completa, questo è molto probabilmente quello che vuoi se vuoi scrivere cose come software commerciale. Lo standard definisce ampie librerie, e molte altre sono disponibili oltre a questo, ha CLOS , che probabilmente ti insegnerà di più su OO di quanto potrebbe fare qualsiasi linguaggio OO, e alcuni dei compilatori sono molto buoni. Gli svantaggi includono alcune verruche che Scheme non ha (come avere uno spazio dei nomi separato per variabili che si riferiscono a funzioni), non essendo così pulite e semplici (come nel caso di tutto ciò che ha dovuto avere le estensioni e rendere necessari i compromessi per grandi applicazioni nel mondo reale), non avendo macro igieniche e sottolineando la ricorsione molto meno di Scheme.

  3. Clojure.Funziona sulla JVM, che potrebbe dare un vantaggio proprio lì per gli sviluppatori Java. Ha alcune verruche (ad esempio, è necessario chiedere esplicitamente l'ottimizzazione della chiamata di coda, sebbene questo possa cambiare un giorno se il TCO viene aggiunto alla JVM). Le macro, sebbene non igieniche, hanno alcune funzionalità per aiutarti a evitare l'acquisizione di variabili, quindi puoi catturare le variabili se lo desideri, correndo meno rischi di farlo accidentalmente rispetto a CL. Hai un facile accesso a tutte le librerie Java; questa è probabilmente una buona cosa per il codice del "mondo reale" e abbastanza inutile in termini di apprendimento. Ha una serie di librerie per strutture dati persistenti e supporto per STM, che lo rendono molto interessante da un punto di vista concorrente; questo lo rende probabilmente la soluzione migliore se tu ' sei interessato a saperne di più sui nuovi metodi di gestione della programmazione concorrente e parallela. Sembra che Clojure sia utilizzabile per applicazioni di produzione di grandi dimensioni come Java, nel senso che avrà la capacità di fare le "cose ​​brutte" che fai nelle app di produzione che preferiresti non fare e non fare quando stai imparando.

  4. Emacs Lisp. In termini di LISP, questo non è uno dei migliori esempi in circolazione. Uno dei suoi maggiori difetti è lo scoping dinamico, ma ce ne sono molti altri. Tuttavia, se sei un utente Emacs, questo potrebbe essere lo strumento più potente che puoi imparare per migliorare il tuo uso dell'editor. Quanto impareresti davvero imparando Emacs Lisp, oltre a come estendere Emacs, è per me una questione aperta; Non so quante volte tecniche interessanti come le funzioni di ordine elevato siano realmente utilizzate in Emacs Lisp.

Aggiornamento 2018

È passato quasi un decennio da quando ho scritto questo post e la famiglia di linguaggi Lisp ora sembra stia guadagnando una significativa trazione nella coscienza generale del programmatore. Molto di questo sembra essere correlato a Clojure che non solo è diventato un dialetto adeguatamente separato del Lisp a sé stante, introducendo molte delle sue buone idee, ma ora ha anche una versione quasi identica che mira a JavaScript e ha ispirato molti altri Lisp targeting di altre piattaforme. Ad esempio, Hy prende di mira CPython AST e bytecode, mirando prima all'interoperabilità con Python, ma utilizzando le idee Clojure "in caso di dubbio". (Anche se dagli ultimi commit, quest'ultimo potrebbe cambiare un po '.)

Il grande cambiamento che questo comporta nel tuo processo decisionale è che dovresti anche guardare a qualunque linguaggio Lisps o simile a Lisp sia disponibile e interagire con i linguaggi o le piattaforme che già usi, che si tratti di Perl , Ruby , Erlang , Go o anche C ++ su microcontrollori .


3
Avere spazi dei nomi separati non è una verruca, è solo una decisione di progettazione diversa. Tieni presente che ci sono già molti altri spazi dei nomi anche in Scheme, quindi il dibattito è piuttosto Lisp-5 contro Lisp-6. A parte la comodità che posso chiamare una lista "lista" e una macchina "macchina" in CL, il suo sistema macro è molto più pratico e utile, perché il compilatore non confonde le cose così facilmente.
Svante

Clojure non ha l'ottimizzazione delle chiamate di coda e non può, perché il bytecode JVM non lo supporta. Tutto ciò che ha è una forma speciale "ricorre" che auto-ricorre la funzione corrente.
Svante

3
Curt: Direi che Clojure è il più portatile poiché gira su Java VM.
justinhj

1
Non lo so; se si escludono dispositivi piccoli e incorporati (come telefoni e smart card) in cui non si eseguirà comunque un programma desktop / server non modificato, elisp gira sicuramente su molte più CPU e piattaforme rispetto alla JVM.
cjs

1
Sono fortemente in disaccordo. La ricorsione tende a produrre codice che è a) più puro, b) più facile da verificare, c) più probabile che sia corretto. Più in dettaglio: a) tende meno a toccare meno variabili al di fuori della funzione; b) una dimostrazione induttiva tende a uscire naturalmente dalla funzione ricorsiva, mentre con i cicli è necessario controllare le invarianti di ciclo, ecc .; c) l'affidabilità viene da a) e che tendi ad essere spinto a codificare in un modo che naturalmente ti fa fare (forse in modo informale) la prova induttiva di b).
cjs

22

Direi Scheme, solo per il Little Schemer , che è uno dei libri più incredibilmente divertenti ma estremamente difficili che abbia mai provato a leggere.


15
Non dimenticare SICP! mitpress.mit.edu/sicp . Questa è una lettura classica.
Joris Timmermans

7
C'erano due o tre edizioni di The Little Lisper prima che The Little Schemer uscisse come traduzione di quelle.
cjs

9

Posso consigliare Common Lisp su SBCL . Questa combinazione è veloce, potente, matura e ben documentata.


8

Inoltre Clojure sta guadagnando molta condivisione mentale in questi giorni e per una buona ragione. Grandi strutture di dati, supporto per la concorrenza profondamente buono (fa vergognare Scheme e CL a questo proposito) e una grande comunità. È anche relativamente semplice, CL è complicato almeno quanto C ++.

Questo non vuol dire che non mi piaccia CL o Scheme. Ho imparato Scheme con SICP. E CL mi ha portato a Clojure. Dipende tutto dai tuoi obiettivi, suppongo. Se vuoi imparare un Lisp che è immensamente pratico, scegli Clojure. Altrimenti CL o Scheme sono entrambi fantastici.


Ciò sembra implicare che né CL né Scheme siano "immensamente pratici", mentre sono piuttosto pratici in realtà. Soprattutto lo standard CL è nato da considerazioni pratiche.
Leslie P. Polzer

2
Il panorama del linguaggio di programmazione è cambiato dal 1994, non so come lo standard CL cambierà / evolverà per adattarsi a ciò che è stato appreso da quel momento. Il mondo sta avanzando barcollando e, per quanto posso dire, CL è fermo. Mi piace il CL, Clojure ha ancora molta strada da fare per avvicinarsi al suo potere, ma non vedo come si evolverà il CL, se utilizzerai un linguaggio standardizzato deve essere evidente un percorso evolutivo. Senza di essa, molto probabilmente una lingua non è una scelta pratica.
dnolen

4
CL si è evoluto e si sta evolvendo attraverso molte librerie molto utili. La lingua di base era già più potente nel 1994 di tutte le lingue "moderne" odierne.
Svante

5

Preferisco CL, dato che mi piace la programmazione orientata agli oggetti e CLOS è il più bel sistema di oggetti in circolazione.


5
Parlando di CL, consiglierei ClozureCL o SBCL. Entrambi sono open source, ben documentati, maturi, multipiattaforma e forniscono funzionalità non standard cruciali come il multithreading.
Daniel Dickison,

5

Ho imparato Scheme a scuola. È stata una grande esperienza di apprendimento e non dimenticherò mai i fondamenti della programmazione funzionale. Probabilmente non importa quale versione di LISP prendi, a patto di comprendere il nucleo della sua utilità: lambda calcolo senza stato.

Ecco un interessante articolo sul perché il MIT è passato da Scheme a Python nel corso introduttivo alla programmazione.


3

Direi tutti, almeno all'inizio. Alla fine svilupperai probabilmente una preferenza per Scheme o Common Lisp, ma entrambi hanno abbastanza differenze che è meglio avere un controllo su tutto ciò che è là fuori.

Scheme ha delle continuazioni, ad esempio, ed è bene conoscere quelle in Scheme, anche se possono essere implementate in Common Lisp.

Imparare la differenza tra ambito lessicale e dinamico è importante e se impari sia Common Lisp che elisp ti imbatterai nelle implicazioni di entrambi.


0

LFE (Lisp Flavored Erlang) sarebbe carino. Puoi avere la sintassi lisp sopra la macchina virtuale Erlang.


0

Era una specie di domanda "carica" ​​per cominciare, ma probabilmente OP non lo sapeva. Generalmente, Common e Scheme lispers sono come le "persone" di PC e computer Apple, non si mescolano. Qual è il migliore probabilmente non è così rilevante come quale "funziona" per te. Davvero, non c'è molta differenza. Probabilmente una preferenza per l'uno sull'altro potrebbe essere influenzata da quale impari per primo. (Per me, un elenco vuoto dovrebbe essere "niente", noto in CL come NIL, e questo mi rende un Common Lisper.) Mi piace l'integrazione di SBCL con Slime usando EMACS, ma SBCL non è per tutti. Per prima cosa, SBCL è molto severo. Se vuoi solo "divertirti", GNU clisp è facile e disponibile praticamente per ogni piattaforma.

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.