Hasta el momento hemos desarrollado un lenguaje que puede:
- Realizar operaciones aritmeticas y relacionales
- Puede manejar condicionales
- Puede manejar ligaduras locales
- Puede manejar procedimientos
Tenemos que nuestro lenguaje tiene
- Valores expresados: Numeros y booleanos
- Valores denotados: Numeros y booleanos
En general, podemos realizar codificacion, pero tenemos cierta limitación, y es que tiene que ver con que los procedimientos se conozcan a si mismos
let
f = proc(x,y) if >(x,0) then +(y, (f sub1(x) y)) else y
in
(f 10 5)
Vamos a dibujar el diagrama de ambientes de esta expresión
graph TD
A["empty-env"] --> B["env0
f
clousure('(x y) if ... empty-env)"]
A --> F["envprocf
x y
10 5"]
- En el ambiente env0 vamos a evaluar (f 10 5), esto produce que se extienda un ambiente de empty-env con x valiendo 10, y valiendo 5
- En envprocf vamos a evaluar el cuerpo del procedimiento if >(x,0) then +(y, (f sub1(x) y)) else y, validamos >(10,0) si, entonces va hacer +(y, (f sub1(x) y)) --> +(5, (f sub1(10) 5)) --> +(5, (f 9 5)) va intentar buscar f, el problema es que envprocf no lo tiene, entonces busca en el ambiente vacio haciendo falle la busqueda