Unlambda es un lenguaje de programación funcional mínimo, "casi puro " [1] inventado por David Madore. Se basa en la lógica combinatoria , un sistema de expresión sin el operador lambda ni variables libres. Se basa principalmente en dos funciones integradas ( y ) y un operador de aplicación (escrito , el carácter de comillas inversas ). Estos por sí solos lo hacen Turing completo , pero también hay algunas funciones de entrada / salida (E / S) para permitir la interacción con el usuario, algunas funciones de acceso directo y una función de evaluación perezosa . Las variables no son compatibles.s
k
`
Paradigma | Prácticamente puramente funcional |
---|---|
Diseñada por | David Madore |
Desarrollador | David Madore |
Apareció por primera vez | 28 de junio de 1999 |
Lanzamiento estable | 2.0.0 / 20 de diciembre de 1999 |
Disciplina de mecanografía | Sin tipo |
Lenguaje de implementación | Esquema , C , Java |
Licencia | GPL 2.0 o posterior |
Sitio web | www |
Unlambda es un software gratuito y de código abierto distribuido bajo una Licencia Pública General GNU (GPL) 2.0 o posterior.
Principios básicos
Como lenguaje de programación esotérico , Unlambda está pensado como una demostración de programación funcional muy pura más que para un uso práctico. Su característica principal es la falta de operadores y tipos de datos convencionales; el único tipo de datos en el programa son las funciones de un solo parámetro. No obstante, los datos se pueden simular con funciones adecuadas como en el cálculo lambda . Las funciones de múltiples parámetros se pueden representar mediante el método de curado .
Unlambda se basa en el principio de eliminación de abstracción , o la eliminación de todas las variables guardadas, incluidas las funciones. Como lenguaje puramente funcional, las funciones de Unlambda son objetos de primera clase y son los únicos objetos de este tipo.
A continuación, se muestra una implementación de un programa Hola mundo en Unlambda: [1]
`r``````````` .Hola .worldi
Funciones integradas originales
La notación denota una función que toma un argumento y lo devuelve sin cambios, imprimiendo el carácter único x como efecto secundario cuando se invoca. representa la versión de la función de identidad que no tiene tal efecto secundario; se utiliza aquí como un argumento ficticio. El programa aplica la función -printing a un argumento ficticio de , devolver e imprimir la carta como efecto secundario. Del mismo modo, primero se aplica a , imprimir la carta y devolverla ; este resultado de se aplica luego a como en el ejemplo anterior. La función es azúcar sintáctica para la función que imprime un carácter de nueva línea..x
i
`.di
d
i
i
d
``.l.di
.l
.d
l
.d
.d
i
r
Otras características importantes proporcionadas por Unlambda incluyen las funciones k
y s
. k
fabrica funciones constantes: el resultado de es una función que, cuando se invoca, devuelve x . Por tanto, el valor de es x para cualquier x e y .`kx
``kxy
s
es un operador de evaluación generalizado. se evalúa para cualquier x , y y z . Es un hecho destacable que y son suficientes para realizar cualquier cálculo, como se describe en el cálculo del combinador de SKI . Como un breve ejemplo, la función de identidad se puede implementar como , ya que produce x para todo x .```sxyz
``xz`yz
s
k
i
``skk
```skkx
La única construcción de control de flujo de Unlambda es llamada con continuación actual , denotada c
. Cuando se evalúa una expresión de la forma , se construye un objeto de continuación especial , que representa el estado del intérprete en ese momento. Luego se evalúa x , y luego se le da al resultado el objeto de continuación como argumento. Si la continuación nunca se aplica a un argumento, el valor de la expresión es el mismo que el valor de x . Pero si el objeto de continuación se aplica a un valor y , la ejecución de x se cancela inmediatamente y el valor de toda la expresión es y .`cx
`cx
`cx
La semántica de ejecución de Unlambda es normalmente una evaluación ansiosa , pero existe una opción de evaluación perezosa , indicada por el uso del d
operador. Por lo general, para evaluar una expresión de la forma , unlambda evalúa primero x , entonces y , a continuación, aplica x a y . Sin embargo, si x se evalúa al valor especial , a continuación, y se no evaluados; en cambio, el valor de la expresión es un objeto especial de "cálculo retardado" que, cuando se aplica a un argumento z , evalúa y , y luego aplica su valor a z . En ausencia de efectos secundarios, esto es exactamente lo mismo que . La diferencia es que ejecuta cualquier efecto secundario en y inmediatamente, mientras que pospone los efectos secundarios hasta que el resultado se aplica a otro argumento.`xy
d
`dy
`iy
`iy
`dy
El siguiente operador integrado de Unlambda es v
, que ignora su argumento y devuelve v
. Esta característica no es estrictamente necesaria, ya que v
podría implementarse como ``s`k``s``s`kskk`k``s``s`kskk
, pero se proporciona para su conveniencia. (Esta expresión anterior es simplemente `Yk
, donde Y
denota un combinador de punto fijo ).
Funciones integradas de la versión 2
Se introdujeron más incorporados en la versión 2 de Unlambda. La entrada es facilitada por los operadores @
y . Cuando se aplica a una función x , se lee un carácter de la entrada y se almacena como el "carácter actual"; luego se aplica x . Sin embargo, si no hay más caracteres disponibles en la entrada, el carácter actual se deja sin definir y se aplica x en su lugar. Cuando se aplica una función a una función x , el resultado es la evaluación de si el carácter actual es u , de lo contrario se evalúa.?u
@
i
v
?u
`xi
`xv
También hay un operador de "reimpresión" |
. Cuando se evalúa, la función x se aplica a si u es el carácter actual, o si no hay ningún carácter actual.`|x
.u
v
Finalmente, hay un operador de salida e
. Cuando e
se aplica ax , la ejecución del programa finaliza y x se toma como resultado del programa (la mayoría de los intérpretes existentes ignoran el resultado de todos modos).
Ver también
Referencias
- ↑ a b Chu-Carroll, Mark C. (11 de agosto de 2006). "Programación patológica viernes: Unlambda, o programación sin variables" . Buenas matemáticas, malas matemáticas (blog) . ScienceBlogs.
- Felix-Hernandez Campos (1 de abril de 2002), Conferencia 28: Más sobre programación funcional , Universidad de Carolina del Norte COMP144
- 原 悠 (Yutaka Hara) (2008). Ruby で 作 る 奇妙 な プ ロ グ ラ ミ ン グ 言語(en japonés). Tōkyō: Mainichikomyunikēshonzu. págs. 205–214. ISBN 4-8399-2784-7.
enlaces externos
- Página web oficial
- REPL de Unlambda en línea