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 comilla invertida ). Estas funciones por sí solas lo convierten en 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 diferida . No se admiten variables.s
k
`
Unlambda es un software libre y de código abierto distribuido bajo una Licencia Pública General GNU (GPL) 2.0 o posterior. [ aclaración necesaria ]
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 funciones de un parámetro. No obstante, los datos se pueden simular con funciones apropiadas, como en el cálculo lambda . Las funciones multiparamétricas se pueden representar mediante el método de currificación .
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 de hola mundo en Unlambda: [1]
`r```````````.Hola .mundoi
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 la invoca. representa la versión de la función de identidad que no tiene dicho efecto secundario; se utiliza aquí como un argumento ficticio. El programa aplica la función -printing a un argumento ficticio de , devolviendo e imprimiendo la letra como efecto secundario. De manera similar, primero se aplica a , imprimiendo la letra y devolviendo ; 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 que ofrece Unlambda incluyen las funciones k
y s
. k
Crea funciones constantes: el resultado de es una función que, cuando se invoca, devuelve x . Por lo tanto, el valor de es x para cualquier x e y .`kx
``kxy
s
es un operador de evaluación generalizado. evalúa como para cualquier x , y y z . Es un hecho notable que y son suficientes para realizar cualquier cálculo, como se describe en el cálculo del combinador SKI . Como un breve ejemplo, la función 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 la llamada con la continuación actual , denotada como . Cuando se evalúa c
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, a continuación, 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 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 primero evalúa x , luego y , y luego aplica x a y . Sin embargo, si x evalúa al valor especial , entonces y no se evalúa; en cambio, el valor de la expresión es un objeto especial de "computación retrasada", 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 difiere los efectos secundarios hasta que el resultado se aplica a otro argumento.`xy
d
`dy
`iy
`iy
`dy
El siguiente operador incorporado 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 por conveniencia. (Esta expresión anterior es simplemente `Yk
, donde Y
denota un combinador de punto fijo ).
En la versión 2 de Unlambda se introdujeron más funciones integradas . La entrada se facilita mediante 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 a . Sin embargo, si no había más caracteres disponibles en la entrada, el carácter actual se deja sin definir y, en su lugar, se aplica x a . 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 , en caso contrario se evalúa .?u
@
i
v
?u
`xi
`xv
También existe un operador de "reimpresión" |
. Cuando se evalúa , se aplica la función x a si u es el carácter actual, o a si no hay ningún carácter actual.`|x
.u
v
Por último, existe un operador de salida e
. Cuando e
se aplica a x , se termina la ejecución del programa y x se toma como resultado del programa (la mayoría de los intérpretes existentes actualmente ignoran el resultado de todos modos).