Prácticas

Práctica 01

El objetivo de esta práctica es plantear el uso del REPL de Frege para la captura y ejecución de scripts así como la carga y ejecución de archivos con código fuente escrito en Frege.

  1. Inicia el CMD y ejecuta el comando frege-repl. Obtendrás un mensaje de bienvenida al interprete de Frege y el prompt frege> con un cursor parpadeando el cual indica que se está esperando la captura de alguna expresión en Frege:

     Welcome to Frege 3.24.30 (Oracle Corporation Java HotSpot(TM) Client VM, 1.8.0_74)
     frege> █
    

    Estando en el REPL de Frege tienes los siguientes comandos propios del REPL, existen otros:

    • :help: muestra la lista de comandos propios del REPL.
    • :version: muestra la versión de Frege en uso.
    • :quit o :q: permite salir del REPL.
    • :type <expresión> o :t <expresión>: muestra el tipo de <expresión>.
    • :load <archivo.fr> o :l <archivo.fr>: carga o evalúa el código fuente de Frege encontrado en archivo.fr.
    • :r: recarga o revalúa el último archivo dado a :load o :l.
  2. Evalua las siguiente expresiones en el REPL:

     frege> "¡Hola mundo!"
     ¡Hola mundo!
     frege> :type "¡Hola mundo!"
     String
     frege> "¡Hola" ++ " " ++ "mundo" ++ "!"
     ¡Hola mundo!
     frege> toList "¡Hola mundo!" !! 1
     'H'
     frege> unpacked "¡Hola mundo!"
     ['¡','H','o','l','a',' ','m','u','n','d','o','!']
     frege> :type (unpacked "¡Hola mundo!")
     [Char]
     frege> 'a' : ['b', 'c', 'd', 'e']
     ['a','b','c','d','e']
     frege> :type 'a' : ['b', 'c', 'd', 'e']
     [Char]
     frege> "¡Hola" ++ packed [' ','m','u','n','d','o','!']
     ¡Hola mundo!
     frege> length "¡Hola mundo!"
     12
     frege> length ['¡','H','o','l','a',' ','m','u','n','d','o','!']
     12
     frege> true && not (false || true)
     false
     frege> :type true && not (false || true)
     Bool
     frege> "hola mundo!" == "hola mundo!"
     true
     frege> 10 /= 10
     false
     frege> 10 != 10
     false
     frege> (head [10, 20, 30], not false)
     (10, true)
     frege> :type (head [10, 20, 30], not false)
     (Int,Bool)
     frege> let x = 10 in x * x
     100
     frege> :type let x = 10 in x * x
     Int
     frege> x * x where x = 10
     100
     frege> :type x * x where x = 10
     Int
     frege> let xs = [10, 20, 30, 40, 50] in (head xs, head (tail xs))
     (10, 20)
     frege> let xs = [10, 20, 30, 40, 50] in (head xs, head (tail xs))
     (10, 20)
     frege> (head xs, head (tail xs)) where xs = [10, 20, 30, 40, 50]
     (10, 20)
     frege> :type let xs = [10, 20, 30, 40, 50] in (head xs, head (tail xs))
     (Int,Int)
     frege> :type (head xs, head (tail xs)) where xs = [10, 20, 30, 40, 50]
     (Int,Int)
     frege> \x -> [(x * 2), (x * 3)]
     Int -> [Int]
     frege> (\x -> [(x * 2), (x * 3)]) 4
     [8,12]
     frege> :type \x -> [(x * 2), (x * 3)]
     Int -> [Int]
     frege> :type (\x -> [(x * 2), (x * 3)]) 4
     [Int]
     frege> \x -> \y -> \z -> z x y
     b -> c -> (b->c->a) -> a
     frege> :type \x -> \y -> \z -> z x y
     b -> c -> (b->c->a) -> a
     frege> (\x -> \y -> \z -> z x y) 3
     a -> (Int->a->b) -> b
     frege> ((\x -> \y -> \z -> z x y) 3) (-5)
     (Int->Int->a) -> a
     frege> (((\x -> \y -> \z -> z x y) 3) (-5)) (\x \y -> x + y)
     -2
     frege> (((\x -> \y -> \z -> z x y) 3) (-5)) (\x \y -> x : y : [])
     [3,-5]
     frege> duplicarSoloDecenas n = if n >= 10 && n <= 99 then 2 * n else n
     function duplicarSoloDecenas :: Int -> Int
     frege> duplicarSoloDecenas 5
     5
     frege> duplicarSoloDecenas 55
     110
    

    Al terminar, ejecuta el comando :q. Con esto tanto las definiciones como las expresiones evaluadas se pierden.

  3. Inicia a Eclipse y en él accede a File > New > Java Project, lo que mostrará la ventana New Java Project.

  4. En la ventana New Java Project ingresa practica01 en el campo Project name y da click al botón Finish.

    OBSERVACIONES:

    • Bajo la opción Use default location el valor dado a Location tendría que ser C:\plf\frege\proyectos\practica01, de no ser así desactiva la opción Use default location e ingresa C:\plf\frege\proyectos\practica01 como valor de Location.

    • En este momento practica01 es un proyecto de Java para Eclipse.

  5. Dentro de la vista Package Explorer de Eclipse da click derecho sobre el nodo practica01 y del menú desplegado selecciona a Enable Frege Builder. A partir de este momento el compilador de Frege está disponible en el proyecto.

  6. Dentro de la vista Package Explorer de Eclipse da click derecho sobre el nodo practica01 > src y selecciona New > Folder, lo que abrirá la ventana New Folder, en esta última ingresa practica01 en el campo Folder name y da click al botón Finish.

  7. Dentro de la vista Package Explorer de Eclipse da click derecho sobre el nodo practica01 > src > practica01 y selecciona New > File, lo que abrirá la ventana New File, en esta última ingresa ModuloA.fr en el campo File name y da click al botón Finish.

    Al terminar se abrirá inmediatamente el editor de texto con el archivo ModuloA.fr.

  8. Ingresa lo siguiente en el archivo ModuloA.fr:

     module practica01.ModuloA where
     import frege.Prelude
     a x =
       let
         b = \x -> 2 * x
         c = \x -> 3 * x
       in
         [b x, c x]
    
     b x y =
       [a x, a y]
       where
         a = \x -> 4 * x
    
     c a =
       (a x, a y)
       where
         x = 5
         y = -5
    

    Guarda los cambios al terminar.

  9. Inicia el REPL de Frege seleccionando a ModuloA.fr en la vista Package Explorer de Eclipse y apretando el juego de teclas Ctrl + Alt + Shift + T. De la ventana Launch Terminal selecciona Windows PowerShell de la opción Choose terminal, verifica que UTF-8 se encuentre seleccionado en la opción Encoding y da clic al botón de OK:

    images/01.png

    Una vez abierta la vista Terminal podrás ejecutar los comandos (del sistema operativo) pwd (para obtener nuestra hubicación o path actual), ls (para obtener una lista de los archivos existentes en cierta hubicación) entre otros tantos:

    images/02.png

    Estando en la vista Terminal, ejecuta a frege-repl y en él carga a ModuloA.fr con el comando :load ModuloA.fr o bien com :l ModuloA.fr. Dentro del REPL mediante el comando :browse practica01.ModuloA podrás obtener las signaturas de las funciones en un módulo:

    images/03.png

    Ahora puedes aplicar las funciones establecidas en ModuloA.fr:

     frege> a 10
     [20,30]
     frege> (5 + 5) : f 10
     [10,20,30]
     frege> (b 20) 30
     [80,120]
     frege> b (-1) (-2)
     [-4,-8]
     frege> 0 : b (-1) (-2)
     [0,-4,-8]
     frege> c (\x -> x >= 0)
     (true, false)
     frege> c (\x -> x <= 0)
     (false, true)
     frege> c (\x -> [x])
     ([5], [-5])
     frege> c (\x -> [(x * (-1))])
     ([-5], [5])
    
  10. Altera la definición de la función a en ModuloA.fr, sin salir del REPL de Frege, por:

     a x =
       let
         b = \x -> x - 1
         c = \x -> x + 1
       in
         [[b x], [c x]]
    

    Regresa al REPL de Frege y ejecuta el comando :r:

    Como podrás observar el tipo de la función ha cambiado:

     frege> :type a
     Int -> [\[Int\]]
     frege> a 10
     [[9],[11]]
     frege> (5 + 5) : a 10
     E <console>.fr:37: [Int] is not an instance of Num
     frege> [(5 + 5)] : a 10
     [[10],[9],[11]]
    

    De esta forma es posible editar o capturar expresiones de Frege en ModuloA.fr y recargar su contenido en el REPL. Esta sería una forma más comoda de aprender el lenguaje de programación.

OBSERVACIÓN: el uso de :r vuelve a redefinir las variables previamente establecidas en el REPL. Lo anterior es una característica conveniente para interactuar con un lenguaje de programación puro.

Práctica 02

El objetivo de esta práctica es crear un proyecto en Eclipse que permita la captura, detección de errores y compilación de código fuente en Frege. Lo anterior es posible gracias a fregIDE, previamente instalado.

  1. En Eclipse accede a File > New > Java Project, lo que mostrará la ventana New Java Project.

  2. En la ventana New Java Project ingresa practica02 en el campo Project name y da click al botón Finish.

    OBSERVACIONES:

    • Bajo la opción Use default location el valor dado a Location tendría que ser C:\plf\frege\proyectos\practica02, de no ser así desactiva la opción Use default location e ingresa C:\plf\frege\proyectos\practica02 como valor de Location.

    • En este momento practica02 es un proyecto de Java para Eclipse.

  3. Dentro de la vista Package Explorer de Eclipse da click derecho sobre el nodo practica02 y del menú desplegado selecciona a Enable Frege Builder. A partir de este momento el compilador de Frege está disponible en el proyecto.

  4. Dentro de la vista Package Explorer de Eclipse da click derecho sobre el nodo practica02 > src y selecciona New > Folder, lo que abrirá la ventana New Folder, en esta última ingresa practica02 en el campo Folder name y da click al botón Finish.

  5. Dentro de la vista Package Explorer de Eclipse da click derecho sobre el nodo practica02 > src > practica02 y selecciona New > File, lo que abrirá la ventana New File, en esta última ingresa Main.fr en el campo File name y da click al botón Finish.

    Al terminar se abrirá inmediatamente el editor de texto con el archivo Main.fr.

  6. Ingresa lo siguiente en el archivo Main.fr:

     module practica02.Main where
    
     unaBienvenida :: String -> String
     unaBienvenida para = "Hola" ++ " " ++ para
    
     main :: [String] -> IO ()
     main args = do
       putStrLn (unaBienvenida "mundo")
    

    Guarda los cambios al terminar.

  7. Crea una configuración de ejecución en Eclipse para la compilación y ejecución del proyecto.

    Accede a Run > Run Configurations ..., selecciona el nodo Java Application y da click al botón New launch configuration. En el campo Name ingresa practica02.Main, en el campo Project ingresa practica02 y en el campo Main class ingresa practica02.Main:

    images/04.png

    Finalmente da click al botón Run para guardar y ejecutar la configuración de ejecución.

    En este momento observarás en la vista Console de Eclipse la impresión del mensaje Hola mundo.

  8. Por último, sustituye el contenido del archivo Main.fr con lo siguiente:

     module practica02.Main where
    
     unaBienvenida :: String -> String
     unaBienvenida para = "Hola" ++ " " ++ para
    
     unaDespedida :: String -> String
     unaDespedida para = "Adios" ++ " " ++ para
    
     main :: [String] -> IO ()
     main args = do
       putStrLn (unaBienvenida "mundo")
       putStrLn (unaDespedida "mundo")
    

    Guarda los cambios hechos a Main.fr, accede a Run > Run Configurations ..., selecciona el nodo Java Application > practica02.Main y da click al botón Run. Otra opción es apretar la tecla F11:

    images/05.png