Documente Academic
Documente Profesional
Documente Cultură
Hoy veremos...
Conceptos generales
Quasiquotation
Macros en Scheme
Ejemplos de macros
Referencias
Captulo 3.7 Programming Language Pragmatics: Macro Expansion
Definicin de macro
Una macro consiste en una plantilla o meta-expresin que define un patrn
de sustitucin formado por unas variables libres y unas expresiones
textuales.
Es una tcnica de generacin de cdigo
Se realiza en la fase de preprocesamiento (en lenguajes compilados como C
o C++)
Previamente a la evaluacin de la expresin (en lenguajes interpretados)
Las macros son un meta-lenguaje, en el sentido de que permiten controlar y
definir expresiones del propio lenguaje
No estn sometidas a la sintaxis del lenguaje
mircoles 23 de marzo de 2011
Macros en C
Ejemplos de Macros:
#define LINE_LEN 80
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define SWAP(a,b) {int t = (a); (a) = (b); (b) = t;}
#define then
#define begin {
#define end ;}
Lo probamos:
if (i > 0) then
begin
a = 1;
b = 2
end
Problemas de la expansin en C
El preprocesador de C extiende la macro de forma ciega sin tener ninguna
relacin con el proceso de compilacin posterior
Esto puede producir errores. Por ejemplo, si llamamos a MAX(x++, y++) la
expansin de la macro produce el siguiente resultado:
((a++) > (b++) ? (a++) : (b++))
Quasiquotation
La forma especial quasiquote junto con unquote permite evaluar de forma
arbitraria las expresiones que nos interesan en una lista:
(define bar 2)
(quasiquote (foo (unquote bar) baz))
Macros en Scheme
Se basan en las formas especiales define-syntax y syntax-rules
Sintaxis de una macro:
(define-syntax <keyword>
(syntax-rules (<literales>)
((<patron-1> <plantilla-1>)
...
(<patron-n> <plantilla-n>))))
Ejemplo: mi-or
(define-syntax mi-or
(syntax-rules ()
((mi-or) #t)
((mi-or e) e)
((mi-or e1 e2 e3 ...)
(if e1 #t (mi-or e2 e3 ...)))))
mircoles 23 de marzo de 2011
(define-syntax mi-or
(syntax-rules ()
((op) #t)
((op e) e)
((op e1 e2 e3 ...)
(if e1 #t (mi-or e2 e3 ...)))))
Depuracin de macros
(define-syntax mi-or
(syntax-rules ()
((op) #t)
((op e) e)
((op e1 e2 e3 ...)
(if e1 #t (mi-or e2 e3 ...)))))
Macro make-procedure
(define-syntax make-procedure
(syntax-rules ()
((make-procedure (x ...) expr ...)
(lambda (x ...) expr ...))))
Macro mi-let
Macro mi-let
(define-syntax mi-let
(syntax-rules ()
((mi-let ((x v) ...) e ...)
((lambda (x ...) e ...) v ...))))
Macro mi-cond
Macro mi-cond
(define-syntax mi-cond
(syntax-rules (=> else)
((mi-cond (else => expr))
expr)
((mi-cond (test1 => expr1))
(if test1 expr1))
((mi-cond (test1 => expr1) (test2 => expr2) ...)
(if test1 expr1 (mi-cond (test2 => expr2) ...)))))