Descargar 85,8 kb - U

Anuncio
Auxiliar Siete - CC41A
Lenguajes de Programación
My new religion: Pure functional programming!!!
Oscar E. A. Callaú
[email protected]
Santiago - Chile, 4/Mayo/2008
1.
Scope
Considere el siguiente programa:
{with {x 4}
{with {f {fun {y} {+ x y}}}
{with {x 5} {f 10}}}}
1. Cual es el valor de este programa, con scope estático? con scope dinámico?
2. Benancio, un alumno del curso le sugiere a ud. que podemos seguir usando scope dinámico, tomando la consideración de que cuando evaluamos una variable, tenemos que ir a
buscar el valor más antiguo de esta variable en el ambiente, en vez de buscar el más
reciente. Para este ejemplo esta claro que Benancio tiene la razón!!
Es cierto que Benancio tiene la razón en general?, Si es ası́ justifique, sino de un contraejemplo donde la aseveración de Benancio falla, además explique de forma concisa cual
es su error conceptual.
3. Benancio propone la siguiente implementación de la función interp:
(define (interp expr ds)
(type-case FAE expr
...
[app (fun-expr arg-expr)
(local ([define fun-val (interp fun-expr ds)])
(interp (closureV-body fun-val)
(aSub (closureV-param fun-val)
(interp arg-expr ds)
ds)))]))
Explique si la anterior implementación cumple con la definición de scope dinámico o
estático o ninguno de los dos anteriores. Provea ejemplos para justificar su respuesta.
1
2.
Benancio de nuevo!!!
Nuestro querido amigo Benancio, esta teniendo problemas con su implementación de
lazyness y le comenta que tiene la siguiente definición:
(define-type CFAE/L-Value
[numV (n number?)]
[closureV (param symbol?)
(body CFAE/L?)
(env Env?)]
[exprV (expr CFAE/L?)])
1. Dada las expresiones:
{with {a 5} {{fun {x} {+ x x}} {+ a 5}}}
{with {a 5} {{fun {x} {+ x x}} {/ a 0}}}
Cuales son los resultados que daria el interprete de Benancio?
2. Que errores puede encontrar en la implementación de Benancio?
3.
Empujando Haskell
Considere la siguiente función en Haskell:
foo x =
let y = 2
in y
Que hace la función foo? Pruebe su funcionamiento con distintos argumentos.
Porque no se cae si el argumento es head []?
Haskell soporta una función llamada seq, con firma:
seq :: a → b → b
seq toma dos argumentos: evalua el primer argumento (de tipo a) antes de retornar
el segundo (de tipo b). La particularidad de seq es que forza la evaluación de su primer
argumento. Por eso, seq es comunmente usado para mejorar el rendimiento del lenguaje,
evitando laziness cuando no es necesario.
Defina una variante de foo, llamada foo-s, que tenga el mismo comportamiento que
foo, excepto que asegura que su parametro x está evaluado.
Pruebe su función con varios parametros, incluyendo head [].
4.
Transparencia referencial
Definealo en sus palabras.
Que lenguaje conoce que cumple su definición?
De ejemplos de lenguajes y expresiones del mismo donde no se cumple este principio.
2
5.
Primeros pasos hacia objetos
1. Defina la función (point x y) tal que:
> (define p (point 2 3))
> (p ’getX)
2
> (p ’getY)
3
Hint: qué tipo de valores retorna la función point? qué mecanismo estudiado en clase
permite que una función tenga “estado”?
Hint: ’getX es un sı́mbolo. Los sı́mbolos pueden ser comparados con eq?.
2. Lo anterior se parece mucho a un programa con objetos básicos, con point siendo la
función “constructor” de objetos puntos. Qué es un objeto en este caso? un método?
3. Agregue el método dist que permita calcular la distancia al origen de un punto1 :
> (define p (point 1 1))
> (p ’dist)
1.4142135623730951
4. Cambie la definición de point de modo que el método dist use los métodos getX y
getY (y no accede directamente a las variables x y y). en qué mecanismo de Scheme se
tiene que apoyar para que esto funcione?
5. Si bien nuestros puntos son muy parecidos a objetos, no es posible con la definición
actual que se pueda cambiar la posición de un punto. De una nueva definición de point
que soporte lo siguiente:
> (define p (point 2 3))
> (p ’setX 10)
> (p ’getX ’())
10
Hint: para simplificar, asuma que todos los métodos aceptan un parámetro, que se ignora
cuando no es necesario.
Hint: acuérdese de como implementamos caching de evaluación perezosa.
1 La
función Scheme para calcular la raı́z de un número es sqrt.
3
Descargar