# Simulacro C2 ## 1. Semanticas de evaluacion de funciones ### a. Semanticas: * Call-by-need (Cajas) * Call-by-name 3* Call-by-value ### b. #### Call-by-value e amb externo Sigue siendo un lenguaje eager E= (anEnv 'y 5 e) ------- E2 = (anEnv 'f (closure 'x (sum x y) E) E) ------ E3 = (anEnv 'x 1 E) se evalua el cuerpo #### Call-by-name E = (anEnv 'y (sum 2 3) e) ------ E2 = (anEnv 'f (closure 'x (sum x y) E) E) ------- E3 = (anEnv 'x (numV 1) E) #### Call-by-need E = (anEnv 'y (ExprV (sum 2 3) (box #f)) e) ----- E2 = (anEnv 'f (closure 'x (sum x y) E) E) ----- E3 = (anEnv 'x (numV 1) E) ---- E = (anEnv 'y (ExprV (sum2 3) (box 6)) e) Tips de pregunta: 1. TEoria 2. Este, esta no va salir 3. Interprete arreglar, etc 2. Defina la version bla para que sea recursiva por la cola, va a salir. a) Filter rec. x cola ``` (define (filter predicate list) (match list ['() list] [(cons h t) (if (predicate h) (cons h (filter predicate t)) (filter predicate t) ) ] ) ) ; mal porque tiene que ir la app de fun en la cola donde está el if. ; Siempre hay que hacer un acomulador ; Es siempre parecido, hacer una fun aux con acc, hacer match, poner el tail-call ; y cachar que meeter en el acc. ; SI HAY MÁS de un caso inductivo hay q hacer llamad apor la cola en todos (define (aux-filter predicate list acc) (match list ['() list] [(cons h t) (aux-filter predicate t (if (predicate h) (append acc (list h) acc)))] ) ) (define (filter pred list) (aux-filter pred list '())) ; esta ultima es rec por la cola por vacuidad ``` Se implementa b) Uno es un caso particular del otro. Tail Call. Accion final en la interpretacion TCO: TRO: Caso particula en que la llamada es recursiva. c) Toda la info que necesita esta en el acomulador asi que el stack no crece indiscriminadamente. No hay Stack Overflow Desventaja: Es dificil debugear porque el stack tiene 1 frame. No hay stack-trace. 3. Para call by need y Ambiente ciclico. Son necesarios? Ambiente ciclico, unica opcion es mutacion. Para nterpretar call by need, es necesario tambien para cambiar las boxes en todas los ambientes. 4. Discuta: Args x valor vs x referencia. Por referencia pueden haber cambio sinnesperados. Expresividad: La referencia es más expresiva, puedo simular valor con ella. Al revés es más complicado. Eficiencia: Puede ser más barato el valor y buscarlo, q la referencia. Pero al revés tambien puede ser más barata la referencia porque no es necesario copiar el valor.