Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
teaching:cc4101:tareas:2016-1:tarea2 [2016/05/14 01:48] – [Tarea 2] fmossoteaching:cc4101:tareas:2016-1:tarea2 [2016/11/13 01:10] – [Tarea 2] fmosso
Line 5: Line 5:
 En esta tarea se le provee el lenguaje MiniScheme+, que corresponde a un intérprete extendido con estructuras de primera clase y pattern matching((MiniScheme+ usa un ambiente mutable que permite definir funciones recursivas con ''%%define%%''.)). Además, MiniScheme+ incorpora el uso de primitivas((Para entender el concepto de funciones primitivas, vea http://pleiad.cl/teaching/primitivas.)). A continuación se presenta un breve tour de las características de MiniScheme+: En esta tarea se le provee el lenguaje MiniScheme+, que corresponde a un intérprete extendido con estructuras de primera clase y pattern matching((MiniScheme+ usa un ambiente mutable que permite definir funciones recursivas con ''%%define%%''.)). Además, MiniScheme+ incorpora el uso de primitivas((Para entender el concepto de funciones primitivas, vea http://pleiad.cl/teaching/primitivas.)). A continuación se presenta un breve tour de las características de MiniScheme+:
   -// Funciones de primera clase con argumentos múltiples//: las funciones y las expresiones ''%%with%%'' pueden tener 0 o más argumentos, por ejemplo: <code scheme>   -// Funciones de primera clase con argumentos múltiples//: las funciones y las expresiones ''%%with%%'' pueden tener 0 o más argumentos, por ejemplo: <code scheme>
-> (run '{{fun {x y z} {+ x y z}} 1 2 3}) +> (run '(+ 1 ((fun ([: Num] [: Num]) (+ x y)1 2))
-+4
-> (run '{with {{x 1} {y 2} {z 3}} {+ x y z}}) +
-+
-> (run '{with {} {{fun {} 42}}}+
-42+
 </code> </code>
-  - //Definiciones usando ''%%local%%''''%%define%%'' y ''%%datatype%%''//: la expresión ''%%local%%'' permite realizar definiciones de identificadores y de estructuras de datos, usando ''%%define%%'' y ''%%datatype%%'' respectivamente. Por ejemplo: <code scheme> +  - //Definiciones usando ''%%local%%'' ''%%define%%''//: la expresión ''%%local%%'' permite realizar definiciones de identificadores usando ''%%define%%''. Por ejemplo: <code scheme> 
-> (run '{local {{define x 1}  +> (run '(local ((define x 10) 
-                {define y 2}}  +                    (define y x)) 
-           {+ x y}}) +              (+ x y))) 
-+20
-> (run '{local {{datatype Nat  +
-                  {Zero}  +
-                  {Succ n}}} +
-          {Nat? {Zero}}}) +
-#t +
-> (run '{local {{datatype Nat  +
-                  {Zero}  +
-                  {Succ n}} +
-                {define pred {fun {n}  +
-                               {match n +
-                                 {case {Zero} => {Zero}} +
-                                 {case {Succ m} => m}}}}} +
-          {pred {Succ {Succ {Zero}}}}}+
-{Succ {Zero}}+
 </code> </code>
-Observe que ''%%define%%'' y ''%%datatype%%'' sólo pueden usarse en la zona de declaraciones de una expresión ''local''. Al declarar una estructura, la implementación extiende el ambiente usado en el cuerpo de ''local'' con las funciones constructoras de cada variante; y con predicados para determinar si un valor corresponde a la estructura (en general, y para cada variante). Para más detalles, consulte la implementación y tests provistos+Observe que ''%%define%%'' sólo puede usarse en la zona de declaraciones de una expresión ''local''. Para más detalles, consulte la implementación y tests provistos.
- +
-**Warm-up (0.5 ptos)** +
-Si ejecutan el último ejemplo, veran que el output no es ''{Succ {Zero}}'' sino ''(structV 'Nat 'Succ (list (structV 'Nat 'Zero empty)))''.  +
-Luego de estudiar el código entregado para entender como se implementan las estructuras de datos, definan una función de pretty-printing para que las estructuras se representen al usuario (como resultado de ''run'') tal como esperado. Para simplificar, retornen una string (por ejemplo ''"{Zero}"'').+
    
 ===== Listas (1.5 ptos) ===== ===== Listas (1.5 ptos) =====
Line 89: Line 67:
 //Nota: Todas las definiciones que se le piden a continuación deben realizarse en el lenguaje MiniScheme+ con las extensiones hasta este punto de la tarea.// //Nota: Todas las definiciones que se le piden a continuación deben realizarse en el lenguaje MiniScheme+ con las extensiones hasta este punto de la tarea.//
  
- Observe que para fines de presentación y de corrección, el intérprete define una conversión entre estructuras ''List'' de MiniScheme+ y listas de Racket. 
   - (0.4) Defina las funciones ''stream-hd'' y ''stream-tl'' para obtener la cabeza y la cola de un stream. Por ejemplo: <code scheme>   - (0.4) Defina las funciones ''stream-hd'' y ''stream-tl'' para obtener la cabeza y la cola de un stream. Por ejemplo: <code scheme>
 (def stream-hd ...) (def stream-hd ...)