Perché dovrei imparare Lisp? [chiuso]


125

Sento davvero che dovrei imparare Lisp e ci sono molte buone risorse là fuori per aiutarmi a farlo.

Non sono scoraggiato dalla sintassi complicata, ma dove nella "programmazione commerciale tradizionale" troverei posti che avrebbe senso usarlo al posto di un linguaggio procedurale.

Esiste un'app killer commerciale là fuori che è stata scritta in Lisp?


5
Difficile essere scoraggiati da ciò che non c'è.
Kaz,

Leggi il curriculum di Philip Greenspun . È pieno di vero lavoro di Lisp.
Kaz,

1
Anche qui . Greenspun ha lavorato alla simulazione della rete a commutazione di pacchetto, alla progettazione DSP, alla progettazione del processore, al layout VLSI, all'automazione dell'ingegneria meccanica, all'automazione del movimento terra, e così via, il tutto usando Lisp o coinvolgendo Lisp. Ha contribuito a progettare l'architettura PA-RISC di Hewlett Packard utilizzando strumenti sviluppati su una macchina Lisp.
Kaz,

Ecco alcune app sviluppate in Lisp - Emacs, G2, AutoCad, Igor Engraver e Yahoo Store
Arulx Z

Risposte:


55

Uno degli usi principali di Lisp è l'intelligenza artificiale. Un mio amico al college ha frequentato un corso di IA diplomato e per il suo progetto principale ha scritto un solutore " Lights Out " a Lisp. Più versioni del suo programma hanno utilizzato routine AI leggermente diverse e i test su circa 40 computer hanno prodotto risultati piuttosto accurati (vorrei che fosse online da qualche parte per collegarmi, ma non credo che lo sia).

Due semestri fa ho usato Scheme (un linguaggio basato su Lisp) per scrivere un programma interattivo che simulasse la routine "Who's on First" di Abbott e Costello. L'input dell'utente è stato confrontato con alcune strutture di dati piuttosto complicate (simili a mappe in altre lingue, ma molto più flessibili) per scegliere quale sarebbe stata la risposta appropriata. Ho anche scritto una routine per risolvere un puzzle di diapositive 3x3 (un algoritmo che potrebbe essere facilmente esteso a puzzle di diapositive più grandi).

In sintesi, l'apprendimento di Lisp (o Scheme) potrebbe non produrre molte applicazioni pratiche oltre l'IA ma è un'esperienza di apprendimento estremamente preziosa, come molti altri hanno affermato. La programmazione in un linguaggio funzionale come Lisp ti aiuterà anche a pensare in modo ricorsivo (se hai avuto problemi con la ricorsione in altre lingue, questo potrebbe essere di grande aiuto).


5
Perché dici che Lisp è buono solo per l'IA? Inoltre, è un linguaggio multi-paradigma. Funzionale è solo uno dei numerosi paradigmi che consente.
Luís Oliveira,

6
Non ho detto che è usato solo per l'IA, ho detto che uno dei suoi usi principali è l'IA. L'hai letto?
Justin Bennett,

32
"Per favore, non dare per scontato che Common Lisp sia utile solo per Database, Frame Test Unit, Filtri antispam, ID3 Parser, Programmazione Web, Server Shoutcast, Interpreti di generazione HTML e Compilatori di generazione HTML solo perché queste sono le uniche cose che sono state implementate in il libro Practical CL "
Mikael Jansson,

23
@JustinBennett sì, l'hai detto. Qui: "In sintesi, l'apprendimento di Lisp (o Scheme) potrebbe non produrre molte applicazioni pratiche oltre l'IA". Odio quando le persone si confrontano mentre si sbagliano.
Luka Ramishvili,

127

Lisp è un linguaggio ampio e complesso con un runtime ampio e complesso per supportarlo. Per questo motivo, Lisp è più adatto a problemi grandi e complessi.

Ora, un problema complesso non è lo stesso di un problema complicato . Un problema complesso è quello con molti piccoli dettagli, ma che non è difficile. Scrivere un sistema di prenotazione di una compagnia aerea è un'attività complessa, ma con abbastanza soldi e programmatori non è difficile. Prendi la differenza?

Un problema complicato è quello contorto, uno in cui la divisione e la conquista tradizionali non funzionano. Controllo di un robot o utilizzo di dati non tabulari (ad esempio le lingue) o situazioni altamente dinamiche.

Lisp è davvero adatto a problemi in cui la soluzione deve essere espandibile; l'esempio classico è l'editor di testo emacs. È completamente programmabile e quindi un ambiente di programmazione a sé stante.

Nel suo famoso libro PAIP , Norvig afferma che Lisp è l'ideale per la programmazione esplorativa. Cioè, programmare una soluzione a un problema che non è del tutto chiaro (al contrario di un sistema di prenotazione online). In altre parole: problemi complicati.

Inoltre, l'apprendimento di Lisp ti ricorderà qualcosa di fondamentale che è stato dimenticato: la differenza tra Von Neumann e Turing. Come sappiamo, il modello di calcolo di Turing è un interessante modello teorico, ma inutile come modello per la progettazione di computer. Von Neumann, d'altra parte, progettò un modello di come i computer e il calcolo dovevano essere eseguiti: il modello Von Neumann. Fondamentale per il modello Von Neumann è che hai solo una memoria e memorizza sia il tuo codice che i tuoi dati. Nota attentamente che un programma Java (o C #, o qualunque cosa ti piaccia) è una manifestazione del modello di Turing. Stabilisci il tuo programma concretamente, una volta per tutte. Quindi speri di poter gestire tutti i dati che vengono generati su di esso.

Lisp mantiene il modello Von Neuman; non esiste un confine preciso e predeterminato tra codice e dati. La programmazione in Lisp ti apre la mente al potere del modello Von Neumann. La programmazione in Lisp ti fa vedere vecchi concetti sotto una nuova luce.

Infine, essendo interattivo, imparerai a interagire con i tuoi programmi mentre li sviluppi (invece di compilarli ed eseguirli). Questo cambia anche il modo di programmare e il modo di vedere la programmazione.

Con questa introduzione posso finalmente offrire una risposta alla tua domanda: troverai luoghi in cui supera le lingue "tradizionali"?

Se sei un programmatore avanzato, hai bisogno di strumenti avanzati. E non esiste uno strumento più avanzato di Lisp. Oppure, in altre parole: la risposta è sì se i tuoi problemi sono difficili. No altrimenti


30
"ma con abbastanza soldi e programmatori non è difficile" - detto questo, dato un numero sufficiente di programmatori diventa impossibile ;-)
Jonas Kölker,

Ho letto della capacità di lisps di generare codice al volo, ma ho anche letto che può essere compilato ... ci sono implementazioni che possono mescolare l'esecuzione interpretata e compilata? o che contengono il proprio compilatore?
centaurian_slug,

@centaurian_slug: Sì, assolutamente. Fa parte del potere. Qualsiasi versione che non sia stata deliberatamente paralizzata avrà il suo compilatore / interprete disponibile in fase di esecuzione. Quindi, ad esempio, uno sviluppatore può accedere a una connessione speciale sul proprio server Web, eseguire il debug, aggiornare alcune definizioni di classi e funzioni e, eventualmente, ricompilare tutto ciò che si basava su tali definizioni. Tutto mentre il server è attivo e funzionante. Probabilmente non legale in un'azienda preoccupata per la conformità SOX, ma questo è uno dei motivi per cui le industrie usano linguaggi Braindead come Java e C #
James


46

sintassi complicata ??

La sintassi per lisp è incredibilmente semplice .

App Killer scritta in lisp: emacs . Lisp ti permetterà di estendere emacs a piacimento per fare quasi tutto ciò che puoi pensare che un editor possa fare.

Ma dovresti imparare il lisp solo se lo desideri , e potresti non usarlo mai al lavoro, ma è comunque fantastico.

Inoltre, voglio aggiungere: anche se trovi luoghi in cui lisp avrà senso, probabilmente non convincerai nessun altro che dovrebbe essere usato su java, c ++, c #, python, ruby, ecc.


@Justin: Probabilmente vale la pena notare che emacs core è scritto in C. Ma questo è solo nit-picking: tutti i comandi sono scritti in elisp.
Bernard,

3
o meglio - la sintassi principale di lisp comune è semplice. defmacro consente di estendere la sintassi e alcune delle macro integrate (come defmacro) possono diventare incredibilmente complicate; elenchi lambda, backquotes nidificati, ecc.
Aaron,

È quasi giusto dire che la parte C di emacs è il codice colla.
Luka Ramishvili,

Secondo il manuale di riferimento di Emacs, "La maggior parte dei comandi di modifica in Emacs sono scritti in Lisp; le poche eccezioni avrebbero potuto essere scritte in Lisp ma usano C invece per efficienza." gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch

25

Non posso rispondere per esperienza diretta, ma dovresti leggere ciò che Paul Graham ha scritto su Lisp . Per quanto riguarda la parte "killer-app", leggi Battere le medie .


2
+1. Questa risposta dovrebbe menzionare Yahoo Stores, la prima app Web, è stata parzialmente scritta in lisp. Citando Wikipedia: nel 1998, Yahoo! Inc. ha acquistato Viaweb per 455.000 azioni di Yahoo! azione, valutato a circa $ 49 milioni e ribattezzato Yahoo! Negozio.
Steven Lu

17

Ho programmato in Lisp professionalmente per circa un anno, e vale sicuramente la pena imparare. Avrai un'impareggiabile opportunità di rimuovere la ridondanza dal tuo codice, essendo in grado di sostituire tutto il codice del boilerplate con funzioni ove possibile e macro dove no. Sarai anche in grado di accedere a una flessibilità senza pari in fase di esecuzione, traducendo liberamente tra codice e dati. Pertanto, le situazioni in cui le azioni dell'utente possono innescare la necessità di costruire strutture complesse in modo dinamico è dove Lisp brilla davvero. I pianificatori dei voli delle compagnie aeree più diffuse sono scritti in Lisp e in Lisp esiste anche un sacco di CAD / CAM.


9

Se ti piace programmare dovresti imparare Lisp per la pura gioia di farlo. XKCD esprime perfettamente l'illuminazione intellettuale che ne deriva. Imparare Lisp è per il programmatore ciò che la meditazione è per il monaco buddista (e intendevo questo senza alcuna connotazione blasfema).


9

Lisp è molto utile per creare piccoli DSL. Ho una copia di Lisp in a Box in esecuzione sul lavoro e ho scritto piccoli DSL per interrogare i database del server SQL e generare livelli di dati ecc. In C #. Tutto il codice della mia piastra della caldaia è ora scritto in macro lisp che vengono emesse in C #. Genero HTML, XML, ogni sorta di cose con esso. Mentre vorrei poter usare Lisp per la codifica quotidiana, Lisp può apportare vantaggi pratici.



5

Qualsiasi lingua sembra molto più difficile quando non si usano le convenzioni di rientro comuni di una lingua. Quando uno li segue di Lisp, si vede come esprime una struttura ad albero di sintassi abbastanza prontamente (nota, questo non è del tutto corretto perché l'anteprima si trova un po '; le r dovrebbero allinearsi con i fns nell'argomento ricorsivo di quicksort):

(defun quicksort (lis) 
  (if (null lis) 
      nil
      (let* ((x (car lis)) 
             (r (cdr lis)) 
             (fn (lambda (a) 
                   (< a x))))
         (append (quicksort (remove-if-not fn 
                                           r)) 
                 (list x)
                 (quicksort (remove-if fn 
                                       r))))))

1
Penso che ci sia una giusta critica in quello che dici. Intendo solo dire "sembra molto più difficile come lo hai presentato e sembra molto più chiaro come è presentato qui". Penso che dovresti essere d'accordo sul fatto che molte lingue sembrano molto più confuse se le loro convenzioni di rientro non vengono seguite. Inoltre, se confrontiamo il rientro di, diciamo Java e Lisp, direi che in genere richiedono circa lo stesso livello di conoscenza dei costrutti di base di ogni lingua per indentarli correttamente. Ma è giusto, sebbene del tutto soggettivo, dire che sembra ancora difficile.
John with waffle,

1
Per renderlo un po 'più semplice, è possibile utilizzare lo standard lete utilizzare defuna all'inizio della funzione per definire fnin quanto non cambia.
Aaron Robson il

4
@FerretallicA Su quali basi determini se qualcosa è "facilmente leggibile dall'uomo" o "auto-descrivente"? Somiglianza con l'inglese? Il cinese è "facilmente leggibile dall'uomo"? Che dire della notazione matematica? "Non è facilmente leggibile dall'uomo"? Questo tipo di argomento è fastidioso senza senso, perché il suo messaggio nascosto è: "Questo non sembra il modo in cui ho imparato a ragionare."

3
Più come la tua "confutazione" suona come "Whinge whinge". Prova il test sniff del linguaggio di programmazione. Prendi qualcuno che non ha programmato prima e mostra loro una pagina di codice VB e una pagina di codice Lisp. Scommetto felicemente il mio dado sinistro su quale dei due l'osservatore casuale sarà più facilmente in grado di trarre osservazioni significative.
nathanchere,

1
Mi chiedo cosa penserebbe un non programmatore cinese, giapponese, coreano, sumero, hindi o arabo del tuo desiderio piuttosto sfacciato di rinunciare al tuo testicolo per una discussione facile.

4

Ho scoperto che l'apprendimento di una nuova lingua influenza sempre il tuo stile di programmazione nelle lingue che già conosci. Per me mi ha sempre fatto pensare in modi diversi per risolvere un problema nella mia lingua principale, che è Java. Penso che in generale allarghi il tuo orizzonte in termini di programmazione.


È perché sei un buon programmatore. I cattivi programmatori, invece di influenzare le vecchie abilità con nuove conoscenze, pensano in lingue già conosciute mentre scrivono in nuove. Ma perché stai usando Java dopo lisp? :) Java è più difficile da usare dopo Lisp, imo.
Luka Ramishvili,

4

Se devi chiederti se dovresti imparare lisp, probabilmente non è necessario.


8
Direi il contrario: se capisci già lisp perché hai esperienza con un linguaggio simile, probabilmente non è necessario. Se non capisci cosa ha da offrire lisp, potresti trarre beneficio dall'esposizione.
Mr Fooz,

@MrFooz non ci sono lingue simili che possono rimuovere la necessità di imparare la parte lispy di lisp. Le caratteristiche principali di lisp non si trovano in nessuna lingua. Anche se la maggior parte lo è.
Luka Ramishvili,

A seconda dei tuoi obiettivi. Se vuoi morire, non hai bisogno di respirare. Ma ciò non significa che non dovresti.
mimoralea,

4

Ho preso una "classe lisp" al college negli anni ottanta. Nonostante il trekking tutti i concetti presentati in classe, sono rimasto senza alcun apprezzamento per ciò che rende fantastico il lisp. Temo che molte persone considerino lisp solo un altro linguaggio di programmazione, che è quello che quel corso al college ha fatto per me tanti anni fa. Se vedi qualcuno lamentarsi della sintassi di lisp (o della sua mancanza), ci sono buone probabilità che siano una di quelle persone che non sono riuscite a cogliere la grandezza di lisp. Sono stato una di quelle persone per molto tempo.

Solo due decenni dopo, quando ho riacceso il mio interesse per lisp, ho iniziato a "ottenere" ciò che rende lisp interessante - per me comunque. Se riesci ad imparare lisp senza farti saltare la testa da chiusure e macro lisp, probabilmente hai perso il punto.


Sono d'accordo con questo. Sono attualmente alla mia seconda incursione a Lisp, a 5 anni da scuola. Un termine di Lisp quando sei ancora verde potrebbe non avere un effetto adeguato - ricordo di essermi concentrato solo sulla metaprogrammazione e non avevo ancora apprezzato la metaprogrammazione e la flessibilità.
Aaron,

4

L'apprendimento di LISP / Scheme potrebbe non darti spazio aggiuntivo per le applicazioni, ma ti aiuterà a capire meglio la programmazione funzionale, le sue regole e le sue eccezioni.

Vale la pena investire tempo solo per imparare la differenza nella bellezza di sei funzioni nidificate pure e l'incubo di sei funzioni nidificate con effetti collaterali.


4

Da http://www.gigamonkeys.com/book/introduction-why-lisp.html

Uno dei miti più comunemente ripetuti su Lisp è che è "morto". Mentre è vero che Common Lisp non è così ampiamente usato come, diciamo, Visual Basic o Java, sembra strano descrivere un linguaggio che continua ad essere usato per nuovi sviluppi e che continua ad attrarre nuovi utenti come "morti". Alcune recenti storie di successo di Lisp includono Viaweb di Paul Graham, che divenne Yahoo Store quando Yahoo acquistò la sua azienda; QPX, il sistema di tariffazione e shopping del biglietto aereo di ITA Software, utilizzato dal venditore di biglietti online Orbitz e altri; Il gioco di Naughty Dog per PlayStation 2, Jak e Daxter, che è in gran parte scritto in un dialetto Lisp specifico per il dominio che Naughty Dog ha inventato chiamato GOAL, il cui compilatore è esso stesso scritto in Common Lisp; e il Roomba, l'aspirapolvere robot autonomo, il cui software è scritto in L, un sottoinsieme compatibile al ribasso di Common Lisp. Forse ancora più significativo è la crescita del sito Web Common-Lisp.net, che ospita progetti Common Lisp open source, e il numero di gruppi di utenti Lisp locali che sono sorti negli ultimi due anni.


4

"Vale la pena imparare a Lisp per la profonda esperienza di illuminazione che avrai quando finalmente la otterrai; quell'esperienza ti renderà un programmatore migliore per il resto dei tuoi giorni, anche se non usi mai molto Lisp stesso."

- Eric S. Raymond, "Come diventare un hacker"

http://www.paulgraham.com/avg.html


3

Sono d'accordo che Lisp è una di quelle lingue che non puoi mai usare in un contesto commerciale. Ma anche se non ci riesci, l'apprendimento amplierà sicuramente la tua comprensione della programmazione nel suo insieme. Ad esempio, ho imparato Prolog al college e mentre non l'ho mai usato dopo, mi hanno dato una maggiore comprensione di molti concetti di programmazione e (a volte) un maggiore apprezzamento per le lingue che uso.

Ma se lo imparerai ... leggi tutto su Lisp


Piccola nota: Su Lisp non è un'introduzione adatta a Lisp, leggi prima qualcos'altro. Raccomando Practical Common Lisp.
Luís Oliveira,

3

Imparare lisp metterà Javascript sotto una luce completamente diversa! Lisp ti obbliga davvero ad afferrare sia la ricorsione che l'intero "funzioni come oggetti di prima classe". Vedi l'articolo eccellente di Crockfords su Scheme vs Javascript . Javascript è forse il linguaggio più importante in circolazione oggi, quindi capirlo meglio è immensamente utile!


1
La lingua più importante? Non credo, signore.
TraumaPony,

7
Bene, è disponibile praticamente su qualsiasi dispositivo che abbia un browser Web (e probabilmente alcuni che non lo fanno), quindi per quanto riguarda i linguaggi per l'esecuzione delle applicazioni degli utenti finali, ha probabilmente la più alta penetrazione di qualsiasi linguaggio di programmazione sul pianeta . Ovviamente potresti avere un'opinione completamente diversa su ciò che è importante. Sarà usato per curare il cancro? Probabilmente no. Ma, piaccia o no, sarà una delle pietre miliari dello sviluppo di applicazioni (web) per gli anni a venire.
Erlend Halvorsen,

1
Sono andato allo stesso modo! Anche se stavo già utilizzando le funzionalità funzionali e di prototipazione di Javascript, dopo aver appreso Lisp Javascript era per me una nuova lingua.
Luka Ramishvili,


3

Okay, potrei essere strano, ma non mi piacciono molto i saggi di Paul Graham sul fatto che su Lisp sia un libro molto approssimativo se non hai già una buona conoscenza di Common Lisp. Invece, direi di usare il Lisp comune pratico di Siebel . Per quanto riguarda le "killer-app", Common Lisp sembra trovare il suo posto in negozi di nicchia, come ITA , quindi mentre non esiste un'app sinonimo di CL come Rails è per Ruby, ci sono posti nell'industria che la usano se lo fai un po 'di scavo.


2

Sintassi complicata? Il bello di lisp è che ha una sintassi ridicolmente semplice. È solo un elenco, in cui ogni elemento dell'elenco può essere un altro elenco o un tipo di dati elementare.

Vale la pena imparare a causa del modo in cui migliora la capacità di codifica di pensare e utilizzare le funzioni come un altro tipo di dati. Ciò migliorerà il modo in cui codifichi in un linguaggio imperativo e / o orientato agli oggetti perché ti permetterà di essere più mentalmente flessibile con la struttura del tuo codice.


2

Per aggiungere alle altre risposte:

Perché il corso SICP (i video sono disponibili qui ) è fantastico: ti insegna Lisp e molto altro !


2

Killer app? Franz Inc. ha una lunga lista di storie di successo , ma questa lista include solo gli utenti di AllegroCL ... Probabilmente ce ne sono altri. La mia preferita è la storia di Naughty Dog , da quando ero un grande fan dei giochi di Crash Bandicoot.

Per imparare Common Lisp, consiglierei Practical Common Lisp . Ha un approccio pratico che almeno per me ha reso più facile di altri libri che ho visto.


2

Oggi puoi usare Clojure per scrivere test e script sulla VM Java. Mentre ci sono altri linguaggi Lisp implementati su JVM, penso che Clojure faccia il miglior lavoro di integrazione con Java.

Ci sono momenti in cui il linguaggio Java stesso ostacola la scrittura di test per il codice Java (inclusa la "programmazione commerciale tradizionale"). (Non intendo questo come accusa di Java - altre lingue soffrono dello stesso problema - ma è un dato di fatto. Dato che l'argomento, non Java, non elaborerò. Sentiti libero di iniziare un nuovo argomento se qualcuno vuole discuterne.) Clojure elimina molti di quegli ostacoli.


2

Lisp può essere usato ovunque usi la programmazione tradizionale. Non è così diverso, è solo più potente. Scrivi un'app Web? puoi farlo su Lisp, scrivendo un'applicazione desktop? puoi farlo su Lisp, qualunque cosa, probabilmente puoi farlo su Lisp, o Python, o su qualsiasi altra programmazione generica (ci sono alcuni linguaggi adatti per un solo compito).

L'ostacolo maggiore sarà probabilmente l'accettazione del tuo capo, dei tuoi colleghi o dei tuoi clienti. È qualcosa che dovrai lavorare con loro. Scegliere una soluzione pragmatica come Clojure in grado di sfruttare l'attuale base di installazione dell'infrastruttura Java, dalla JVM alle librerie, potrebbe aiutarti. Inoltre, se si dispone di un programma Java, è possibile eseguire un'architettura plug-in e scrivere plug-in Clojure per esso e finire per scrivere metà del codice in Clojure.


1

Non un motivo ma (banale) AutoCAD ha il supporto di runtime LISP e DCL. È un modo conveniente per scrivere macro complesse (inclusa l'automazione ActiveX) se non si desidera utilizzare VBA o i loro SDK C ++ o .NET o se un'espressione DIESEL non la taglia.

Molte funzioni di AutoCAD sono in realtà routine LISP.


1

Questo è un argomento su cui io stesso ho riflettuto per un po ', ma non ho davvero preso una decisione, come al solito il problema principale è il tempo ...;)

E dal momento che non riesco a trovare questi link in questo post, li aggiungo per interesse pubblico:

Storia di successo e fallimento: Lisping alla JPL

Storia di successo davvero impressionante: Lisp in uso presso la società Orbitz

Confronto e analisi sull'opportunità di utilizzare Lisp anziché Java: Lisp come alternativa a Java




0

Killer app? Il motore di ricerca di voli di ITA Software è uno di questi.

Per quanto riguarda "perché", molto probabilmente ti renderà uno sviluppatore migliore ed è estremamente improbabile che ti faccia diventare uno peggiore. Potrebbe, tuttavia, farti preferire dialetti lisp ad altre lingue.

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.