Unlambda es un lenguaje de programación funcional mínimo inventado por David Madore . Se basa en la lógica combinatoria , una variante del cálculo lambda , que omite el operador lambda . El lenguaje se basa principalmente en dos funciones integradas ( s y k ) y el operador de aplicación ( ` ). Esto solo hace que el lenguaje Turing sea completo , pero también tiene varias funciones de E/S para la interacción del usuario, una función para la evaluación perezosa y equivalentes breves de algunas funciones.
Al ser un lenguaje de programación esotérico , Unlambda pretende ser una demostración de un lenguaje funcional muy puro , no para uso práctico. La característica principal es la ausencia de operadores y tipos de datos convencionales : las funciones de un argumento son el único tipo de datos. A pesar de esto, los datos se pueden reproducir usando las funciones apropiadas, como en el cálculo lambda. Las funciones con múltiples argumentos pueden curry .
Unlambda se basa en el principio de eliminación de abstracción , o la eliminación de todas las variables almacenadas, incluidas las funciones. Como en un lenguaje puramente funcional, en Unlambda las funciones no son solo objetos de primera clase , sino también los únicos objetos de primera clase.
Un ejemplo del programa Hello world se ve así:
`r```````````.Hola .worldiRegistro. x apunta a una función que toma un argumento y lo devuelve sin cambios, y también imprime el carácter "x" cuando se llama como efecto secundario . i representa una variante del mapeo de identidad que no tiene efectos secundarios y se usa como argumento ficticio. El programa `.di aplica la función .d , que imprime el carácter "d", al argumento i , devuelve i e imprime "d" como efecto secundario. De manera similar , ``.l.di primero aplica .l a .d , imprime "l" y devuelve .d , que luego se aplica a i como en el ejemplo anterior. La función r es azúcar sintáctica para una función que imprime un carácter de nueva línea.
Otros elementos importantes de Unlambda incluyen las funciones k y s , dos y tres argumentos respectivamente (aprobados por curry). k produce funciones constantes: el resultado de `kx es una función que devuelve x cuando se llama . Así que el valor de ``kxy será 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 . En particular, s y k son suficientes para realizar cualquier cálculo (ver Cálculo SKI para más detalles ). Como un breve ejemplo, la función de mapeo i puede expresarse como ``skk ' , ya que ```skkx devuelve x para cualquier x .
La única construcción de control de Unlambda es la continuación , denotada por c . Cuando se evalúa una expresión como `cx , se crea un objeto especial de "continuación" que representa el estado del intérprete en ese momento. Luego se calcula x y el resultado del cálculo se pasa a la continuación como argumento. Pero si se aplica la continuación a y , entonces la ejecución de x se aborta inmediatamente y el valor de la expresión `cx es y .
Aunque la evaluación en Unlambda suele ser "zealous" (traducción literal del término en inglés ávida evaluación ; es decir, el valor de un argumento se evalúa antes de pasar a una función), existe la posibilidad de evaluación perezosa , denotada por el operador d . Por lo general, para evaluar una expresión como `xy , Unlambda primero evalúa x , luego y , y luego aplica x a y . Si el valor de x es d , entonces y no se evalúa. El valor de la expresión `dy es un objeto de evaluación perezoso especial que, cuando se aplica a un argumento z , evalúa y y luego aplica el valor resultante a z . Tenga en cuenta que esto es lo mismo que `iy en ausencia de efectos secundarios . La diferencia es que `y ejecuta inmediatamente cualquier efecto secundario en y , mientras que `dy los retrasa hasta que el resultado se aplica a otro argumento.
La función v toma un argumento, lo ignora y devuelve v . Se puede aplicar a cualquier número de argumentos. La v no es necesaria, ya que puede expresarse como ```sii``s`kk``sii (es decir, en notación Lisp o notación tradicional), pero está presente por conveniencia (y también para acelerar el intérprete) .
La entrada a Unlambda es proporcionada por los operadores @ y ?u . Cuando @ se aplica a la función x , el carácter se lee de la entrada y se almacena como el "carácter actual" ( carácter actual ), luego se aplica x a i . Si no hay más caracteres en la entrada, entonces el "carácter actual" permanece sin definir. Cuando la función ?u se aplica a x , el resultado será `xi si el carácter actual es u ; de lo contrario, se evaluará `xv .
También hay una función para imprimir el carácter actual - | . Al evaluar `|x , la función x se aplica a .u si u es el carácter actual, de lo contrario, a v si el carácter actual no está definido.
Y finalmente, hay un operador de salida - e . Cuando se aplica e a x , la ejecución del programa se cancela y se devuelve x como resultado del programa (la mayoría de los intérpretes existentes lo ignoran).
Lenguajes de programación | |
---|---|
|