• No se han encontrado resultados

Tema 5: Macros. Sesión 14: Macros

N/A
N/A
Protected

Academic year: 2021

Share "Tema 5: Macros. Sesión 14: Macros"

Copied!
23
0
0

Texto completo

(1)

Tema 5: Macros

(2)

Hoy veremos...

• Conceptos generales

• Quasiquotation

• Macros en Scheme

(3)

Referencias

(4)

Definición de macro

• Una macro consiste en una plantilla o meta-expresión que define un patrón de sustitución formado por unas variables libres y unas expresiones

textuales.

• Es una técnica de generación de código

• Se realiza en la fase de preprocesamiento (en lenguajes compilados como C o C++)

• Previamente a la evaluación de la expresión (en lenguajes interpretados)

• Las macros son un meta-lenguaje, en el sentido de que permiten controlar y definir expresiones del propio lenguaje

(5)

Evolución histórica de las macros

• Orígen de las macros: ensamblador

• Se incorporan en lenguajes más próximos al ensamblador como C y en lenguajes avanzados como LISP o Scheme como una posibilidad de extender el lenguaje

• En la actualidad no se usan demasiado, aunque su característica de meta-programación ha dejado una huella muy importante en los lenguajes de programación:

• Anotaciones en Java

• Scaffolding en Ruby & Rails

(6)

Macros en C

• Ejemplos de Macros:

• Una llamada a la macro:

• Se sustituirá (expansión de la macro) por:

#define LINE_LEN 80

#define MAX(a,b) ((a) > (b) ? (a) : (b))

#define SWAP(a,b) {int t = (a); (a) = (b); (b) = t;}

x = MAX(p+q, r+s);

(7)

Las macros permiten definir nuevos lenguajes

• Ejemplo en C:

• Lo probamos:

• Esta posibilidad es mucho más potente en las macros de Scheme

• Lenguajes de dominio: las universidades y departamentos de investigación inventan lenguajes adaptados especificamente a dominios específicos como robótica. Es muy fácil diseñar prototipos de estos lenguajes con las macros de Scheme #define then #define begin { #define end ;} if (i > 0) then begin a = 1; b = 2 end

(8)

Problemas de la expansión en C

• El preprocesador de C extiende la macro de forma ciega sin tener ninguna relación con el proceso de compilación posterior

• Esto puede producir errores. Por ejemplo, si llamamos a MAX(x++, y++) la

expansión de la macro produce el siguiente resultado:

• LISP y Scheme utilizan las llamadas macros higiénicas que encapsulan implícitamente sus argumentos y evitan los errores de las macros de C

(9)

Quasiquotation

• La forma especial quasiquote junto con unquote permite evaluar de forma

arbitraria las expresiones que nos interesan en una lista:

• Se utiliza el símbolo backquote y la coma: (define bar 2)

(quasiquote (foo (unquote bar) baz)) --> (foo 2 baz)

`(foo ,bar baz) --> (foo 2 baz)

(define a 2) (define b 'hola) '(1 a b) (quasiquote (1 ,a ,b)) `(1 ,a ,b) `(1 ,a ,b ,c) `(1 ,+ ,-)

(10)

Macros en Scheme

• Se basan en las formas especiales define-syntax y syntax-rules

• Sintaxis de una macro:

• Ejemplo: mi-or (define-syntax <keyword> (syntax-rules (<literales>) ((<patron-1> <plantilla-1>) ... (<patron-n> <plantilla-n>)))) (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 ...)))))

(11)

Reglas de evaluación de una macro

• Para evaluar una llamada a una macro (op exp_1 ... exp_n) debemos

seguir las siguientes reglas:

Buscar la definición de la macro. Buscar la forma especial define-syntax en la que aparece op como clave.

Emparejar. Buscar en la definición de la macro la regla sintáctica con la que es posible emparejar la expresión (op exp_1 ... exp_n) que

estamos evaluando. Si hay más de una regla con la que se puede emparejar la expresión, escogemos la primera de ellas.

Transformar. Aplicar la regla para transformar la expresión.

Evaluar. Evaluar la expresión resultante. En el caso en que la expresión resultante contenga una llamada a una macro se evaluará siguiendo estas mismas reglas.

(12)

Expansión de una macro

• Expansión de la llamada a la macro:

(13)

Sintaxis alternativas válidas

(define-syntax mi-or (syntax-rules () ((_) #t) ((_ e) e) ((_ e1 e2 e3 ...) (if e1 #t (mi-or e2 e3 ...))))) (define-syntax mi-or (syntax-rules () ((op) #t) ((op e) e) ((op e1 e2 e3 ...) (if e1 #t (mi-or e2 e3 ...)))))

(14)

Depuración de macros

(define-syntax mi-or (syntax-rules () ((op) ‘#t) ((op e) ‘e) ((op e1 e2 e3 ...) ‘(if e1 #t (mi-or e2 e3 ...)))))

(15)

Macro

make-procedure

(define-syntax make-procedure

(syntax-rules ()

((make-procedure (x ...) expr ...) (lambda (x ...) expr ...))))

(16)
(17)

Macro

mi-let

(define-syntax mi-let (syntax-rules ()

((mi-let ((x v) ...) e ...)

(18)
(19)

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) ...)

(20)
(21)

Macro

multi-print

(paradigma procedural)

(define-syntax multi-print

(syntax-rules ()

((multi-print arg1 arg2 ...) (begin (print arg1)

(newline)

(multi-print arg2 ...))) ((multi-print) #t)))

(22)
(23)

Macro

when

(paradigma procedural)

(define-syntax when

(syntax-rules ()

((when condition expr1 expr2 ...)

Referencias

Documento similar

Ejemplos: Más silencio / Esforzarme más / Tener tiempo para 5 minutos antes de empezar ver cómo queremos que sea el día o 5 minutos antes de terminar hablar de cómo ha ido

SHIRLEY C., Raines; ISBELL, Rebecca: Cómo contar cuentos a los niños : Relatos y actividades para estimular la creatividad e inculcar valores éticos , Barcelona,

Porcentaje de radiación solar interceptada (RSI; 0,35 - 2,5 µm) y de radiación fotosintéticamente activa interceptada (RFAI) a lo largo del ciclo de cultivo para las

7 Como por ejemplo el materialismo neo-weberiano e histórico, que según critica Shilliam: “han ensayado repetidamente grandes narrativas que no han estado dotadas

Tras haber estudiado en qué medida lo lógico pre- sente en la Fenomenología se expone a su vez en su re- sultado como saber puro y absoluto -elemento en el que cabe la Lógica

Fundación Ramón Menéndez Pidal / Universidad Autónoma de Madrid... Fundación Ramón Menéndez Pidal / Universidad Autónoma

En el Modelo Relacional se puede usar el c´ alculo de predicados de primer orden (CPPO) porque una BDR siempre puede verse como una interpretaci´ on (I) de un lenguaje de primer

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones