1 / 10

Samba: Un lenguaje funcional perezoso

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

rufina
Download Presentation

Samba: Un lenguaje funcional perezoso

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

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

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

  10. Un front-end para Samba Fuente Samba Parser Type Checker Compilación de Pattern matching Lambda Lifting Intérprete G Programa Core Compilador G

More Related