29

He jugado con algunos lenguajes de programación funcionales y realmente disfruto de la sintaxis de s-expr utilizada por Lisps (Scheme en particular).¿Existen esquemas o Lisps puramente funcionales?

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

¿Existen esquemas puramente funcionales (o Lisp en general)?

+1

La nueva edición es mucho mejor. – jrockway

+1

@jrockway: Gracias por su ayuda, haciendo que la pregunta sea menos incita a la guerra de llama. – nickname

Respuesta

12
Probablemente no

, al menos no como algo más que juguetes/pruebas de concepto nada. Tenga en cuenta que incluso Haskell no es 100% puramente funcional: tiene puertas de escape secretas, y cualquier cosa en IO es only "pure" in some torturous, hand-waving sense of the word.

Así que, dicho esto, ¿usted realmente necesita un lenguaje puramente funcional? Puede escribir el código puramente funcional en casi cualquier idioma, con diversos grados de inconveniencia e ineficiencia.

Por supuesto, los lenguajes que suponen una modificación universal del estado hacen que sea doloroso mantener las cosas en estado puro, entonces ¿quizás lo que realmente desea 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, se dan cuenta de que la mayor parte de la "sintaxis" de Haskell son gruesas capas de azúcar. El lenguaje subyacente no es mucho más que un cálculo lambda tipeado, y nada le impide escribir todo su código de esa manera. Sin embargo, puede obtener miradas divertidas de otros programadores de Haskell. También hay Liskell, pero no estoy seguro de qué estado es en estos días.

En una nota final, práctico: Si desea escribir código en realidad se va a utilizar, no sólo jugar con cosas por diversión, podrás realmente quiere un compilador inteligente que sabe cómo trabajar con el código puro/estructuras de datos inmutables.

+15

"cualquier cosa en IO es solo" pura "en algún sentido tortuoso de la palabra que agita la mano". Conal es polémico. Una descripción mucho más clara se basa en darse cuenta de que IO describe las acciones, y se puede hacer una denotación clara: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.13.9123 –

+0

Gracias por la respuesta. Como dije antes, en realidad no me importa cuán "productivo" es el lenguaje en el sentido tradicional. En general, solo estoy buscando un lenguaje puramente funcional porque me gustaría jugar con las posibilidades. ¡Nada mas! – nickname

+2

@Don Stewart: No es tanto denotación como el resultado final práctico: 'IO' es mejor que nada, pero con suficiente intención perversa te abre a muchas de las trampas y errores que codifican en un lenguaje impuro. El beneficio que Haskell ofrece es que es más fácil evitar tales situaciones en primer lugar. Pero no parece que eso sea relevante para el que pregunta, así que no te preocupes. –

5

sintaxis inconsistente y no extensible

¿Qué es "inconsistencia" aquí?

Es extraño basar una opción de idioma en la sintaxis. Después de todo, aprender la sintaxis tomará unas horas, es una pequeña fracción de la inversión requerida.

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

Haciendo caso omiso de todo el cebo de llama, un google rápida para inmutable esquema genera algunos resultados: http://blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html

+0

¿Por qué no dividir la diferencia y usar Liskell? (Al OP: edité la publicación original para eliminar el flamebait. Si no quieres tener un "flamewar", mantén tus comentarios sobre la sintaxis para ti. De lo contrario, tu pregunta se cerrará por ser subjetiva y argumentativa.) – jrockway

+0

@nickname: Como mencioné en mi respuesta, mucha de la sintaxis de Haskell es en realidad una pelusa opcional. Simplemente 'data',' case', y lambdas te permitirán hacer casi todo lo que quieras hacer. –

+0

Traté de eliminar todo el cebo de llama y hacer referencia a él, incluidos los comentarios que explican la sintaxis. Todavía soy nuevo aquí, así que todavía no estoy seguro de los protocolos exactos para hacer y responder preguntas. Gracias por su ayuda :) – nickname

13

¿Existen esquemas puramente funcionales (o Lisp en general)?

El ACL2 theorem prover es un Lisp puro. Sin embargo, está destinado a la demostración de teoremas más que a la programación, y en particular se limita a programas de primer orden. Sin embargo, ha sido extremadamente exitoso en su nicho. Entre otras cosas, ganó el 2005 ACM Software System Award.

13

No creo que haya ningún Lisps puramente funcional, 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 la Programación Funcional diseñado para Concurrencia y no pude encontrar uno.

http://clojure.org/rationale

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

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

Un puramente funcional lenguaje de programación sólo es bueno para la calefacción de su equipo .

Ver el presentation of Clojure for Lisp programmers.

+7

"Un lenguaje de programación puramente funcional solo sirve para calentar su computadora". Jaja! –

+3

Pero calentar la computadora también es un efecto secundario. – coredump

+0

@coredump Cuando ampliamos este concepto más allá, no puede haber ninguna cosa puramente funcional haciendo nada además de existir, porque cualquier movimiento crearía algo de calor como resultado de un proceso físico en el mundo real^_^Pero, una vez más, el hecho de que existe tiene efectos secundarios también ... – Zelphir

3

Si te gusta la sintaxis de Lisp a continuación, en realidad se puede hacer cosas similares en Haskell

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

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

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

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

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

Hay un par de proyectos que tienen como objetivo utilizar Haskell debajo de una sintaxis lispy. El más viejo, el más pesado y el más pesado es "Liskell". El más nuevo, más vivo y más liviano es hasp. Creo que puede que valga la pena echarle un vistazo.

24

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

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

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

conforma un lenguaje que no tiene set!.

4

Hace 30 años había lispkit lisp
No estoy seguro de qué tan accesible es hoy.
[Eso es uno de los lugares donde aprendí programación funcional]

3

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

Cuestiones relacionadas