Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a...

37
Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas existentes. Se les concoce como abstracciones sintácticas ya que abstraen patrones sintácticos comunes. Son también conocidas de manera informal como azúcar sintáctica dado que hacen al lenguaje mas placentero de usar aunque en substancia no agregan nada mas. Aunque internamente las formas son tratadas de la misma manera es útil hacer la distinción entre formas de base y las otras formas o extensiones sintácticas. Scheme lo que hace tipicamente es

Transcript of Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a...

Page 1: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas

Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas existentes. Se les concoce como abstracciones sintácticas ya que abstraen patrones sintácticos comunes.Son también conocidas de manera informal como azúcar sintáctica dado que hacen al lenguaje mas placentero de usar aunque en substancia no agregan nada mas.Aunque internamente las formas son tratadas de la misma manera es útil hacer la distinción entre formas de base y las otras formas o extensiones sintácticas. Scheme lo que hace tipicamente es expandir las extensiones sintácticas en formas básicas antes de compilar o interpretar.

Page 2: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas• El conjunto exacto de formas básicas está sujeto a

debate, aunque es posible derivar todas las otras formas a partir de un conjunto de formas declaradas como básicas.

• El conjunto que describiremos es uno de los mas simples para el cual la anterior restricción se cumple.

• Las formas sintácticas básicas incluyen formas define, constantes, variables, expresiones quote, expresiones lambda, expresiones if y expresiones set!

Page 3: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Formas básicas

<programa> <form>*<form> <definition> | <expression><definition> <variable definition> | (begin <definition>*) <variable definition> (define <variable><expression>)<expression> <constant> | <variable> | (quote <datum>) | (lambda <formals><expression><expresion>*) | (if <expression><expresion><expresion>) | (set! <variable><expression>) | <application><constant> <boolean> | <number> | <character> | <string><formals> <variable> | (<variable>*) | (<variable><variable>*.<variable>)<application> (<expression><expression>*)

Page 4: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Formas básicas

Como se puede observar en la siguiente regla

<definition> <variable definition> | (begin <definition>*)

estamos considerando a la forma (begin d1 d2 d3 ...) es decir que mientras sean definiciones se puede hacer esto sin embargola forma (begin e1 e2 …) no es una forma básica ya que puede definirse como ((lambda ( ) e1 e2 …))Todas las extensiones sintácticas en un programa en Scheme deben derivarse en formas básicas, sin embargo una extensión sintáctica puede definirse en terminos de otras extensiones sintácticas en tanto estas otras sean más cercanas a las formasde base.

Page 5: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas en Scheme

Las extensiones sintácticas se definen en Scheme con la directiva define-syntax que es similar al define , excepto queasocia un procedimiento de transformación sintáctica otransformador con una palabra clave, en vez de asociar unvalor con una variable. Por ejemplo el let sería definido comosigue:

(define-syntax let (syntax-rules( ) ((_((x v) … ) e1 e2 …) ((lambda (x …) e1 e2 …) v …))))

Page 6: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas en Scheme

• define-syntax es la palabra clave a definir como extensión sintáctica

• La lista a continuación de syntax-rules es una lista de palabras clave auxiliares que casi siempre es ( ). Un ejemplo de estas es else en cond.

• Despues sigue una secuencia de una o varias reglas o parejas patron/templete en el caso del let hay solo una cuya parte patrón deberá de aparearse y la parte templete especifica la transformación de la entrada

Page 7: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas en Scheme

• La parte patron deberá siempre estar estructurada como una expresión cuyo primer elemento es un (_ ) (esto es solo una buena convención).

• Si hay mas de una regla presente, se elgirá una por apareo de patron, en el orden de aparición, durante la fase de expansión.

• Se señala un error si ningún patrón es apareado con la entrada.

Page 8: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas en Scheme

• Los identificadores que aparecen dentro de un patrón son llamadas variables de patrón a menos que hayan sido definidas como palabras clave auxiliares.

• Las variables de patrón se aparean con cualquier subestructura y permanece asignada a ella dentro del templete.

• La notación pat … en el patrón permiten que cero o mas expresiones en la entrada se apareen con la elipsis

Page 9: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas en Scheme

• De manera similar, la notación exp … en la parte templete produce cero o mas expresiones de prototipo exp a la salida.

• El número de pats en la entrada determina el número de exps a la salida.

• Aunque la regla del let es clara hay que mencionar que requiere que el cuerpo contenga al menos una expresión. Por otro lado no requiere tener al menos una pareja variable/valor.

Page 10: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo de and como extensión sintácticas en Scheme

(define-syntax and (syntax-rules ( ) (( _ )) #t) (( _ e) e) ((_ e1 e2 e3 …) (if e1 (and e2 e3 …) #f))))

Esta definición es recursiva e involucra mas de una regla.Recordemos que (and) se evalua #t lo cual es contemplado enla primera regla.La segunda y tercera reglas son el caso base yla recursión que traducen el and en un anidamiento de if’s

Page 11: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo de and como extensión sintácticas en Scheme

Por ejemplo (and a b c) se expandiría primero en un

(if a (and b c) #f)

después en un

(if a (if b (and c) #f) #f)

y finalmente en

(if a (if b c #f) #f)

Page 12: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo

• Defina sintácticamente la operación lógica or

Page 13: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas (continuación)

• Utilizadas para simplificar y regularizar patrones que surgen en programación

• Utilizadas para introducir formas sintácticas con nuevas reglas de evaluación

• Utilizadas para realizar transformaciones o traducciones que ayuden a hacer que los programas se ejecuten de forma mas eficiente

Page 14: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas (continuación)

• Casi todo intérprete de Scheme provee de extensiones sintácticas o sistema de macros

• El mas actualizado utiliza un mecanismos de apareo de patrones, y algunas versiones utilizan un mecanismo mas general y estándar.

• Una extensión sintáctica típicamente toma la forma (keyword subform …) donde keyword es el identificador que nombra la extensión sintáctica.

• La sintáxis de subform varia de una extensión a la otra

Page 15: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas (continuación)

• Las extensiones sintácticas nuevas son definidas asociando palabras clave con procedimientos de transformación o transformers.

• Definidas globalmente usando define-syntax o dentro de un ambito o alcance dentro de alguna expresión usando let-syntax,letrec-syntax, y define-syntax internos o fluid-let-syntax

• Los transformadores pueden crearse con syntax-rules, syntax-case o algun mecanismo dependiente de la implementación

Page 16: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas (continuación)

• Las extensiones sintácticas nuevas son expandidas en formas básicas al incio de la evaluación (antes de compilar o interpretar) por un expansor sintáctico.

• El expansor es invocado una vez por cada forma de nivel superior en el programa. Si éste encuentra una definición sintáctica, invoca al transformador asociado para expandir la definición sintáctica y si encuentra formas básicas, procesa las subformas recursivamente.

Page 17: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Asiganción de palabras clave

• Relación entre palabra clave y transformadores a través de define-syntax, let-syntax,letrec-syntax o define-syntax internos.

• Asignaciones existentes pueden reasignarse por medio de la instrucción fluid-let-syntax.

Page 18: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo de let* como extensión sintáctica

(define-syntax let* (syntax-rules ( ) ((_ ( ) e1 e2 …) (let ( ) e1 e2 …)) ((_ ((i1 v1) (i2 v2)…) e1 e2 …) (let ((i1 v1)) (let* ((i2 v2) …) e1 e2 …)))))

Page 19: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo de let* como extensión sintáctica

Las formas define-syntax que aparecen en el masalto nivel se comportan de forma similar a las definiciones de variables de alto nivel. Es decirque una asignación hecha por un define-syntaxa nivel global es visble globalmente, así comoaquellas hechas por define-syntax internos soloseran visibles en el cuerpo de éste.

Page 20: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo

(let ( ) (define even? (lambda(x) (or (= x 0) (odd? (- x 1))))) (define-syntax odd? (syntax-rules ( ) ((_ x) (not (even? x))))) (even? 10))es valido y regresa #t

Page 21: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas (continuación)

• Para el expansor debe de ser posible determinar el conjunto de definiciones sintácticas así como el de variables sin hacer referencia a algunos de los identificadores definidos localmente.

• No es legal por lo tanto que una definición interna afecte el status de una potencial definición interna en la misma secuencia de formas.

Page 22: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo

(let ( ) (define-syntax bind-to-zero (syntax-rules ( ) ((_ id) (not (define id 0)))) (bind-to-zero x) x)no es valido pues requeriría que el expander expandiera (bind-to-zero x) para reconocerlocomo una definición sintáctica

Page 23: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo

(let ( ) (define-syntax bind-to-zero (syntax-rules ( ) ((_ id) (not (define id 0)))) (let ( ) (bind-to-zero x) x))Esto regresa 0. Una definición sintáctica de altonivel debe establecerse antes de usarse a fin de que dicho uso lo reconozca.

Page 24: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas let-syntax y letrec-syntax

• Sintaxis: (let-syntax ((keyword exp) …) form1 form2 …)

• Sintaxis:(letrec-syntax ((keyword exp) …) form1 form2 …)

• Cada exp debe ser evaluado por el transformer • Para ambas extensiones, cada keyword es afectado

dentro de las formas form1 form2 ….Para letrec-syntax el alcance de la afectación también incluye cada exp.

Page 25: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas let-syntax y letrec-syntax

• Ambas pueden expandirse en una o mas expresiones en donde sea permitido tener expresiones en cuyo caso la expresión resultante será tratada como incluída en una expresión begin

• Ambas pueden expandirse en una secuencia de definiciones en donde esto esté permitido, en cuyo caso las definiciones son tratadas como si aparecieran en lugar de let-syntax o letrec-syntax

Page 26: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Diferencias entre let-syntax y letrec-syntax

(let ((f (lambda (x) (+ x 1)))) (let-syntax ((f (syntax-rules ( ) ((_ x) x))) (g (syntax-rules ( ) ((_ x) (f x))))) (list (f 1) (g 1)))) ==> (1 2)

(let ((f (lambda (x) (+ x 1)))) (letrec-syntax ((f (syntax-rules ( ) ((_ x) x))) (g (syntax-rules ( ) ((_ x) (f x))))) (list (f 1) (g 1)))) ==> (1 1)

Page 27: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Extensiones sintácticas fluid-let-syntax

• Sintaxis: (fluid-let-syntax ((keyword exp) …) form1 form2 …)

• Es similar al let-syntax excepto que en vez de introducir nuevas afectaciones de keyword, temporalmente altera las afectaciones existentes de las palabras clave durante la expansión de sus cuerpos. Es decir que durante la expansión de form1 form2…, las afectaciones visibles léxicamente para cada keyword son remplazadas temporalmente por nuevas asociaciones entre estas y el transformer.

Page 28: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Diferencias entre let-syntax y fluid-let-syntax

(let ((f (lambda (x) (+ x 1)))) (let-syntax ((g (syntax-rules ( ) ((_ x) (f x)))) (f (syntax-rules ( ) ((_ x) x)))) (g 1)))) ==> 2

(let ((f (lambda (x) (+ x 1)))) (let-syntax ((g (syntax-rules ( ) ((_ x) (f x)))) (fluid-let-syntax (f (syntax-rules ( ) ((_ x) x)))) (g 1)))) ==> 1

Page 29: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• La forma syntax-rules permite que se definan transformadores simples de forma conveniente

• Estos transformers pueden relacionarse con palabras clave a través de los mecanismos anteriormente mencionados.

• Dichos mecanismos son menos expresivos que los que veremos mas adelante pero son suficientes para muchas definiciones sintácticas

Page 30: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• Sintaxis: (syntax-rules (literal1 …) clause …)• Regresa: un transformador • Cada literal debe deser un identificador• Cada clause toma la forma (pattern template)• Cada pattern especifica una sintaxis posible de la

entrada y cada template como debe de ser la salida en cada caso.

• Los patrones consisten de una estructura de lista, vector, identificadores y constantes.

Page 31: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• Cada identificador dentro del patrón es ya sea una literal, variable de patrón, o una elipsis.

• Cualquier identificador diferente de la elipsis es una literal si aparece en la lista de literales (literal …). En cualquier otro caso es una variable de patrón.

• Las literales sirven de palabras clave auxiliares como else en las expresiones case y en cond.

Page 32: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• Las estructuras de lista y de vector dentro de un patrón permiten especificar la estructura requerida de la entrada.

• Las variables de patrón permiten especificar una subestructura arbitraria

• Las literales y constantes especifican partes atómicas que deben de aparearse exactamente.

• Las elipsis especifican ocurrencias repetidas de supatrones.

Page 33: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• Una forma de entrada F aparea con un patrón P ssi• P es una variable de patrón• P es una literal y F un identificador con la misma

afectación• P es de la forma y F es una lista de n elementos

que coinciden con a • P es de la forma y F es una lista impropia de

no mas elementos de los cuales los n primeros coinciden de a y cuyo n-esimo cdr coincide con

)...( 1 nPP

1P nP)....( 21 Xn PPPP

1P nP

XP

Page 34: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• P es de la forma y F es una lista propia cuyos primeros n elementos coinciden de a y el resto coincide con .

• P es de la forma # y F es un vector de n elementos que coincidel de a

• P es de la forma # y F es un vector con n o mas elementos cuyos n primeros coiniden de a y el resto coincide con .

• P es un datum y F y son iguales por equal?

)...( 1 nPP

1P

nP

...)...( 21 XnPPPP

1P

nP XP

...)...( 21 XnPPPP

1P nP XP

Page 35: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Transformadores de extensiones sintácticas

• En la definición del or se introduce una variable temporal t para evitar la doble evaluación de la expresiónen el transformer.

• El algoritmo de expansión mantiene el alcance léxico automáticamente por renombramiento de identificadores locales, por lo tanto la variable local t solo es visible dentro del código introducido por el transformer y no dentro de las subformas introducidas por la entrada.

Page 36: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo(let ((if #f)) (let ((t ‘okay)) (or if t))) okay

Esta expresión es transformada durante la expansiónen la siguiente expresión equivalente

((lambda (if1) ((lambda (t1) ((lambda (t2) (if t2 t2 t1)) if1)) ‘okay))#f) okay

Page 37: Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.

Ejemplo

La definición de una versión simplificada de cond demuestracomo las palabras clave auxiliares como else son reconocidasen el transformer de la entrada, via la inclusión de literales

(define-syntax cond (syntax-rules (else) ((_ (else e1 e2 …)) (begin e1 e2 …)) ((_ (e0 e1 e2 …)) (if e0 (begin e1 e2 …))) ((_ (e0 e1 e2 …) c1 c2 …) (if e0 (begin e1 e2 …) (cond c1 c2 …)))))