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.
Inicia el CMD y ejecuta el comando
frege-repl
. Obtendrás un mensaje de bienvenida al interprete de Frege y el promptfrege>
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 enarchivo.fr
.:r
: recarga o revalúa el último archivo dado a:load
o:l
.
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.Inicia a Eclipse y en él accede a File > New > Java Project, lo que mostrará la ventana New Java Project.
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 ingresaC:\plf\frege\proyectos\practica01
como valor de Location.En este momento practica01 es un proyecto de Java para Eclipse.
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.
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.
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.
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.
Inicia el REPL de Frege seleccionando a
ModuloA.fr
en la vista Package Explorer de Eclipse y apretando el juego de teclasCtrl + 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: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:Estando en la vista Terminal, ejecuta a
frege-repl
y en él carga aModuloA.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: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])
Altera la definición de la función
a
enModuloA.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.
En Eclipse accede a File > New > Java Project, lo que mostrará la ventana New Java Project.
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 ingresaC:\plf\frege\proyectos\practica02
como valor de Location.En este momento practica02 es un proyecto de Java para Eclipse.
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.
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.
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.
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.
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:
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
.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: