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).