Cosa dovrei imparare dallo Scheme?


10

Mi chiedevo quali caratteristiche uniche potrei imparare da Scheme che mi avrebbero aiutato a diventare un programmatore migliore?

Ho molta esperienza nei linguaggi tradizionali e sto cercando di espandere i miei orizzonti e conoscere gli aspetti funzionali che mancano in altre lingue. Conosco chiusure da javascript, espressioni lambda da C # e mi chiedevo su cosa mi posso concentrare che manca in altre lingue? A parte la sintassi di Lisp, mi sento come quello che ho visto finora che ho già incontrato in altre lingue.

Che cosa è unico in Scheme / Lisp che mi insegnerà qualcosa di nuovo?


3
Vale la pena imparare Lisp per la profonda esperienza di illuminazione che avrai quando finalmente la riceverai; quell'esperienza ti renderà un programmatore migliore per il resto dei tuoi giorni, anche se non usi mai molto lo stesso Lisp. - Eric Raymond
Robert Harvey,


1
@Robert Harvery: Anche: xkcd.com/224
Poindexter,

2
Nella sua forma attuale questa domanda non è particolarmente costruttiva. Se riesci a rielaborarlo per richiedere informazioni più specifiche, potrebbe essere utile.
ChrisF

Vedi anche Insegnare i linguaggi di programmazione in un'era post-linnaeana e il libro di testo a cui questo documento fa riferimento: Linguaggi di programmazione: applicazione e interpretazione , che usa il linguaggio racket , un dialetto di Scheme.
Robert Harvey,

Risposte:


7

Forse la caratteristica di definizione più importante di Lisp è "Code as Data".  Non otterrai quell'esperienza esattamente allo stesso modo con qualsiasi altra lingua. In C #, l'analogo più vicino sono gli alberi delle espressioni.

È quella qualità che rende Lisp un linguaggio eccellente per l'analisi. È anche la qualità che ha motivato Paul Graham a dire di Lisp: "La cosa insolita di Lisp - in effetti, la qualità che definisce Lisp-- è che può essere scritta in sé". Sebbene i compilatori self-hosting non siano una novità, nessun linguaggio lo fa in modo altrettanto elegante di Lisp.

Anche la metaprogrammazione (qualcosa in cui eccelle anche Lisp) è una cosa utile da imparare.

Beating the Averages di Paul Graham
http://www.paulgraham.com/avg.html


1
Penso che il motivo per cui non ho mai avuto questo "aha!" Il momento in cui ESR mi ha promesso è che ho già avuto la rivelazione "codice come dati" in Prolog.
Frank Shearar,

1
Haskell ha l'attributo "codice come dati"? O la bellezza dipende fortemente dalla tipizzazione dinamica e dalla riflessione?
Joey Adams,

1
@Joey: Penso che l'esistenza di Template Haskell significhi che Haskell non ha l'attributo "codice come dati".
j_random_hacker,

4

Sì, ti aiuterà a pensare in modo ricorsivo. L'ho studiato (schema) solo per circa un mese in un corso di linguaggio di programmazione e mi ha aiutato a sviluppare il modo in cui penso e risolvo i problemi di programmazione.

È sempre utile provare altri paradigmi di programmazione; poi ritorni rinfrescato nel mondo OO con nuove idee.

Non la sintassi, ma il ragionamento, è un ottimo esercizio per il cervello. Appart dalla ricorsione e dall'interessante uso delle liste, non c'è molto altro IMHO, ma ne vale la pena.


Non unico per lo schema. Qualsiasi linguaggio funzionale (o quasi) va bene per l'esercizio della ricorsione.

Sono d'accordo, ma il PO sembra interessato allo Schema rispetto alle lingue "tradizionali" ....
Xavier Nodet,

1

Continuazione :

Nell'informatica e nella programmazione, una continuazione è una rappresentazione astratta dello stato di controllo di un programma per computer. Una continuazione reifica lo stato di controllo del programma, ovvero la continuazione è una struttura di dati che rappresenta il processo computazionale in un determinato punto dell'esecuzione del processo; la struttura dei dati creata è accessibile dal linguaggio di programmazione, anziché essere nascosta nell'ambiente di runtime. Contiene informazioni come lo stack corrente del processo (inclusi tutti i dati la cui durata è all'interno del processo, ad esempio "variabili locali"), nonché il punto del processo nel calcolo. Un'istanza di continuazione può essere successivamente utilizzata come struttura di controllo; su invocazione, riprenderà l'esecuzione dal punto di controllo che rappresenta. La "continuazione attuale"

e quindi provare a implementare Ambiguous Operator di McCarthy :

Nel 1963 John McCarthy, l'inventore di Lisp, pubblicò il documento A Basis for a Mathematical Theory of Computation in cui proponeva la funzione (nel senso del programma informatico della parola) amb (.,.). L'idea è che amb (x, y) sia prima uguale a x. Ma se più avanti nel calcolo si scopre che ciò porta a una sorta di contraddizione, il valore di x viene ritirato e sostituito con y. Questo è un business molto più complesso di quanto possa sembrare all'inizio. Ritrarre un valore significa essenzialmente riportare l'intero stato del calcolo al punto in cui si trovava quando amb ha restituito il valore x, quindi scivolare nel valore di y. Questo significa in qualche modo congelare e copiare l'intero stato quando x è stato restituito per la prima volta. Quando viene rilevata una contraddizione, l'intero stato del programma viene scartato e sostituito con la versione bloccata che viene riattivata. Questi stati congelati sono noti come continuazioni. In molti modi è come una dichiarazione GOTO sull'acido. Può causare un salto in un punto arbitrario del codice. Ma le continuazioni sono più belle dei GOTO perché sono più suscettibili al ragionamento logico.


1

Posso pensare a quanto segue:

  • Macro reali (utilizzando tutta la potenza della lingua per generare codice)
  • Omoiconicità (dati come codice, codice come dati)
  • Valutazione pigra
  • continuazioni

Penso anche che le lingue lisp dovrebbero essere fantastiche per definire le lingue specifiche del dominio (DSL). È qualcosa che potresti voler leggere se non lo conosci già.

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.