Che cosa dovrei imparare da Scheme?

10

Mi stavo chiedendo quali caratteristiche uniche posso imparare da Scheme che mi aiuterebbero a diventare un programmatore migliore?

Ho molta esperienza nelle lingue tradizionali e sto cercando di ampliare i miei orizzonti e di apprendere aspetti funzionali che mancano in altre lingue. Ho familiarità con chiusure da javascript, espressioni lambda da C #, e mi chiedevo che cosa posso concentrarmi su ciò che manca in altre lingue? A parte la sintassi Lisp, mi sento come ho visto finora in altre lingue.

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

    
posta bunglestink 29.12.2010 - 23:50
fonte

4 risposte

7

Forse la caratteristica di definizione più importante di Lisp è "Codice come dati". Non otterrai questa esperienza nello stesso modo con qualsiasi altra lingua. In C #, l'analogo più vicino sono gli alberi di espressione.

È quella qualità che rende il 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 da sola." Sebbene i compilatori self-hosting non siano nulla di nuovo, nessun linguaggio lo fa con la stessa eleganza del Lisp.

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

Battere le medie di Paul Graham
link

    
risposta data 29.12.2010 - 23:59
fonte
4

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

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

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

    
risposta data 29.12.2010 - 23:57
fonte
1

Continuazione :

In computer science and programming, a continuation is an abstract representation of the control state of a computer program. A continuation reifies the program control state, i.e. the continuation is a data structure that represents the computational process at a given point in the process' execution; the created data structure can be accessed by the programming language, instead of being hidden in the runtime environment. It contains information such as the process' current stack (including all data whose lifetime is within the process e.g. "local variables"), as well as the process' point in the computation. An instance of continuation can be later used as a control structure; upon invocation, it will resume execution from the control point that it represents. The "current continuation" or "continuation of the computation step" is the continuation that, from the perspective of running code, would be derived from the current point in a program's execution.

e quindi prova ad implementare Operatore ambiguo di McCarthy :

In 1963 John McCarthy, the inventor of Lisp, published the paper A Basis for a Mathematical Theory of Computation in which he proposed the function (in the computer program sense of the word) amb(.,.). The idea is that amb(x,y) is first equal to x. But if later in the computation it is found that this leads to some sort of contradiction the value of x is retracted and replaced with y. This is a much more complex business than it may seem to be at first. Retracting a value essentially means winding back the entire state of the computation to where it was when amb returned the value x, and then slipping in the value of y. This means somehow freezing and copying the entire state when x was first returned. When a contradiction is found the entire state of the program is discarded and replaced with the frozen version which is reactivated. These frozen states are known as continuations. In many ways it's like a GOTO statement on acid. It can cause a jump to an arbitrary spot on your code. But continuations are nicer than GOTOs because they are more amenable to logical reasoning.

    
risposta data 10.01.2011 - 23:11
fonte
1

Posso pensare a quanto segue:

  • Macro reali (utilizzando tutta la potenza del linguaggio per generare codice)
  • Homoiconicity (dati come codice, codice come dati)
  • Valutazione pigra
  • Continuazioni

Penso anche che i linguaggi Lisp dovrebbero essere fantastici per definire le lingue specifiche del dominio (DSL). È qualcosa che potresti voler leggere se non lo sai già.

    
risposta data 17.12.2011 - 05:07
fonte

Leggi altre domande sui tag