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
teaching:cc4101:tareas:2015-2:tarea3 [2015/10/17 20:41] – [(1.0) De AST a código de máquina] racruzteaching:cc4101:tareas:2015-2:tarea3 [2016/03/25 15:42] (current) – old revision restored (2015/10/31 14:36) fmosso
Line 59: Line 59:
          
 > (deBruijn (add (num 1) (id 'x))) > (deBruijn (add (num 1) (id 'x)))
-;Arroja error "unbound indentifier"+;Arroja error "unbound identifier"
 </code> </code>
  
Line 83: Line 83:
                                    {< x 10}} {+ 2 3}})))                                    {< x 10}} {+ 2 3}})))
 (list (list
- (INT_CONST 2) 
  (INT_CONST 3)  (INT_CONST 3)
 + (INT_CONST 2)
  (ADD)  (ADD)
- (CLOSURE (list (ACCESS 0) (INT_CONST 10) (LESS) (RETURN)) (MTFun (MTNum) (MTBool)))) + (CLOSURE (list (INT_CONST 10) (ACCESS 0) (LESS) (RETURN)) (MTFun (MTNum) (MTBool))) 
- (APPLY))                                  + (APPLY)) 
 </code> </code>
 En el ejemplo anterior se puede notar que los tipos que entiende la máquina no se crean con los constructores de ''%%Type%%''. Los tipos en la máquina esta definidos con el ''%%deftype MType%%'' por lo que debe hacerse una transformación de los tipos de ''%%Type%%'' a ''%%MType%%''. Las reglas para la transformación son: En el ejemplo anterior se puede notar que los tipos que entiende la máquina no se crean con los constructores de ''%%Type%%''. Los tipos en la máquina esta definidos con el ''%%deftype MType%%'' por lo que debe hacerse una transformación de los tipos de ''%%Type%%'' a ''%%MType%%''. Las reglas para la transformación son:
Line 111: Line 111:
  
 Implemente la función ''%%(typeof-with-sub expr)%%'' que recibe un nodo del AST y retorna el tipo correspondiente a el o falla con ''%%TYPE_ERROR%%'' en caso de que la expresión no sea válida. Considere que ''%%(typeof-with-sub expr)%%'' se comporta igual que la función ''%%(typeof expr)%%'' de la pregunta anterior, salvo por: Implemente la función ''%%(typeof-with-sub expr)%%'' que recibe un nodo del AST y retorna el tipo correspondiente a el o falla con ''%%TYPE_ERROR%%'' en caso de que la expresión no sea válida. Considere que ''%%(typeof-with-sub expr)%%'' se comporta igual que la función ''%%(typeof expr)%%'' de la pregunta anterior, salvo por:
-  * La existencia de ''%%Any%%'' permite tipear ''%%{if #t 1 #f}%%'' como del tipo ''%%Any%%''. Es decir que frente a tipos distintos en las ramas el resultado es Any.+  * La existencia de ''%%Any%%'' permite tipear ''%%{if #t 1 #f}%%'' como del tipo ''%%TAny%%''((variante del tipo Type para Any)). Es decir que frente a tipos distintos en las ramas el resultado es ''%%TAny%%''.
   * En la definición de función, el cuerpo puede ser subtipo del tipo declarado de salida de la función   * En la definición de función, el cuerpo puede ser subtipo del tipo declarado de salida de la función
   * En la aplicación de función, el tipo del argumento puede ser subtipo del tipo declarado del argumento de la función.   * En la aplicación de función, el tipo del argumento puede ser subtipo del tipo declarado del argumento de la función.
Line 160: Line 160:
   - Actualice la función ''%%çompile%%'' para que genere un ''%%CHECKCAST%%'' para un expresión ''%%cast%%''. <code scheme>   - Actualice la función ''%%çompile%%'' para que genere un ''%%CHECKCAST%%'' para un expresión ''%%cast%%''. <code scheme>
 > (compile (parse '{cast Num (and #t #f)})) > (compile (parse '{cast Num (and #t #f)}))
-(list (BOOL_CONST #t) (BOOL_CONST #f) (AND) (CHECKCAST (MTNum)))+(list (BOOL_CONST #f) (BOOL_CONST #t) (AND) (CHECKCAST (MTNum)))
 </code> </code>
   - Implemente la función ''%%(typed-compile s-expr)%%'' que se encarga de todo el proceso de generación de código desde una ''%%S-Expr%%'', considerando el parsing, la nueva validación de tipos, la transformación con índices De Bruijn y el paso a listas de instrucciones que considera incluir la instrucción ''%%(CHECKCAST type)%%'' para hacer validación dinámica de tipos.   - Implemente la función ''%%(typed-compile s-expr)%%'' que se encarga de todo el proceso de generación de código desde una ''%%S-Expr%%'', considerando el parsing, la nueva validación de tipos, la transformación con índices De Bruijn y el paso a listas de instrucciones que considera incluir la instrucción ''%%(CHECKCAST type)%%'' para hacer validación dinámica de tipos.