[Functional-Programming] Perché dovrei imparare Lisp?



Answers

Lisp è un linguaggio ampio e complesso con un runtime ampio e complesso che lo supporta. Per questo motivo, Lisp è più adatto a problemi grandi e complicati.

Ora, un problema complesso non è lo stesso di uno complicato . Un problema complesso è uno con molti piccoli dettagli, ma che non è difficile. Scrivere un sistema di prenotazione delle compagnie aeree è un'attività complessa, ma con abbastanza soldi e programmatori non è difficile. Ottieni la differenza?

Un problema complicato è uno che è contorto, uno in cui il tradizionale divide et impera non funziona. Controllare un robot o lavorare con dati che non sono tabulari (lingue, per esempio) o situazioni altamente dinamiche.

Lisp è davvero adatto ai 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 è completamente compreso (al contrario di un sistema di prenotazione on-line). 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 modello teorico interessante, ma inutile come modello per progettare i computer. Von Neumann, d'altra parte, ha progettato un modello di come i computer e il calcolo dovevano essere eseguiti: il modello Von Neumann. Al centro del modello Von Neumann c'è una sola memoria, e lì memorizzi sia il tuo codice che i tuoi dati. Notare attentamente che un programma Java (o C # o qualsiasi cosa tu voglia) è una manifestazione del modello di Turing. Hai impostato il tuo programma in concreto, una volta per tutte. Quindi speri di poter gestire tutti i dati che vengono lanciati su di esso.

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

Infine, essendo interattivo, imparerai a interagire con i tuoi programmi man mano che li sviluppi (al contrario di compilare ed eseguire). Questo cambia anche il tuo modo di programmare e il modo in cui visualizzi la programmazione.

Con questa intro posso finalmente dare una risposta alla tua domanda: troverai posti in cui eclissare le lingue "tradizionali"?

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

Question

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

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

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




Ho programmato in Lisp professionalmente per circa un anno, e vale sicuramente la pena di imparare. Avrai l'opportunità senza precedenti di rimuovere la ridondanza dal tuo codice, potendo sostituire tutti i codici standard con le funzioni ove possibile, e le macro dove no. Sarai anche in grado di accedere a una flessibilità ineguagliabile in fase di runtime, traducendo liberamente tra codice e dati. Pertanto, le situazioni in cui le azioni dell'utente possono innescare la necessità di costruire strutture complesse dinamicamente è dove Lisp brilla davvero. I programmi di volo popolari delle compagnie aeree sono scritti in Lisp, e ci sono anche molti CAD / CAM in Lisp.




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ì diffuso come, ad esempio, Visual Basic o Java, sembra strano descrivere un linguaggio che continua ad essere utilizzato per nuovi sviluppi e che continua ad attrarre nuovi utenti come "morti". Alcune recenti storie di successo dei Lisp comprendono Viaweb di Paul Graham, che è diventato Yahoo Store quando Yahoo ha acquistato la sua azienda; Il sistema di tariffazione e acquisto di biglietti aerei di ITA Software, QPX, utilizzato dal venditore di biglietti online Orbitz e altri; Il gioco di Naughty Dog per PlayStation 2, Jak e Daxter, che è ampiamente scritto in un dialetto Lisp specifico per il dominio, Naughty Dog ha inventato il nome GOAL, il cui compilatore è esso stesso scritto in Common Lisp; e il Roomba, l'aspirapolvere robotico autonomo, il cui software è scritto in L, un sottoinsieme di Common Lisp indirettamente compatibile. 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.




Ho preso una "lisp class" al college negli anni ottanta. Nonostante grokking tutti i concetti presentati in classe, sono rimasto senza alcun apprezzamento per ciò che rende grande il lisp. Ho paura che molte persone guardino il lisp come un altro linguaggio di programmazione, che è quello che quel corso di college ha fatto per me tanti anni fa. Se vedi qualcuno lamentarsi della sintassi del 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 un tempo molto lungo.

Non è stato fino a due decenni più tardi, quando ho riacceso il mio interesse per la chiarezza, che ho iniziato a "ottenere" ciò che rende interessante la Lisp - per me comunque. Se riesci ad apprendere la chiarezza senza che la tua mente venga soffiata da chiusure e macro lisp, probabilmente hai perso il punto.




Se devi chiederti se dovresti imparare la chiarezza, probabilmente non ne hai bisogno.




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

E poiché non riesco a trovare questi link in questo post li aggiungo per interesse pubblico:

Storia di successo e fallimento: Lisping in JPL

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

Confronto e analisi dell'uso di Lisp anziché di Java: Lisp come alternativa a Java




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

Ma se hai intenzione di impararlo ... con tutti i mezzi, leggi On Lisp




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 mio codice della piastra della caldaia è ora scritto in macro lisp che uscita in C #. Genero HTML, XML, ogni sorta di cose con esso. Mentre vorrei poter usare il Lisp per la codifica quotidiana, Lisp può portare benefici pratici.




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







Lisp può essere utilizzato ovunque si usi la programmazione tradizionale. Non è così diverso, è solo più potente. Scrivere un'app Web? puoi farlo su Lisp, scrivendo un'applicazione desktop? puoi farlo su Lisp, qualunque cosa, probabilmente lo puoi fare su Lisp, o Python, o su qualsiasi altra programmazione generica (ci sono alcune lingue che sono adatte per un solo compito).

Il più grande ostacolo sarà probabilmente l'accettazione del tuo capo, dei tuoi colleghi o dei tuoi clienti. È qualcosa che dovrai lavorare con loro. La scelta di una soluzione pragmatica come Clojure che possa 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 terminare la scrittura di metà del codice in Clojure.




Sintassi complicata? La bellezza della 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 solo un altro tipo di dati. Questo migliorerà il modo in cui codifichi in un linguaggio imperativo e / o orientato agli oggetti perché ti permetterà di essere più mentalmente flessibile con il modo in cui il tuo codice è strutturato.




App Killer? 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 , dato che ero un grande fan dei giochi Crash Bandicoot.

Per l'apprendimento di Common Lisp, consiglierei Practical Common Lisp . Ha un approccio pratico che almeno per me è stato più facile di altri libri che ho visto.




sintassi complicata ??

La sintassi per il lisp è incredibilmente semplice .

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

Ma , dovresti imparare la chiarezza solo se vuoi , e potresti non usarlo mai sul lavoro, ma è comunque fantastico.

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






Links