100 likes | 344 Views
Samba: Un lenguaje funcional perezoso. Presentación del lenguaje: qué es un programa Samba definiciones locales abstracciones lambda Tipos inductivos: representación de constructores, expresiones case Sintaxis concreta del lenguaje
E N D
Samba: Un lenguaje funcional perezoso • Presentación del lenguaje: • qué es un programa Samba • definiciones locales • abstracciones lambda • Tipos inductivos: representación de constructores, expresiones case • Sintaxis concreta del lenguaje • Sintaxis abstracta: los tipos Expr, ScDefn y Program
Programas Samba Ejemplo: main = double 21 double x = x + x Un programa Samba es un conjunto de definiciones de supercombinadores, uno de ellos debe ser main. Para ejecutar el programa main es evaluado. Supercombinadores pueden definir funciones, lo que es el caso de double. Notar que no todos los supercombinadores tiene argumentos: CAFs (constant applicative forms).
Definiciones locales Usando el constructor let del lenguaje, se pueden introducir definiciones locales en supercombinadores: main = quadruple 20 quadruple x = let twice_x = x + x in twice_x + twice_x Una expresión let no es recursiva. Para expresiones recursivas Samba usa el constructor letrec. Por ejemplo: infinite n = letrec ns = cons n ns in ns El constructor let es más simple de implementar que el constructor letrec.
Abstracciones lambda Funciones son expresadas en el lenguaje por medio de definiciones top-level de supercombinadores. Sin embargo, a veces es conveniente expresar funciones usando explícitamente abstracciones lambda. Samba provee un constructor para hacer esto: doubleList xs = map (\x -> 2 * x) xs Es posible transformar un programa en el que abtracciones aparecen explícitamente en uno equivalente que sólo use supercombinadores. Este proceso se llama lambda lifting, y será discutido posteriormente en el curso.
Tipos de datos inductivos Una característica de los l.f.m. es la posibilidad de definir tipos inductivos (estructurados, algebraicos, concretos,etc.). Ej. data Colour = Red | Green | Blue data List a = Nil | Cons a (List a) Cada def. introduce un nuevo tipo junto con uno o más constructores. El tipo List es un ejemplo de tipo parametrizado. Valores de tipos inductivos son construidos usando los constructores: Green, Cons 1 Nil, etc.
Pattern Matching Valores estructurados pueden ser discriminados usando pattern matching: isRed Red = True isRed Blue = False isRed Green = False null Nil = True null (Cons _ _) = False
Tipos inductivos en Samba • Cómo representaremos y manipularemos tipos inductivos en Samba? • El objetivo es evitar tener declaraciones de tipos en el lenguaje. Nuestro enfoque será el siguiente: • Usar una representación simple y uniforme de constructores • Compilar declaraciones de supercombinadores que hacen uso de patter matching en expresiones case simples
Representación de constructores En vez de permitir constructores definidos por el usuario, Samba provee una única familia de constructores: Pack{tag , aridad} tag es un entero que permite identificar al constructor, y aridad indica cuantos son los argumentos del mismo. Por ejemplo: Red = Pack{1,0} Green = Pack{2,0} Blue = Pack{3,0} Nil = Pack{5,0} Cons = Pack{6,2} En un programa que ha sido type-chequeado objetos de diferentes tipos no necesitan ser distinguidos en tiempo de ejecución, entonces tags sólo necesitan ser únicos dentro de un tipo inductivo
Expresiones case En general, el pattern matching permitido por l.f.m. puede llegar a ser bastante complejo, con patterns anidados, overlapeados, con guardas, etc. En Samba eliminamos estas complicaciones, y solo proveeremos expresiones case simples: isRed c = case c of null l = case l of <1> -> True; <1> -> True <2> -> False; <2> x xs -> False <3> -> False Cada alternativa del case consiste de un tag seguido de variables (tantas como la aridad del constructor). No se permiten patterns anidados.
Un front-end para Samba Fuente Samba Parser Type Checker Compilación de Pattern matching Lambda Lifting Intérprete G Programa Core Compilador G