LISP è ancora utile nel mondo di oggi? Quale versione è più utilizzata?


117

Cerco di insegnarmi un nuovo linguaggio di programmazione a intervalli di tempo regolari. Di recente, ho letto come Lisp e i suoi dialetti si trovino all'estremità opposta dello spettro da linguaggi come C / C ++, il che mi ha reso abbastanza curioso da saperne di più. Tuttavia, due cose non sono chiare per me e sto cercando una guida su di esse:

  1. Il LISP è ancora praticato / utilizzato nel mondo di oggi o è un linguaggio legacy come FORTRAN / COBOL? Voglio dire, oltre a mantenere il codice esistente, viene utilizzato su nuovi progetti?

  2. Qual è il dialetto più usato? Mi sono imbattuto in Scheme e Common Lisp come i 2 dialetti più diffusi e volevo la tua opinione su quale fosse il più favorito / utile da imparare - e sarei immensamente gratificato se potessi suggerire qualsiasi risorsa per un principiante di rango da cui partire.

Sebbene desideroso di imparare una lingua che è fondamentalmente diversa dalle lingue procedurali a cui sono abituato, non voglio investire uno sforzo eccessivo in qualcosa se è totalmente obsoleto - lo imparerei comunque se fosse professionalmente "morto", ma solo con una prospettiva accademica ...


10
Sono molto interessato a questa domanda. Ogni tanto, quando ho tempo, decido di farmi una pugnalata nell'apprendimento di Lisp. E ogni volta che sono contrastato dallo stesso tipo di domande e incertezze che stai ponendo qui. Quale versione di Lisp dovrei imparare? Qualcuno (oltre a Paul Graham) usa davvero Lisp? Dovrei imparare Lisp o uno dei più recenti linguaggi di programmazione funzionale come Haskell? Quali sono i vantaggi di Lisp rispetto a Scheme, ecc., Ecc.
Channel72


Pratico Lisp comune: gigamonkeys.com/book
Joe Internet

"ancora"? (
Scherzo

Ho appena trovato questo altro, discussione correlati su SO: stackoverflow.com/q/1614724/212942
TCSGrad

Risposte:


59

Preferisco Scheme, se vuoi lavorare con la JVM dovresti dare un'occhiata a Clojure, che è un programma progettato per funzionare nella JVM. E sì, vale sempre la pena imparare a vedere Lisp quanto può essere potente un design così minimalista! Le persone che hanno creato lisp hanno capito bene alcune cose. È incredibile quante delle nuove fantastiche funzionalità dei linguaggi moderni abbiano avuto negli anni '60!

Per uno schema incorporato, prova guile: http://www.gnu.org/s/guile/


Esiste un dialetto che funziona bene con C / C ++, perché sono principalmente un tipo C ++? Potresti anche menzionare alcune risorse per un novizio di rango, per iniziare ad imparare quel dialetto?
TCSGrad

10
I migliori libri per apprendere lo schema sono "The Little Schemer" e "SICP" mitpress.mit.edu/sicp . Ci sono un certo numero di implementazioni di schemi che possono essere integrate in c / c ++, ma non so davvero quali siano buone in questi giorni, quindi potresti dover fare qualche google.
Zaccaria K,

1
Devo sottolineare che lo schema è molto semplice! imparerai circa il 90% della lingua in 2 ore. Ovviamente ciò non significa che l'avrai padroneggiato, saprai solo come funziona la sintassi.
Zaccaria K,

5
@ shan23 Lo schema è stato progettato per l'insegnamento. Potrebbe senza dubbio essere usato per insegnare a una matricola come programmare, quindi non ho dubbi che non avrai problemi a impararlo. Se vuoi l'integrazione C o C ++, guarda Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py,

1
Il libro del linguaggio di programmazione Scheme di Kent Dybvig non è forse così famoso, ma è un libro molto carino. sche.com/tspl4 Se usi Emacs, imparare un po 'di Lisp è utile.
blispr,

68

In risposta alla domanda 2, "Dialetto più utilizzato":

Dipende da come interpreti "Più ampiamente usato". Ecco alcuni calcoli di tovagliolo per limiti inferiori su quanto ottengono ciascuno dei pochi dialetti scelti.

Scritto il codice più grezzo

  • Forse schema (tutti i dialetti) a causa di applicazioni educative
    • 270 scuole ... Supponiamo che 50 studenti / anno, 500 righe di codice / studente, 10 anni consecutivi. Oltre 1.000.000 di righe basate sulla matematica del tovagliolo.
    • 500.000 linee di racchetta nella stessa racchetta e nei suoi strumenti.
  • Forse Common Lisp a causa dell'IA e di un sacco di codice open source e codice di produzione (vedi codice di produzione).
  • Forse Emacs Lisp a causa di ...
    • Emacs stesso: oltre 1.000.000 di linee
    • La quantità di emacs lisp scritta pubblicamente - 237 moduli, circa 200 linee / moduli è di oltre 40.000 righe solo su EmacsWiki, probabilmente molto di più in ELPA
    • Inoltre applicazioni scritte in emacs Lisp, file .emacs, ecc.
  • Clojure
    • Difficile da stimare. Dotcom per lo più piccoli. Potrebbe essere molto.

Vincitore: Schema o Common Lisp. Troppe incognite.

La maggior parte del codice di "produzione"

Vincitore: sto indovinando Common Lisp . Penso che possiamo rispondere "Sì" alla domanda 1 basata sull'uso di Common Lisp e Clojure.

La maggior parte degli utenti finali

  • Lisp comune
    • Clienti di software ITA, tra cui Orbitz, Bing Travel e Kayak.com - Probabilmente milioni.
  • Clojure
    • Citigroup (nessun dettaglio), Akamai (nessun dettaglio), simple.com, molti altri. Probabilmente milioni.
  • schema
    • Studenti CS, ricercatori e hobbisti. Meno di un bazillion.
    • La serie Uncharted - Oltre 5 milioni
  • Emacs Lisp - Principalmente programmatori, principalmente su piattaforme unix. Potrebbe essere un milione.

Vincitore: lo schema ha il limite inferiore migliore qui, poiché ci sono numeri di vendita su Uncharted, ma è abbastanza discutibile.

Conclusione

In conclusione, trovo che mele grandi.


4
Non piccole arance? O limoni porpora?
Vatine,

In effetti lo schema - specialmente lo schema della racchetta - sembra essere il dialetto lisp più aggiornato. Strumenti e librerie di livello professionale.
Bikal Lem,

@Bikal Vorrei che il supporto OpenGL non fosse così datato, ma poi la modalità diretta non è il più grande difetto del mio codice Racket ...
Jesse Millikan

Non avevo idea che Orbitz usasse CL ... So dove cercare il mio prossimo lavoro: D
Rig

2
Più di 100k LOC sono stati scritti in Racket. La libreria standard Racket / IDE / strumenti sono oltre 500k, inoltre è in uso in aziende come SET, Boeing e Naughty Dog.
Sam Tobin-Hochstadt,

43

LISP è ancora praticato / utilizzato nel mondo di oggi, o è un linguaggio legacy

Sì, lo è, ma devi sapere dove cercare. Le persone che usano LISP non tendono a gridare troppo forte a riguardo, ma ci sono alcuni esempi di alcune startup di alto profilo che l'hanno usato con grande efficacia negli ultimi 20 anni. È anche molto popolare tra le piccole aziende in Europa.

Qual è il dialetto più usato?

Questa è una domanda valida, ma non è facile rispondere. Potrebbe anche non essere particolarmente utile rispondere: molte implementazioni hanno un focus specifico, quindi sono meglio scelte se si adattano al tuo problema particolare piuttosto che in base a quanto ampiamente viene altrimenti utilizzato. Invece, ti parlerò un po 'delle tue opzioni e puoi decidere tu stesso.

LISP è una famiglia di lingue e ognuna di queste lingue ha una famiglia di dialetti e implementazioni. I dialetti in genere rientrano in due campi "LISP" e "Schemi".

LISP: Fino a tempi relativamente recenti, il LISP comune era il re. Era un tentativo di unificare tutti i LISP diversi e, senza essere scortese, era il "C ++" di LISP. Vale a dire, era una lingua ENORME . Aveva tutto. Negli ultimi anni è apparso Clojure. Clojure è un LISP che gira su Java Virtual Machine e cerca di radicarsi in una filosofia di programmazione funzionale. Tradizionalmente, altri LISP sono stati rigorosamente multi-paradigma. Clojure è interessante perché ottiene sia il meglio che il peggio di entrambi LISP e JVM. C'è ancora molta verbosità dei linguaggi basati su Java e sono stati abbastanza liberi e facili con la sintassi, quindi ha molte manopole e pulsanti per cose diverse, ma ne hanno davveroidee interessanti intorno ai tipi di dati, in particolare alcuni dei modi pratici che hanno escogitato per applicare idee dalla programmazione funzionale.

Schemi: gli schemi sono un sottoinsieme rigoroso di LISP. Lo schema è stato inventato da Steele e Sussman e in tenera età era noto per essere utilizzato nel corso di lezione MIT Computing 101. Lo schema è definito nel "Revised ^ n Report on the Algorithmic Language Scheme (RnRS)". Sì: hanno una battuta di matematica lì dentro. Lo schema è un linguaggio standardizzato in un modo in cui altri LISP non lo sono. Questo aiuta molto con la portabilità tra le implementazioni, ma non è un proiettile d'argento. Gli sforzi di standardizzazione sono stati tendenzialmente conservativi e le innovazioni nelle implementazioni, specialmente attorno a cose come i moduli, sono state tendenzialmente disparate. Esiste anche una serie di SRFI (Scheme Requests for Implementation) che è simile al processo RFC dell'IETF. Le persone lo usano per standardizzare le piccole cose secondo necessità.

Gli schemi sono diversi dai LISP in quanto presentano una serie di requisiti rigidi che devono soddisfare, uno dei quali è l'ottimizzazione delle chiamate di coda che aiuta a rendere efficiente la ricorsione. Pertanto, gli stili di programmazione ricorsivi sono molto più popolari in Scheme che in LISP. Lo schema è, anche senza essere scortese, come la "C" di LISP. Vale a dire, è una lingua piccola e dovresti essere in grado di tenerlo tutto in testa in una volta.

Attualmente ci sono due famiglie di schemi: quelle basate sulla 5a versione (R5RS) e quelle basate sulla 6a versione (R6RS). La complessità di R6RS era enormemente maggiore di quella dei suoi predecessori e così tante implementazioni di R5RS hanno deciso di saltare, sperando che R7RS sarà più simile a R5RS che a R6RS. Il processo di standardizzazione R7RS è attualmente in corso e ha cercato di includere sia i desideri degli implementatori R5RS che quelli della gente R6RS standardizzando una piccola lingua di base nel loro primo gruppo di lavoro e commissionando un secondo gruppo di lavoro per standardizzare le funzionalità più grandi. Ciò consentirà al linguaggio di avere implementazioni efficienti e utili sia su hardware embedded di piccole dimensioni che su macchine più capaci.

Ora sarò più specifico:

PicoLisp è un LISP davvero fantastico. È minuscolo! È l'autore che l'ha scritto per se stesso e, a quanto ho capito, si guadagna da vivere dagli anni '80. Se mai hai l'opportunità di partecipare a un suo discorso, allora dovresti farlo: è davvero interessante e conosce davvero le sue cose e non avrai nemmeno il più piccolo fiuto di niente di mainstream o noioso.

Non ho familiarità con le implementazioni di Common Lisp, quindi non commenterò ulteriormente.

Guile è lo schema GNU ufficiale.

Racket è uno schema R6RS ma ultimamente sembra aver allargato la rete e sta cercando di "servire come piattaforma per la creazione, la progettazione e l'implementazione del linguaggio".

Chicken vuole essere uno schema pratico. Si basa su R5RS e si compila fino a C. Questo risulta essere un vantaggio davvero, davvero importante in quanto rende assolutamente banale l'uso delle librerie C esistenti. Pertanto Chicken è probabilmente lo schema più utile per sostituire Perl, Python, Ruby, ecc. Come linguaggio di scripting quotidiano. Ci sono diverse persone che lo hanno utilizzato esclusivamente per tutte le loro esigenze per diversi anni. Ha un REPL interattivo e un compilatore. La community (sia sulla mailing list che su IRC) è ben informata, gentile e disponibile.

Cerca un'implementazione con molti moduli: questo dimostra che è ampiamente utilizzabile e significa che probabilmente avrà qualcosa che aiuta con l'attività a portata di mano.

Cerca un'implementazione con un compilatore o, almeno, qualcosa che non sia strettamente basato su IDE o REPL. Molte delle implementazioni progettate per l'insegnamento sono molto difficili da usare per lo scripting per scopi generali.

Consiglierei Chicken perché è quello che uso. L'ho usato nei miei progetti personali e l'ho usato (e lo sto attualmente usando) in modo professionale.

Non voglio investire uno sforzo eccessivo in qualcosa se è totalmente obsoleto - lo imparerei comunque se fosse professionalmente "morto", ma solo con una prospettiva accademica ...

Lo schema non è morto professionalmente, ma potresti dover fare di tutto per usarlo in quel contesto. Qualcosa di simile a Chicken è molto più di una ricerca accademica e può facilmente coprire quasi tutte le basi di qualsiasi lingua di alto livello che attualmente usi.


3
La racchetta non è uno schema R6RS; ce n'è una tra le lingue fornite dalla distribuzione Racket. L'attuale linguaggio Racket è uno schema che parte da RnRS in diversi modi importanti (riguardo ai quali ho sentimenti contrastanti).
JasonFruit,

27

Non posso davvero parlare per tutti i Lisps ma Clojure è sicuramente una lingua calda e pertinente al momento. Un gruppo di utenti Clojure di Londra a cui ho partecipato all'inizio di questa settimana ha avuto oltre 100 partecipanti ...

Ho scoperto che è stata un'esperienza molto illuminante imparare Lisp sotto forma di Clojure nell'ultimo anno (dopo molta esperienza con Java e C #). I motivi principali sono:

  • Ha una forte enfasi sulla programmazione funzionale (più della maggior parte degli altri Lisps). L'autore e BDFL Rich Hickey ha spesso citato Haskell come una delle sue ispirazioni per la progettazione del linguaggio, il che significa che ottieni cose come strutture di dati completamente immutabili e sequenze pigre infinite ecc.
  • Metaprogrammazione macro : la filosofia del "codice è dato" di Lisp è difficile da capire a meno che tu non l'abbia effettivamente sperimentato, ma è uno dei motivi per cui i Lisps sono così espressivi e produttivi
  • Fantastico supporto per la concorrenza multi-core : penso che Clojure sia il miglior linguaggio per la programmazione concorrente in questo momento. Vedi http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey per una presentazione illuminante su questo

Sembra anche essere una scelta pratica per un uso reale della produzione per i seguenti motivi:

  • L'esecuzione su JVM con un'interoperabilità Java molto semplice ti dà accesso a tutte le librerie e strumenti nell'ecosistema Java
  • È un linguaggio dinamico di default, che lo rende molto conveniente per lo sviluppo e la prototipazione rapida con quasi nessuna piastra di caldaia. Tuttavia, è possibile aggiungere suggerimenti di tipo statico per ottenere prestazioni piuttosto buone dove è necessario.

Conosco personalmente persone che usano Clojure in un paio di banche di investimento e startup. Ho anche scelto Clojure come linguaggio di sviluppo principale per la mia startup, quindi sono disposto a mettere i miei soldi dove è la mia bocca :-)


9

Attualmente sto imparando anche Lisp (e lo adoro). Uso Common Lisp ma ho anche scherzato con SBCL , Arc (nota, questa è la versione di Lisp di Paul Graham che, come menzionato da Vitor Braga ha creato Yahoo store / Viaweb) e Allegro CL che è simile a Visual Studio per Lisp (può creare GUI, tuttavia, non l'ho mai usato).

Per quanto riguarda gli usi, Lisp è stato usato molto nell'intelligenza artificiale, ma sarò onesto, non sono sicuro di quanti altri usi "generali" per Lisp. Molti dei siti Web che sono stati creati in Lisp in origine sono stati riscritti in altre lingue, quindi è difficile dire che sia utilizzato nello sviluppo web (senza dire che non lo è, ma i siti più grandi che lo usano non lo fanno più ). Dopo aver fatto una ricerca veloce (molto veloce) ecco un elenco di software scritto in Common Lisp da Wikipedia .

[EDIT] Per quanto riguarda l'uso professionale di Lisp, ci sono lavori là fuori che ti farebbero usare Lisp. Non sono numerosi come, ad esempio, i lavori Java o C #, ma esistono. Penso che Lisp sia una di quelle lingue che viene utilizzata per applicazioni interne e potrebbe fornire un vantaggio competitivo che le aziende non vogliono rinunciare alla pubblicità che usano Lisp. Ricordo di aver visto un post su P.SE che affermava che Smalltalk era simile nell'arena finanziaria.

Inoltre, essere in grado di dimostrare che sei in grado di apprendere paradigmi diversi può aprire più porte anche se non usi Lisp nel lavoro.

"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 Raymond, "Come diventare un hacker"

[/MODIFICARE]


7
FWIW, SBCL è un'implementazione di Common Lisp, così come Allegro CL.
Vatine,

@Vatine - avresti ragione. Se ci fosse un viso arrossato, lo farei ora. Non so perché ho pensato che fossero diversi. Stupido compilatore diverso! = Dialetto diverso :) Grazie!
Jetti

@Jeff: Beh, entrambi estendono la lingua in direzioni diverse, lasciando interoperabile il "core CL".
Vatine,

@Jetti Cosa stavi usando in primo luogo?
Segna C

Credo che stavo usando CLISP, era su un'immagine di VM che non avevo più. Penso che la mia ignoranza mi abbia fatto credere che fosse un lisp comune. Almeno ora lo so meglio.
Jetti,

8

Se vuoi imparare Lisp oggi, darei uno sguardo a entrambe le racchette, che è un'implementazione rapida dello schema (beh, in realtà si è discostato un po 'dallo schema, quindi ora è il suo dialetto) o clojure, che beneficia del JVM funziona (quindi sono disponibili milioni di librerie e puoi interagire con il tuo codice Java).

Anche se non lo impari per usarlo effettivamente, impararlo è sempre utile: impari nuovi modi di pensare e affrontare i problemi, anche in altre lingue, una volta che hai avvolto la tua mente intorno a Lisp per un po '.


3
Il problema con Scheme è che quando inizi ad avere un po 'di pratica con esso non vuoi tornare ad altre lingue. Ho appena iniziato a implementare flussi (possibilmente infiniti, valutati pigramente, sequenze immutabili) in C ++ e questo è molto più codice che in Scheme! Sono stato davvero sorpreso dalla combinazione di semplicità e potenza di Scheme.
Giorgio,

++ per racchetta. È davvero incredibilmente COMPLETO, che è una delle critiche di altri schemi. E va al di là di ciò che lo schema può fare per quanto riguarda la creazione delle proprie lingue.
Scott Klarenbach,

7

Una parte significativa del backend di Amazon era in Lisp ma ora è stata riscritta in C ++, o almeno così ho sentito (devo ammettere che non ho una fonte affidabile per questo).

Yahoo! Stores è uno dei classici esempi di app Web Lisp. Da Yahoo! La fama dei negozi di cui potresti aver sentito parlare di Paul Graham . Graham è uno dei più noti sostenitori di Lisp e scrive ampiamente su questo argomento. Potresti voler leggere il suo sito per conoscere i suoi punti.

AutoCAD aveva un dialetto Lisp per il suo sistema macro. Non so se lo fa ancora.

Lo schema è un linguaggio pulito e molto elegante. È probabilmente il mio linguaggio di programmazione preferito, quindi potrei essere di parte. Se avessi intenzione di scrivere adesso un'applicazione principale, probabilmente scriverei un'applicazione scheletro in C, estendere e definire le regole di business in Scheme. Questo mi permette di usare Scheme e di sfruttare C - per la velocità e per la pura disponibilità delle librerie per quasi tutto.


Cosa consiglieresti come libro / compilatore iniziale per Scheme? Uso Linux, quindi se c'è qualche editor esplicitamente utile per i principianti (come Kile è per LaTex), fammi sapere ...
TCSGrad

1
@ shan23 The Little Schemer ( ccs.neu.edu/home/matthias/BTLS ) è la soluzione migliore. Credo che emacs sia l'editor più comune per Scheme, ma ci vuole un po 'per abituarsi.
Vitor Py,

1
Editor per lisp, è facile, usa emacs. È stato scritto da ragazzi lisp e in lisp.
Zaccaria K,

Puoi anche usare l'IDE Racket ( racket-lang.org ); è simile a Emacs ma ha la formattazione automatica e l'interazione con l'interprete Scheme.
Jeremiah Willcock,

Lispbox ( common-lisp.net/project/lispbox ) funziona immediatamente (alcune esperienze di emacs sono utili). Si basa su ccl ( ccl.clozure.com ), vedi anche gigamonkeys.com/book/…
Giorgio

4

Il LISP è ancora praticato / utilizzato nel mondo di oggi o è un linguaggio legacy come FORTRAN / COBOL? Voglio dire, oltre a mantenere il codice esistente, viene utilizzato su nuovi progetti?

Conosco diversi ragazzi che fanno Lisps in alcune startup della Silicon Valley e so che Amazon.com utilizza Lisp sin dall'inizio (anche se ho sentito che lo stanno sostituendo con C ++ per qualche motivo?)

Ma una compagnia da tenere d'occhio è Naughty Dog . Tutti i loro giochi sono scritti con un dialetto Lisp. Inizialmente, hanno lanciato il loro, ma usano MZScheme nella serie Uncharted.

Qual è il dialetto più usato? Mi sono imbattuto in Scheme e Common Lisp come i 2 dialetti più diffusi e volevo la tua opinione su quale fosse il più favorito / utile da imparare - e sarei immensamente gratificato se potessi suggerire qualsiasi risorsa per un principiante di rango da cui partire.

Scommetterei che Common Lisp, Clojure, Scheme ed Emacs Lisp sono i quattro dialetti più utilizzati e, di questi, sospetto che Scheme sia il più comunemente usato. Non ho nulla con cui appoggiarlo, ovviamente. :)

Mi piace SICP e Little Schemer, come suggerito da altri, ma suggerirei anche Land of Lisp , che è una lettura piuttosto divertente. :)


In effetti, Land of Lisp è una lettura straordinaria.
Chiron,

@ 4bu3li Non hai votato?
Segna C

1
Informazioni su Naughty Dog: Questo non è del tutto corretto, i loro giochi per PS2 sono stati scritti in GOAL, un linguaggio simile a lisp ... Ma da quando si sono spostati su PS3, sono passati all'utilizzo del C ++. MZScheme viene utilizzato principalmente come preprocessore macro, scritto in linea con C ++ e utilizzato per l'elaborazione di alcune risorse e alcuni dei loro script sono scritti in S-exps. Ma nessun codice MZScheme viene effettivamente eseguito su PS3.
Arelius,

2

Penso che dipenda in parte da ciò che vuoi fare con esso - se stai cercando di approfondire le tue conoscenze sui vari concetti di programmazione e renderti un programmatore migliore, direi che vale la pena imparare almeno un briciolo di Lisp. Se stai cercando un'altra lingua da aggiungere al tuo curriculum al fine di ottenere un lavoro che funzioni con questa lingua, probabilmente vorrai cercare altrove. Non ci sono molti lavori Lisp là fuori.

Personalmente provo a usare SBCL o, più recentemente, Clojure (e alcuni Emacs Lisp, ma htat è perché sono un utente Emacs a lungo termine - proverei ad imparare Emacs Lisp quando provo ad imparare Lisp). Ora tutto quello che devo fare è trovare il tempo per giocare davvero con quelle lingue ...


1
È principalmente il primo ... poiché è abbastanza evidente che se riuscissi a farlo, di certo non danneggerebbe affatto il mio curriculum :). Ma seriamente, voglio una prospettiva sui diversi "stili" di programmazione, quindi ho una buona idea su quale utilizzare in diversi scenari (Non voglio cadere nella situazione che è equipaggiato solo con un martello, Devo trattare tutti i problemi come unghie !!)
TCSGrad

2

Non so che ci siano un sacco di lavori in LISP, di certo non li vedo. Ma ricordo da molto tempo che leggevo di alcuni sondaggi della NASA su cui erano in esecuzione LISP e sono stati in grado di inserire un nuovo codice da terra.

Anche a New York il gruppo Meetup clojure è enorme. Immagino che se sei interessato e vai al tuo gruppo Meetup Clojure potresti trovare opportunità di rete e trovare lavori (non lavori Clojure ma cose come Java / C ++ / ecc.). Sembra essere assolutamente enorme nell'area di New York, altre aree possono variare.

Anche LISP è un modo diverso di pensare. Inoltre, LISP e SQL comportano entrambi l'uso di tonnellate di espressioni nidificate. Ho usato SQL un sacco e poi ho notato che LISP aveva più senso. Ma se hai problemi con SQL che si abitua a parentesi ed espressioni nidificate mentre usi LISP, probabilmente le espressioni SQL saranno molto più facili da capire.

Un esempio classico è come implementare MAX (a, b, c). Potresti creare una funzione contorta con un sacco di istruzioni if. O potresti semplicemente dire

MAX (MAX (a, b), c)

e utilizzare due semplici chiamate nidificate del due elementi MAX, che per me è più facile da leggere. Sebbene se le prestazioni sono un problema, potresti volerlo fare anche nell'altro modo, non mi sono preso la briga di contare il numero di confronti quando si utilizza ciascun metodo ... Anche se si sta implementando MAX tramite una macro C o un altro metodo che valuta il espressioni più volte potresti non ottenere il risultato atteso poiché l'espressione può essere valutata più volte, quindi fai attenzione agli effetti collaterali ...


3
Puoi effettivamente semplificare MAX diMAX(MAX(a b) c)
Andrea

Hai ragione, è quello che ottengo rispondendo poco dopo essermi svegliato. Ho modificato la risposta.
Cervo,

2
Il progetto della NASA era Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank Shearar,

2

Due punti aggiuntivi:

Innanzitutto, Lisp è un ottimo linguaggio per scrivere codice in cui le interazioni tra funzioni o dati sono spesso complesse. In molte lingue popolari, se sei confuso sul perché il tuo programma sta facendo quello che sta facendo, devi scrivere funzioni speciali per permetterti di esaminare lo stato interno del programma mentre procede. In alcune lingue, devi quindi attendere la ricompilazione del codice. Naturalmente ci possono essere strumenti come debugger che aiutano in questo. In Lisp, tuttavia, tutto ciò che serve è un modo per fermare il programma, e quindi, in genere, hai accesso a tutto in Lisp. In Common Lisp, a volte digito semplicemente ^ C o lancio una chiamata aerrorin una singola funzione (che è l'unica cosa che deve essere ricompilata e non devi fare nulla per ricompilarla). Una volta che interrompo il programma, vengo immediatamente gettato in un debugger, ma il debugger mi dà tutta la potenza di Lisp e posso uscire dal debugger, chiamare funzioni specifiche, ecc. Posso facilmente esaminare qualsiasi struttura di dati nel mio programma. La maggior parte degli schemi dovrebbe consentire pratiche simili. Lisp non è unico in questo senso, ma ciò che offre va oltre ciò che offrono molte lingue popolari.

Secondo: se avessi intenzione di sperimentare un dialetto di Lisp, non lo farei senza (a) usare un editor che corrisponda alle parentesi e (b) imparare il corretto rientro di Lisp. Sarebbe una buona idea usare un editor che approssimi il rientro corretto anche per te. La formattazione del codice in stile C / C ++ / Java è progettata per linguaggi con meno parentesi / parentesi graffe / parentesi rispetto a Lisp. Lo stile di stampa grazioso di Lisp funziona bene una volta che lo conosci e non finisci per essere confuso dalle parentesi o sprecare metà del tuo spazio mettendo una parentesi di chiusura per riga.


1

In questo momento ho l'impressione che Lisp sia usato principalmente nei negozi di consulenza (non che i negozi di consulenza lo usano principalmente).

È considerato un po 'fuori dal comune per il software pratico. Principalmente perché le persone non ci sono abituate, credo.

Tradizionalmente, Scheme è un dialetto abbastanza accademico di Lisp e Common Lisp era il dialetto del settore.

Lisp è particolarmente utile per manipolazioni simboliche e capacità di riflessione.

Ad esempio, il codice che ho scritto per apprendere Lisp era un programma che costruiva funzioni lambda casuali, le valutava e quindi operava su di esse, nel tentativo di minimizzare la differenza della funzione con una funzione target. Tutto ciò era manipolazione diretta. In un linguaggio come C ++ o Java, avrei dovuto inventare una rappresentazione per le funzioni che il computer avrebbe manipolato.


Interessante osservazione che hai fatto riguardo alle differenze tra Scheme / Common Lisp - potresti approfondire il perché / come?
TCSGrad


1

Vorrei aggiungere alcune prospettive su Common Lisp e Scheme. Ho evitato il clojure a causa della JVM, quindi non ho molte prospettive al riguardo.

Lo schema è un bellissimo linguaggio conciso e ben definito. Ci sono volute molte decisioni che CL ha dovuto prendere a causa dell'eredità e ha adottato un approccio più puro. Ad esempio, variabili e funzioni si trovano nello stesso spazio dei nomi. La lingua predefinita è più piccola e più concisa, il che funziona bene per insegnarti il ​​tipo di cose in cui lisp è bravo, ad esempio fa pressione sull'uso della ricorsione invece dell'iterazione, poiché di default non ha cicli iterativi e richiede l'ottimizzazione delle chiamate in coda . Lo schema ha un macro sistema igienico molto interessante, che ha molto valore per l'apprendimento. Ma IMO, consiglierei di apprendere prima le macro Unhygienic in stile CL, di cui la maggior parte (?) I dialetti dello schema offrono almeno un'implementazione di, anche se non fa parte delle specifiche. Dal momento che sembra che tu voglia imparare una lingua per amor di apprendimento, io '

Detto questo, la comunità di Scheme è frammentata e, a parte alcune piccole tasche, sembra essere principalmente dedicata alla ricerca per ottenere un vero lavoro ... Ad esempio, ogni dialetto ha il proprio gestore di pacchetti, e spesso i pacchetti non sono portatili attraverso i dialetti, che è un grosso problema nella comunità degli schemi.

Lisp comune, d'altra parte, sembra essere l'approccio molto più pragmatico allo sviluppo di una lingua. Lo standard è tale che molto codice lisp è portatile tra le implementazioni, molti compilatori sono veloci e ben ottimizzati. Esiste un ampio set di pacchetti, molti dei quali sono portatili tra le implementazioni. E apparentemente una quantità (comparativamente) di prodotti reali viene creata nella lingua. E con dire quicklisp, la gestione dei pacchetti sembra ragionevolmente vicina a ciò che otterresti in una comunità moderna come dire Ruby o Node. CL, tuttavia non è privo di difetti, a questo punto ha una specifica molto grande rispetto allo schema, e persino il suo sistema di oggetti CLOS, qualcosa che è tradizionalmente scritto come una libreria in Lisps, fa parte della specifica IIRC. E puoi sentire l'eredità radicata in gran parte del sistema.

Altrimenti, ho detto che non potevo parlare sul clojure, ed Emacs Lisp è chiaramente la scelta appropriata se il tuo obiettivo è scrivere estensioni di Emacs, e chiaramente non è la scelta appropriata per altri software.

TLDR; Se il tuo obiettivo è imparare, consiglio Scheme. Tuttavia, se si desidera creare software, consiglierei Common Lisp delle due principali varianti di lisp.


A proposito, la racchetta PLT è un linguaggio che assomiglia di più allo schema, e originariamente dalla comunità dello schema che sembra cercare di essere utile per il vero lavoro. Se dovessi scrivere il codice in uno schema in questi giorni, probabilmente sarebbe PLT o Chicken Scheme, ma il successivo potrebbe essere dovuto a un punto debole nel mio cuore.
Arelius,

0

Ho imparato molto dalle risposte. Grazie a tutti coloro che hanno contribuito a questa conversazione illuminante.

Dovrei menzionare newLISP . Sebbene differisca un po 'sia da CL sia da Scheme, implementa molte funzioni molto utili. Trovo il server http, la funzionalità multi-elaborazione (Cilk) e le funzioni di valutazione remota molto pulite e facili da usare.

Il singolo eseguibile è piccolo, veloce e include molte batterie interessanti.


Probabilmente è giusto menzionarlo, ma non lo consiglierei esattamente ... Nessun ambito lessicale e nessun modulo per esempio - sul serio? Non capisco davvero cosa NewLISP sta cercando di realizzare.
Cji,

2
Hai ragione, è diverso. Utilizza contesti e scoping dinamico e dalla mia esperienza moduli e contesti sono correlati. Non cerca di essere un altro CL né Scheme. Leggere la pagina su come differisce ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) fa luce sui problemi di progettazione. Allo stesso modo, non lo consiglierei a chiunque desideri un'esperienza CL o Scheme. Ma per alcuni casi d'uso potrebbe essere una scelta praticabile. Questa è la bellezza dell'ecosistema open source: molta scelta!
CyberFonic,

0

Un altro fattore da considerare nella scelta del dialetto di Lisp da imparare può essere il numero e la qualità delle implementazioni. Se un dialetto ha solo una o due implementazioni, allora sei bloccato con i suoi difetti fino a quando questi difetti non vengono riparati e c'è sempre la possibilità che le persone smettano di perfezionare l'implementazione. Di per sé questo non è un motivo per non usare un dialetto a implementazione singola di Lisp, ma è qualcosa da tenere in considerazione. Un vantaggio di Scheme e Common Lisp è che ci sono molte implementazioni di questi dialetti. Entrambe le lingue hanno pubblicato degli standard, quindi le implementazioni relativamente recenti probabilmente eseguiranno lo stesso codice, principalmente. Alcune di queste implementazioni sono in circolazione da molto tempo, ma sono ancora in fase di sviluppo attivo: ora sono implementazioni di alta qualità e sono ancora in fase di perfezionamento.


Bene, secondo quei parametri di riferimento Clojure non sta andando troppo male rispetto a SBCL: benchmarksgame.alioth.debian.org/u32/…
AndreasScheinert

Grazie Andreas. Hai ragione. Mostra quanto ne so della JVM - non molto. In parte sono stato ingannato da ABCL, un CL basato su JVM relativamente lento ma per il resto piacevole.
Marte

Direi che se vuoi un Lisp sulla JVM, scegli Clojure. Non è perfetto ma è un vero piacere (IMHO)
AndreasScheinert
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.