haskell functional-programming scheme referential-transparency

haskell - ¿Hay esquemas puramente funcionales o Lisps?



functional-programming scheme (9)

¿Hay esquemas puramente funcionales (o Lisps en general)?

El proverbio de teorema ACL2 es un Lisp puro. Sin embargo, está destinado a la demostración de teoremas en lugar de a la programación, y en particular se limita a los programas de primer orden. Sin embargo, ha sido extremadamente exitoso en su nicho. Entre otras cosas, ganó el Premio de sistema de software ACM 2005.

He jugado con algunos lenguajes de programación funcionales y realmente disfruto de la sintaxis s-expr utilizada por Lisps (Esquema en particular).

También veo las ventajas de trabajar en un lenguaje puramente funcional. Por lo tanto:

¿Hay esquemas puramente funcionales (o Lisps en general)?


sintaxis inconsistente y no extensible

¿Qué es la "inconsistencia" aquí?

Es extraño basar una elección de idioma únicamente en la sintaxis. Después de todo, la sintaxis de aprendizaje tomará algunas horas, es una pequeña fracción de la inversión requerida.

En comparación, las consideraciones importantes como la velocidad, la disciplina de escritura, la portabilidad, la amplitud de las bibliotecas, la documentación y la comunidad tienen un impacto mucho mayor sobre si puede ser productivo.

Ignorando todo el cebo de llamas, un Google rápido para Esquema inmutable produce algunos resultados: http://blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html


El nuevo lenguaje de Racket (anteriormente denominado PLT Scheme) le permite implementar cualquier semántica que desee con s-expresiones (en realidad, cualquier sintaxis). El lenguaje base es una variante de esquema tipificada dinámicamente, evaluada con entusiasmo, pero algunos lenguajes notables construidos en la parte superior son un esquema perezoso y un sistema reactivo funcional llamado Tiempo Padre.

Una forma fácil de hacer un lenguaje puramente funcional en Racket es tomar el lenguaje base y no proporcionar ningún procedimiento que mute el estado. Por ejemplo:

#lang racket/base (provide (except-out (all-from-out racket/base) set! ...more here...))

¡Crea un lenguaje que no tiene set! .


Hace 30 años hubo lispkit lisp
No estoy seguro de lo accesible que es hoy.
[Ese es uno de los lugares donde aprendí programación funcional]


Hay un par de proyectos que pretenden usar haskell debajo de una sintaxis lispy. El más viejo, más muerto y más pesado es "Liskell". El más nuevo, más vivo y más liviano es el hasp . Creo que vale la pena echarle un vistazo.


No creo que haya Lisps puramente funcionales, pero Clojure es probablemente el más cercano.

Rich Hickey, el creador de Clojure:

¿Por qué escribí otro lenguaje de programación? Básicamente porque quería un Lisp para Programación Funcional diseñado para Concurrencia y no podía encontrar uno.

Clojure

Clojure es funcional, con variables y tipos de datos inmutables, pero puede obtener un comportamiento mutable en algunos casos especiales o bajando a Java (Clojure se ejecuta en la JVM).

Esto es por diseño - otra cita de Rich es

Un lenguaje de programación puramente funcional solo sirve para calentar su computadora.

Vea la presentación de Clojure para programadores Lisp .


Si te gusta la sintaxis de lisp, puedes hacer cosas similares en Haskell

let fibs = ((++) [1, 1] (zipWith (+) fibs (tail fibs)))

Los let fibs = dejados a un lado. Siempre se puede usar la sintaxis s-expr en las expresiones de Haskell. Esto se debe a que siempre puede agregar paréntesis en el exterior y no importará. Este es el mismo código sin paréntesis redundantes:

let fibs = (++) [1, 1] (zipWith (+) fibs (tail fibs))

Y aquí está en el estilo "típico" de Haskell:

let fibs = [1, 1] ++ zipWith (+) fibs (tail fibs)


hay owl lisp , un dialecto del esquema R5RS con todas las estructuras de datos inmutables y algunas estructuras de datos puros adicionales. No es un proyecto grande, pero parece ser desarrollado y utilizado activamente por un pequeño grupo de personas (por lo que puedo ver en el sitio web y el repositorio git). También hay planes para incluir el soporte de R7RS y algún tipo de inferencia de tipo. Entonces, aunque probablemente no esté listo para el uso en producción, esto podría ser una cosa divertida para jugar.


Probablemente no, al menos no como nada más que juguetes / pruebas de concepto. Tenga en cuenta que incluso Haskell no es 100% puramente funcional, tiene escotillas de escape secretas, y cualquier cosa en IO es solo "pura" en un sentido tortuoso y agitado de la palabra .

Entonces, dicho esto, ¿ realmente necesitas un lenguaje puramente funcional? Puede escribir código puramente funcional en casi cualquier idioma, con diversos grados de inconveniencia e ineficiencia.

Por supuesto, los lenguajes que suponen una modificación de estado universal hacen que sea doloroso mantener las cosas puras, ¿entonces tal vez lo que realmente quieres es un lenguaje que fomente la inmutabilidad? En ese caso, puede que valga la pena echar un vistazo a la filosofía de Clojure . Y es un Lisp, para arrancar!

Como nota final, comprenda que la mayor parte de la "sintaxis" de Haskell son capas gruesas de azúcar. El lenguaje subyacente no es mucho más que un cálculo lambda escrito, y nada le impide escribir todo su código de esa manera. Sin embargo, puedes tener miradas divertidas de otros programadores de Haskell. También está Liskell pero no estoy seguro de qué estado está en estos días.

En una nota final, práctica: si realmente desea escribir código que pretende usar, no solo jugar con cosas por diversión, realmente querrá un compilador inteligente que sepa cómo trabajar con código puro / estructuras de datos inmutables.