Este evaluador basado en la Máquina G, posee un numero reducido de palabras reservadas, aunque las suficientes para poder implementar cualquier función que sea necesaria.
Comentarios:
Se representan entre corchetes. { Esto es un comentario } |
Primitivas Aritméticas: +, -, *, /, mod
Todas estas funciones primitivas tienen dos argumentos estrictos. La función mod, ofrece el resto de la division entera entre dos valores. |
Operadores Relacionales: ==, >, >=, <, <=, <>
Estas funciones tambien operan sobre dos argumentos estrictos, y dan como resultado 'true' o 'false'. Recuerdese que en lambda cálculo, las llamadas a funciones se hacen de forma infija, así: < 2 3, == 5 6, etc. |
Operadores Lógicos: and, or, not.
Ofrecen la posibilidad de operar logícamente el resultado de comparaciones hechas con las primitivas de comparación. Las primitivas 'and' y 'or' son estrictas en sus primer argumento, y la primitiva 'not' en su argumento. |
Primitiva Condicional: if.
Esta primitiva posee tres argumentos, de los cuales solo el primero es estricto, es decir, que se evalua en primer lugar y dependiendo de si su valor es true o false, se devolvera el segundo o el tercer argumento respectivamente. Ejemplo: En este ejemplo se ha incluido la clausula where, esta clausula se aplica tras una expresión y sirve para sustituir variables libres por un valor determinado, puediendo ser este valor incluso una función. Ejemplo con where. (+ (* x y) (+ x y) where x = 5 ) where y = 7 Las palabra reservadas 'true' y 'false' puede ser introducidas directamente. |
Primitivas para el manejo de listas.
Constructor de listas:
En este evaluador el constructor de listas queda representado por: [ (expr1) (expr2) .... (expr n) ......], por tanto las listas podran ser heterogeneas. Tambien tenemos la posibilidad de construir listas con las palabras reservadas 'list' y 'nil'. Vemos a continuación como definimos una lista con tres valores utilizando ambas formas. [1 2 3] o tambien: list 1 (list 2 (list 3 nil ) ) ) |
Primitiva: head
Esta primitiva, devuelve el elemento que se encuentra en la cabeza de una lista, siempre y cuando no se trate de la lista vacia. Ejemplo: |
Primitiva: tail
Esta primitiva, devuelve la cola de una lista, siempre y cuando no se trate de la lista vacia. Ejemplo: |
Primitiva: isnil
Indica si una lista es vacia o no lo es. Ejemplo: |
Primitiva: cons
Este es el constructor de listas. Añade un elemento a una lista, por su cabeza. Ejemplo: |
Combinadores
Combinador: Y
El combinador Y se utiliza para presentar recursión. La definición de este combinador es: Y = \f. f (Y f). Ejemplo de función recursiva, usando este combinador. El famoso factorial. (Y (\fact.\x. if (< x 1) 1 (* x (fact (- x 1)))) ) 7 Esta expresión, calcula el factorial de 7. |
Combinador: K
Este combinador, aplicado a dos argumentos, devuelve siempre el primero. Su definición es: K = \x.\y. x |
Combinador: I
Este es el combinador Identidad. Se define como: I = \x. x |