Unlambda
Unlambda es un mínimo, "casi puro" Lenguaje de programación funcional inventado por David Madore. Se basa en la lógica combinatoria, un sistema de expresión sin operador lambda ni variables libres. Se basa principalmente en dos funciones integradas (s
y k
) y un operador de aplicación (escrito `
, el carácter de comilla inversa). 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 diferida. Las variables no son compatibles.
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 pretende ser una demostración de programación funcional muy pura en lugar de 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. Sin embargo, 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 curry.
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.
Aquí hay una implementación de un programa hola mundo en Unlambda:
`r`````````.H.e.l.o.w.o.r.l.di
Funciones integradas originales
La notación .x
denota una función que toma un argumento y lo devuelve sin cambios, imprimiendo el carácter único x como efecto secundario cuando es invocado. i
representa la versión de la función de identidad que no tiene ese efecto secundario; se usa aquí como un argumento ficticio. El programa `.di
aplica la función de impresión d
a un argumento ficticio de i
, devolviendo i
e imprimiendo la letra d
como efecto secundario. De manera similar, ``.l.di
primero aplica .l
a .d
, imprimiendo la letra l
y devolviendo .d; este resultado de .d
luego se aplica a i
como en el ejemplo anterior. La función r
es azúcar sintáctica para la función que imprime un carácter de nueva línea.
Otras funciones importantes proporcionadas por Unlambda incluyen las funciones k
y s
. k
fabrica funciones constantes: el resultado de `kx
es una función que, cuando se invoca, devuelve x. Por lo tanto, el valor de ``kxy
es x para cualquier x e y.
s
es un operador de evaluación generalizado. ```sxyz
se evalúa como ``xz`yz
para cualquier x, y y z. Es un hecho notable que s
y k
son suficientes para realizar cualquier cálculo, como se describe en el cálculo del combinador SKI. Como breve ejemplo, la función de identidad i
se puede implementar como ``skk
, ya que ```skkx
produce x para todos los x.
La única construcción de control de flujo de Unlambda es una llamada con continuación actual, denominada c
. Cuando se evalúa una expresión de la forma `cx
, se construye un objeto 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 `cx
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 todo el `cx
es y.
La semántica de ejecución de Unlambda normalmente es una evaluación ansiosa, pero existe una opción de evaluación perezosa, indicada por el uso del operador d
. Por lo general, para evaluar una expresión de la forma `xy
, unlambda primero evalúa x, luego y y luego aplica x a y. Sin embargo, si x se evalúa como el valor especial d
, entonces y no se evalúa; en cambio, el valor de la expresión `dy
es un "cálculo retrasado" 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 `iy
. La diferencia es que `iy
ejecuta inmediatamente cualquier efecto secundario en y, mientras que `dy
difiere los efectos secundarios hasta que el resultado se aplica a otro argumento.
El siguiente operador integrado de Unlambda es v
, que ignora su argumento y devuelve v
. Esta función no es estrictamente necesaria, ya que v
podría implementarse como ``s`k``s``s`kskk`k``s``s`kskk
, pero se suministra como una 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 elementos integrados en la versión 2 de Unlambda. La entrada la facilitan los operadores @
y ?u
. Cuando se aplica @
a una función x, se lee un carácter desde la entrada y se almacena como el "carácter actual"; entonces x se aplica a i
. Sin embargo, si no había más caracteres disponibles en la entrada, el carácter actual se deja sin definir y x se aplica a v
en su lugar. Cuando una función ?u
se aplica a una función x, el resultado es la evaluación de `xi
si el carácter actual es u, de lo contrario se evalúa `xv
.
También hay una "reimpresión" operador |. Cuando se evalúa `|x
, la función x se aplica a .u
si u es el carácter actual, oa v
si no hay ningún carácter actual.
Finalmente, hay un operador de salida e
. Cuando e
se aplica a x, la ejecución del programa finaliza y x se toma como el resultado del programa (la mayoría de las veces los intérpretes existentes actualmente ignoran el resultado de todos modos).
Contenido relacionado
Retardo de fotograma
BS2000
Reconocimiento óptico de caracteres