¿Qué debo aprender de Scheme?

10

Me preguntaba qué características únicas puedo aprender de Scheme que me ayudarían a ser un mejor programador.

Tengo mucha experiencia en los idiomas principales, y estoy buscando expandir mis horizontes y aprender sobre aspectos funcionales que faltan en otros idiomas. Estoy familiarizado con los cierres de javascript, las expresiones lambda de C #, y me preguntaba en qué me puedo centrar en lo que falta en otros idiomas. Aparte de la sintaxis de Lisp, me siento como lo que he visto hasta ahora que ya he encontrado en otros idiomas.

¿Qué es exclusivo de Scheme / Lisp que me enseñará algo nuevo?

bunglestink
fuente
3
Vale la pena aprender a Lisp por la profunda experiencia de iluminación que tendrás cuando finalmente la obtengas; esa experiencia te hará un mejor programador para el resto de tus días, incluso si nunca usas mucho Lisp. - Eric Raymond
Robert Harvey
1
También: xkcd.com/297
Robert Harvey
1
@Robert Harvery: También: xkcd.com/224
Poindexter
2
En su forma actual, esta pregunta no es particularmente constructiva. Si puede volver a trabajarlo para solicitar información más específica, podría ser útil.
ChrisF
Consulte también Enseñanza de los lenguajes de programación en una era post-linneana , y el libro de texto al que hace referencia este documento: Lenguajes de programación: aplicación e interpretación , que utiliza el lenguaje de la raqueta , un dialecto del esquema.
Robert Harvey

Respuestas:

7

Quizás la característica definitoria más importante de Lisp es "Código como datos".  No obtendrá esa experiencia de la misma manera con ningún otro idioma. En C #, el análogo más cercano son los árboles de expresión.

Es esa calidad lo que hace de Lisp un excelente lenguaje para el análisis. También es la cualidad que motivó a Paul Graham a decir de Lisp: "Lo inusual de Lisp, de hecho, la cualidad definitoria de Lisp, es que puede escribirse en sí mismo". Aunque los compiladores de alojamiento propio no son nada nuevo, ningún lenguaje lo hace con tanta elegancia como Lisp.

La metaprogramación (algo en lo que Lisp también se destaca) también es algo que vale la pena aprender.

Batiendo los promedios por Paul Graham
http://www.paulgraham.com/avg.html

Robert Harvey
fuente
1
Creo que la razón por la que nunca tuve ese "¡ajá!" El momento en que ESR me prometió fue que ya tenía la revelación del "código como datos" en Prolog.
Frank Shearar
1
¿Haskell tiene el atributo "código como datos"? ¿O la belleza depende en gran medida del tipeo dinámico y la reflexión?
Joey Adams
1
@Joey: Creo que el hecho de que Template Haskell exista significa que Haskell carece del atributo "código como datos".
j_random_hacker
4

Sí, te ayudará a pensar de forma recursiva. Solo lo estudié (esquema) durante un mes más o menos en una clase de lenguaje de programación y me ayudó a evolucionar mi forma de pensar y resolver problemas de programación.

Siempre es valioso probar otros paradigmas de programación; Luego regresas renovado al mundo OO con nuevas ideas.

No es la sintaxis, sino el razonamiento, es un excelente ejercicio cerebral. Además de la recursividad y el uso interesante de las listas, no hay mucho más en mi humilde opinión, pero vale la pena.

dukeofgaming
fuente
No es exclusivo del esquema. Cualquier lenguaje funcional (bueno, casi cualquier) está bien para ejercer la recursividad.
Estoy de acuerdo, pero el OP parece interesado en Scheme en comparación con los idiomas 'convencionales' ...
Xavier Nodet
1

Continuación :

En informática y programación, una continuación es una representación abstracta del estado de control de un programa de computadora. Una continuación reifica el estado de control del programa, es decir, la continuación es una estructura de datos que representa el proceso computacional en un punto dado en la ejecución del proceso; El lenguaje de programación puede acceder a la estructura de datos creada, en lugar de estar oculta en el entorno de tiempo de ejecución. Contiene información como la pila actual del proceso (incluidos todos los datos cuya vida útil está dentro del proceso, por ejemplo, "variables locales"), así como el punto del proceso en el cálculo. Una instancia de continuación puede usarse más tarde como estructura de control; tras la invocación, reanudará la ejecución desde el punto de control que representa. La "continuación actual"

e intente implementar el operador ambiguo de McCarthy :

En 1963, John McCarthy, el inventor de Lisp, publicó el artículo A Basis for an Mathematical Theory of Computation en el que propuso la función amb (.,.,.). La idea es que amb (x, y) es primero igual a x. Pero si más adelante en el cálculo se descubre que esto conduce a algún tipo de contradicción, el valor de x se retrae y se reemplaza por y. Este es un negocio mucho más complejo de lo que parece ser al principio. Retirar un valor esencialmente significa rebobinar todo el estado del cálculo a donde estaba cuando amb devolvió el valor x, y luego deslizarse en el valor de y. Esto significa de alguna manera congelar y copiar todo el estado cuando x fue devuelto por primera vez. Cuando se encuentra una contradicción, el estado completo del programa se descarta y se reemplaza con la versión congelada que se reactiva. Estos estados congelados se conocen como continuaciones. En muchos sentidos, es como una declaración GOTO sobre el ácido. Puede causar un salto a un punto arbitrario en su código. Pero las continuaciones son más agradables que las GOTO porque son más susceptibles al razonamiento lógico.

knivil
fuente
1

Puedo pensar en lo siguiente:

  • Macros reales (usando todo el poder del lenguaje para generar código)
  • Homoiconicidad (datos como código, código como datos)
  • Evaluación perezosa
  • Continuaciones

También creo que los lenguajes lisp deberían ser geniales para definir lenguajes específicos de dominio (DSL). Eso es algo sobre lo que querrás leer si aún no lo sabes.

Joanis
fuente