1. Recursi´on 
Considere el siguiente programa: 
{with {fact {fun {n} {if0 n 1 {* n {fact {- n 1}}}}}} 
{fact 10}} 
1. De el equivalente de este programa sin with, usando la equivalencia entre with y otras expresiones del lenguaje. 
2. Describa su evaluaci´on en un interprete con substituci´on explicita (es decir, usando subst). 
3. Describa su evaluaci´on en un interprete con substituci´on diferida (es decir, usando un ambiente). 


Soluci´on:
1. Sabemos que with es un az´ucar sint´actico, puede ser representado como una aplicaci´on de una funci´on 
an´onima. 

{{fun {fact} {fact 10}} 
{fun {n} {if0 n 1 {* n {fact {- n 1}}}}}} 

2. Con el paso de substitucion que vimos en clase, lo unico que occurir´a es: 


{{fun {fact} {fact 10}} 
{fun {n} ...}} 
-> 
{{fun {n} ...} 10} 
-> 

Se caer´a al interpretar porque la occurrencia de fact en los ... no es substituida. 
Esto es porque el proceso de substitucion no se aplica recursivamente: 

(define (subst expr sub-id val) 
... 
(id (v) (if (symbol=? v sub-id) val expr)) 
... 
) 

No aplica subst a val. Si trat´aramos de substituir recursivamente en val cuando es un fun, tendr´ıamos. 

(fun {n} {if0 n 
1 
{* n {{fun {n} ...} {- n 1}}}}} 

Es decir, al tratar de substituir caemos en un loop inﬁnito debido a la llamada recursiva. 

3. Con substituci´on diferida, recordar que al aplicar una funci´on extendimos el ambiente capturado al momento 
de su deﬁnici´on. 

{with {fact {...}} 
{fact 10}} 
<=> {{fun {fact} {fact 10}} ;; cuerpo de la funci´on 
{fun {x} {if0 x 1 {* fact {- x 1}} x}}}} ;; argumento 

Para interpretar la funci´on, interpretamos su cuerpo en un ambiente (de la clausura) extendido, donde el 
par´ametro (fact) vale la interpretaci´on del argumento. 

fun = (interp {fun {fact} ...} (mtEnv)) = (closureV fact {fact 10} (mtEnv)) 
arg = (interp {fun {x} ...} (mtEnv)) = (closureV x (if0 ... {fact ...}) (mtEnv)) 

Interpretamos el cuerpo de la funci´on (fun) en el ambiente de su clausura (mtEnv) extendido con. 
fact -> {fun {x} {if0 ... {fact ...}}} 

Interpretamos el cuerpo de la funci´on fact en el ambiente de su clausura (mtEnv) extendido con 

x -> 10 

s.p.d.g, si x es mayor que 0. al interpretar (fact (- x 1)). llegamos a un error de free-identiﬁer fact. 