Docencia cc41a, 2004/1, clase 04/05

Intérpretes

El intérprete anterior falla al intentar ejecutar funciones con nombre en nuestro dialecto (mi-scheme).
(define a 1)
(define f (lambda(b) (list a b)))
(evaluate '(f 2) ())
-> (1 2)
(define f (evaluate '(lambda(b) (list a b)) ()))
(evaluate '(f 2) ())
--> error
Cree que f es una función scheme y en realidad es una función mi-scheme. Usaremos entonces la pregunta primitive? en vez de procedure? y ahora funciona. El nuevo intérprete tiene este código.
(define f (evaluate '(lambda(b) (list a b)) ()))
(evaluate '(f 2) ())
-> (1 2)
(define f (lambda(b) (list a b)))
(evaluate '(f 2) ())
-> error
El segundo error es aceptable, puesto que solo aceptamos primitivas Scheme y funciones definidas en mi-scheme.

Variables léxicas y dinámicas

El intérprete anterior es de alcance léxico:
(define a 3)
(define f (evaluate '(lambda(b) (list a b)) '((a . 1))))
(evaluate '(f 2) '((a . 2)))
-> (1 2)
Para hacer uno de alcance dinámico, usamos el siguiente código:
(define a 3)
(define f (evaluate '(lambda(b) (list a b)) '((a . 1))))
(evaluate '(f 2) '((a . 2)))
-> (2 2)
Existen entonces 3 espacios de donde obtener valores para las variables: el global (scheme), el dinámico (tiempo de invocación) y el léxico (tiempo de definición de la función).