Lisp ha ancora qualche funzione speciale che NON è stata adottata da altri linguaggi di programmazione?

35

Lisp ha ancora qualche funzione speciale che NON è stata adottata da altri linguaggi di programmazione?

Per Lisp, intendo tutti i linguaggi di programmazione Lisp nel loro complesso. Mi è stato detto quanto sia sorprendente Lisp e so che molte lingue sono state ispirate da Lisp. Ma Lisp ha ancora delle funzionalità di progettazione esclusive che non possono essere eseguite in nessun'altra lingua?

Il motivo per cui ho posto la domanda è che recentemente, essendo io stesso un programmatore dilettante, ho iniziato a imparare Clojure solo per Il risultato è che ho trovato molti post e commenti relativi a Lisp, ma una cosa: "Lisp è unico", ma altri linguaggi di programmazione moderni hanno già adottato e rubato molte idee dal Lisp, come i condizionali, la ricorsione, e la funzione di cittadino di prima classe. E anche metaprogramming può essere fatto in molte lingue.

Ho perso qualcosa ed è "Lisp ancora diverso"?

O sono fortunato perché altre lingue moderne hanno rubato tutte le parti buone di Lisp in modo che non sia necessario scavare nel parentesi Mondo Lisp , e "Lisp era diverso".

    
posta iceX 03.09.2013 - 07:12
fonte

6 risposte

28

Un riferimento canonico per questo tipo di domanda è What Made Lisp Different di Paul Graham. Le due funzioni chiave rimanenti di Lisp che non sono ampiamente disponibili, secondo questo articolo al momento della sua stesura, sono:

8. A notation for code using trees of symbols.

9. The whole language always available. There is no real distinction between read-time, compile-time, and runtime. You can compile or run code while reading, read or run code while compiling, and read or compile code at runtime.

Il commento affronta ogni punto e nomina le lingue popolari in cui tale funzione è disponibile.

8, which (with 9) is what makes Lisp macros possible, is so far still unique to Lisp, perhaps because (a) it requires those parens, or something just as bad, and (b) if you add that final increment of power, you can no longer claim to have invented a new language, but only to have designed a new dialect of Lisp ; -)

Nota che questo articolo è stato rivisto per l'ultima volta nel 2002 e negli ultimi 11 anni ci sono state una grande varietà di nuove lingue, alcune delle quali potrebbero incorporare tutte queste caratteristiche Lisp nel loro design.

    
risposta data 03.09.2013 - 07:22
fonte
15

La domanda è difficile a cui rispondere, poiché qualcuno dovrebbe conoscere tutte le lingue per sapere che nessun altro ha una particolare funzionalità disponibile in Lisp, quindi quanto segue si basa sulle lingue con cui ho esperienza.

In cima alla mia testa, le condizioni sono qualcosa che Non ho visto in nessun altra lingua. Pensa alle "eccezioni", ma dove lo stack delle chiamate non viene svolto e dove il chiamante può inviare un valore di recupero al sito delle eccezioni, ma senza disturbando lo stack di chiamate tra il gestore e la sorgente del eccezione. Per essere onesti, questa è davvero solo una speciale applicazione di continuazioni, quindi Ruby e Scheme (almeno) possono fare questo.

Il sistema macro di Lisp beneficia di regolarità / omoiconicità, ma Scala sta pianificando di incorporarli come caratteristica stabile in 2.12 e Template Haskell rivendica funzionalità simili. Direi che saranno più sintatticamente più complessi che con Lisp, ma la generazione di codice in fase di compilazione è lì a prescindere.

Vieni a pensarci, però, la costruzione diretta delle forme è solo un tipo di macro disponibile in Lisp: non ho visto un equivalente di macro del compilatore o del lettore da nessun'altra parte.

La capacità di alcuni dialetti (ad es. SBCL ) di salvare un'immagine di processo completa e ripristinabile è interessante, ma di nuovo non lo è Unico: Smalltalk lo fa da decenni.

Molte altre lingue consentono assegnamenti distruttivi al momento del ritorno degli array, ma i # valori # e l'approccio "multi-value-bind / let-values sembrano ancora specifici per Common Lisp e Scheme (che può ancora fare 'regolari' destrutturante pure). 'Wantarray' di Perl consente a una funzione di determinare se viene richiamata in un contesto scalare, elenco o vuoto in modo che possa regolare il suo valore di ritorno in modo simile (-ish), ma non ho visto valori di ritorno multipli "veri" all'esterno di Schema / CL.

In termini di funzionalità linguistiche, probabilmente non c'è molto che Lisp possa fare che altre lingue non possano (la completezza di Turing è ciò che è). Ciò che è , tuttavia, è un linguaggio in cui il codice è espresso in termini di strutture dati proprie, rendendo la Big Idea ™ -che il codice è dati-qualcosa che è relativamente facile da usare.

    
risposta data 03.09.2013 - 15:29
fonte
4

Dopo tanti decenni, non penso ci sia qualcosa di esclusivo in Lisp. Ma anche oggi, ci sono molte cose interessanti che sono difficili da trovare al di fuori di Lisps. Alcune cose che ti vengono in mente:

  • Un sistema di oggetti di alta qualità con sofisticati meta-protocolli (cioè CLOS) non è molto diffuso.
  • i multi-metodi appaiono di tanto in tanto da qualche parte, ma la maggior parte delle persone non ne ha mai sentito parlare.
  • Come altri hanno sottolineato, il sistema di condizioni è piuttosto sofisticato rispetto ai noti meccanismi di gestione delle eccezioni.
  • Una rappresentazione compatta della semantica del linguaggio (eval), un approccio autorizzante per definire il proprio linguaggio e renderlo disponibile per adattamenti profondi diretti (si veda SICP ) - Le funzioni "eval" delle attuali lingue popolari semplicemente non condividono le stesse proprietà.

Infine, c'è molto di più da imparare da Lisp che non riguarda la lingua stessa, ma è diventato parte della storia di Lisp e si è perso nel tempo. Per esempio. Interlisp, Symbolics Genera, ecc ... se non si mettono mai le mani su Genera, vedere questo comp.lang.lisp thread dove Kent Pitman descrive come" Emacs è solo una pallida ombra degli Zmac di Genera "- il tutto è stato reso possibile da un potente sistema Lisp di cui Zmacs faceva parte, che girava su una macchina Lisp .

    
risposta data 03.09.2013 - 22:10
fonte
4

Non è necessariamente una singola funzione . È tutto il look and feel e il modo in cui determinate serie di funzioni interagiscono.

JavaScript o Java hanno molte funzionalità di Lisp (macchina virtuale, compilatore / valutatore, garbage collection, ecc.). Ma JavaScript ad esempio manca della parte di programmazione simbolica, manca di capacità matematiche (internamente ha solo float), manca la gestione degli errori e così via.

Molti sistemi Common Lisp sono ottimizzati per un modo di sviluppo in cui si estende il nuovo software in modo incrementale, estendendo la lingua Lisp in varie dimensioni utilizzando varie tecniche di meta-programmazione - senza riavviare il software per un lungo periodo. Quindi deve essere flessibile ed estensibile, ma allo stesso tempo deve essere robusto. Cambiare la lingua (i macro sono fondamentalmente un modo per l'utente di estendere il compilatore) senza causare il crash del programma.

Ora qualcosa come JavaScript è anche usato per estendere un programma, in genere un browser web. Ma la maggior parte delle volte non si fa molta meta-programmazione in JavaScript - a parte alcuni OOP hackery.

Esempio:

Si può implementare un software matematico avanzato generale per il dominio dell'algebra del computer in due modi: scrivere il motore in C con un linguaggio specializzato in cima (come Mathematica ) o in qualche altro dialetto Lisp più avanzato. Macsyma / Maxima in Common Lisp, Riduci in Standard Lisp, Axiom in Common Lisp.

(Ce ne sono anche uno o più scritti in Python.)

Non ci sono molti sistemi che offrono le funzionalità di qualcosa come Axiom , che gira sopra Common Lisp.

Ciò che ha reso Lisp attraente per questi tipi di applicazioni è un mix di funzioni: matematica di base avanzata (bignum, rapporti, ...), calcolo simbolico, compilatore interattivo, ecc. È possibile ottenere queste cose implementandole in un linguaggio di basso livello. In questo modo, uno avrà implementato il 50% o più di un tipico sistema Lisp.

    
risposta data 04.09.2013 - 00:25
fonte
2

Non per quanto ne so. Forth è facile quanto dinamico come Lisp, forse più di quanto il codice dinamico in Forth assomiglia al normale codice Forth, mentre le macro Lisp tendono a utilizzare funzionalità diverse rispetto al normale codice Lisp (in Clojure almeno non ho mai usato la citazione della sintassi al di fuori di una macro) e di conseguenza sembrano molto diversi dal normale codice Lisp. Come esempio di quanto sia dinamico Forth, ecco un modo per implementare i commenti in Forth :

: (   41 word drop ; immediate
( That was the definition for the comment word. )
( Now we can add comments to what we are doing! )
    
risposta data 03.09.2013 - 17:21
fonte
2

Lisp ha molti dialetti e ognuno di essi ha il proprio set di funzionalità. La mia funzione preferita che è improbabile che venga adottata da qualsiasi altra lingua è la "pila di spaghetti" da Interlisp .

Lo stack di spaghetti è come una chiusura, ma con gli steroidi. Salva non solo la funzione corrente, ma l'intero contesto fino alla cima della pila. Qualcosa come co-routine , tranne per il fatto che potresti crearli arbitrariamente, risultando in una gerarchia di contesti dello stack.

    
risposta data 03.09.2013 - 08:08
fonte

Leggi altre domande sui tag