500 likes | 676 Vues
Rafael Díaz Rojas Amin Harou Daniel López Sánchez. Índice. Introducción Reseña técnica Ejemplo de aplicación. Introducción a. Es una librería para crear interfaz gráfica de usuario en Haskell Orientada a la industria Está construida sobre wxWidgets que es una librería de C++
E N D
Rafael Díaz Rojas Amin Harou Daniel López Sánchez
Índice Introducción Reseña técnica Ejemplo de aplicación
Es una librería para crear interfaz gráfica de usuario en Haskell • Orientada a la industria • Está construida sobre wxWidgets que es una librería de C++ • Permite crear aplicaciones para Win32, Mac OS X, GTK+, X11, Motif, WinCE… Introducción
Soporta Windows, GTK (Linux) y MacOS • El núcleo de su interfaz se desarrolló a partir de WxEiffel, luego la mayoría de sus Widgets están soportados • En Enero del 2009 apareció la versión 11.0 • WxHaskell no soporta la programación multihebra • WxHaskell consta de una página oficial llena de documentación que fue creada en agosto del 2008 Introducción
Introducción • Permite crear botones, cajas de texto, menús, etc • Permite especificar la disposición física de los componentes utilizando espacios de trabajo al estilo del lenguaje Java (Los espacios de trabajo sirven para organizar los Widgets) • También se usan eventos como el caso de Java (Por ejemplo se lanza un evento cuando presionamos un botón)
Los Widgets son los componentes básicos de la interfaz gráfica de usuario • Un Widget es un componente gráfico, o control, con el cual el usuario interactúa. • Existen dos tipos de Widgets: • Ventanas : Son los Widgets que contienen otros Widgets • Controles: Widgets normales (como una ventana normal con los botones cerrar, minimizar y maximizar) Widgets
Fue diseñado por Thellinni en Italia 2008 en el instituto de Aplicaciones de la Inteligencia Artificial de la universidad St. Andrews (Escocia) • Es un software libre (última versión 2.8.9 salió el 22 de septiembre de 2008) • Soporta varias plataformas • También tiene una ligadura para lenguajes como Python o Perl • Cuenta con soporte, documentación, ayuda en línea, foros … wxWidgets
Se encuentra entre los 25 proyectos más activos de código abierto • La biblioteca es madura, lleva en desarrollo desde 1992 • Permite gráficos 2D, 3D con openGL, Bases de datos, Redes, Impresión, Hebras … • Cuenta con una versión extendida para dispositivos como PDAs y teléfonos celulares • Tiene un API orientada a objetos que es fácil de aprender y de utilizar wxWidgets
WxWidgets es software libre, por lo tanto depende del tiempo y el esfuerzo de los que lo han creado. • Es una biblioteca muy grande. • Consta solo de una capa para el API nativa de cada SO (Es decir: la apariencia dependerá de en que SO se esta ejecutando) • Abusa de la utilización de macros para realizar ciertas operaciones • No cuenta con soporte para características modernas de C++ como manejo de excepciones Desventajas WxWidgets
Ventajas WxHaskell Poder utilizar características importantes de Haskell, como el polimorfismo paramétrico, funciones de orden superior, evaluación perezosa Los programas resultantes tienden a ser más cortos y más elegantes que sus homólogos en C++ por ejemplo Posibilidad de interactuar con código Haskell
Ejemplo de aplicación: Dazzle Es un programa que simula las creencias de las redes bayesianas Fue desarrollado por el grupo Decision Support Systems de la universidad de Utrecht (Holanda) Herramienta para la construcción, edición y análisis de redes bayesianas Consta de más de 4000 líneas de código específico WxHaskell
Es una aplicación para múltiples plataformas (Se usa tanto para Windows como para Linux) • Se desarrolló mucho antes del plazo previsto que ocurre rara vez en proyectos software. • En Windows XP, utiliza 12M de memoria para las grandes redes bayesianas de más de 50 nodos Ejemplo de aplicación: Dazzle
Se publicó un artículo en una revista muy popular en Francia llamada L’informaticien sobre WxHaskell en Octubre del 2003 escrito por Frédéric Mazué • WxHaskell se imparte en la Universidad Politécnica De Valencia en la asignatura Programación Declarativa • También se imparte en la Universidad de Girona en la asignatura Paradigmas de programación Más sobre WxHaskell
En la Universidad Mayor de San Simón, Cochabamba, Bolivia se dio una conferencia sobre las interfaces gráficas de usuario en Haskell con especial atención a WxHaskell el 1 de Noviembre de 2007 • El departamento de ciencias de la computación de la universidad de Utrecht, Holanda tiene varias aplicaciones de investigación que usan WxHaskell (El Dazzle es uno de ellos) Más sobre WxHaskell
El departamento de Sistemas Informáticos y computación de la universidad politécnica de Valencia desarrolló una aplicación para la verificación de sitios Web utilizando lenguajes funcionales el 19 de Julio de 2005, y la interfaz gráfica de esa aplicación fue implementada en WxHaskell Más sobre WxHaskell
Atributos y Propiedades El tipo de un atributo representa su contenedor y su valor text :: Attr (Button a) String get ::w->Attr w a->IO a A la combinación de atributo y valor se le llama propiedad ( :=) :: Attr w a->a->Prop w set ::w->[Prop w]->IO ()
Atributos y Propiedades exclamation :: Button a->IO () exclamation b = do s <- get b text set b [text := s++"!"] ( :~) :: Attr w a->(a->a)->Prop w exclamation b = set b [text :~ (++"!")]
Atributos y Propiedades Como la clase Window de wxWidgets posee un atributo de texto, todo tipo de ventanas pueden tenerlo text :: Attr (Window a) String De esta manera no hay que definir atributos de forma separada get ::w->Attr w a->IO a get w (Attr getter setter) = getter w data Prop w = a: (Attr w a) := a | a: (Attr w a) :» (a->a)
Seguridad wxHaskell impone una fuerte disciplina de tipos en wxWidgets El tratamiento de memoria se realiza de forma automática Comprueba punteros no inicializados, lanzando una excepción en Haskell Existe una estructura jerárquica entre los Widgets creados
Layout Se aloja en el frame caption :: String->Layout space :: Int->Int->Layout rule :: Int->Int->Layout boxed :: String->Layout->Layout grid :: Int->Int->[[Layout]]->Layout
Primer Programa main :: IO () main = start hello hello :: IO () hello = do f <- frame [text := "Hello!"] quit <- button f [text := "Quit", on command := close f] set f [layout := widget quit]
Librerías Graphics.UI.WX y Graphics.UI.WXCore WXCore está a bajo nivel Es el núcleo de la interfaz de los wxWidgets Solamente usa abstracción funcional Sin embargo WX introduce nuevas funcionalidades Está implementada encima de WXCore Mecanismos de abstracción como la sobrecarga
Conceptos El frame es la ventana de nivel superior Todas las demás poseen siempre un padre Los panels se incluyen en el frame Los elementos tienen atributos Los nombres de los atributos están sobrecargados La apariencia en la pantalla la establece layout Los controles también tienen atributos
Conceptos Son instrucciones a seguir cuando se activan (on) Hay Widgets invisibles (timer, value …) Se basa en un entorno de desarrollo orientado a objetos Los Widgets son punteros a objetos en C++ Atributo + Valor = Propiedad Gracias a la herencia hay atributos compartidos Colisión con el sistema de tipos de Haskell El contenedor sirve para Widgets anidados
Conceptos Alinear, Expandir y Estirar halignLeft :: Layout->Layout -- default halignRight :: Layout->Layout halignCenter :: Layout->Layout valignTop :: Layout->Layout -- default valignBottom :: Layout->Layout valignCenter :: Layout->Layout
Conceptos rigid :: Layout->Layout -- default shaped :: Layout->Layout expand :: Layout->Layout static :: Layout->Layout -- default hstretch :: Layout->Layout vstretch :: Layout->Layout
Conceptos Para dividir el espacio entre filas y columnas hweight :: Int->Layout->Layout vweight :: Int->Layout->Layout Depende del peso de cada elemento
Una primera aplicación en ASTEROIDS (en 54 líneas de código)
Introducción • wxHaskell no es una interfaz diseñada para crear juegos, aún así, hemos elegido poner como ejemplo el conocido juego ASTEROIDS en una versión bastante minimal. • La intención de programar este juego es la de mostrar aspectos interesantes de wxHaskell, que con otras aplicaciones hubiera sido más "costoso" de ver. • Para quien no conozca el juego Asteroids, éste trata de una nave que debe de esquivar infinitas cantidades de asteroides, y en cuanto choca con un asteroide, éste explosiona llevándonos al final del juego.
En esta minimalística versión no trataremos de crear un clon exacto de Asteroids, simplemente intentaremos haceros conocer las virtudes de wxHaskell. • Para comenzar definiremos las siguientes constantes • height = 300 width = 300 (Definición del espacio del frame) Diameter = 24 (Diámetro del asteroide) chance = 0.1 :: Double (Probabilidad de aparecer un asteroide) Primeros pasos
Definimos la variable asteroids como IO() Creamos una variable para generar números aleatorios Vrock es una lista de las futuras posiciones de los asteroides Vship contiene la posición del eje X de la nave F la ventana T es un temporizador para actualizar eventos Establecemos los atributos de la variable 'f', color de fondo, tamaño, función de dibujado, y asignar funciones a las pulsaciones de teclas asteroids :: IO () asteroids = do g <- getStdGen vrocks <- variable [value := randomRocks g] vship <- variable [value := div width 2] f <- frame [resizeable := False] t <- timer f [interval := 50, on command := advance vrocks f ] set f [text := "Asteroids", bgcolor := white, layout := space width height, on paint := draw vrocks vship, on leftKey := set vship [value :» nx!x¡5], on rightKey := set vship [value :» nx!x+5]] Creación de la base del juego
Creación de la base del juego • En lugar de la asignación usual de haskell := hemos usado :~ Esto no realiza una asignación a la variable, sino que le aplica una función. • En el caso de on LeftKey, podríamos usar: • on leftKey := set vship [value :~ \x->max 0 (x-5)] • Lo que nos permitiría implementar los bordes de la ventana (frame). • Para el caso de on Rightkey, análogamente sería: • on rightKey := set vship [value :~ \x->min width (x+5)]
Tenemos un generador de números aleatorios, que con él generamos asteroides aleatoriamente. Cuando generamos un asteroide, lo metemos en una lista, siendo un asteroide una lista de posiciones dentro de la ventana, que va desde arriba, hasta abajo. randomRocks :: RandomGen g => g → [[Point ]] randomRocks g = flatten [ ] (map fresh (randoms g)) flatten rocks (t : ts) = let now = map head rocks later = filter (not onull) (map tail rocks) in now : flatten (t++later) ts fresh r | r>chance = [ ] | otherwise = [track (floor (fromIntegral width*r = chance))] track x = [point x (y - diameter) |y ← [0,6...height +2 *diameter]] Función de generado y avancede los Asteroides
La función advance coge el estado actual de la situación de los asteroides y la representa en pantalla. La función draw especifica lo que hacer en la ventana. Ésta llama a drawShip y drawRock. Es llamada cada 50ms. dc indica el contexto donde dibujar, puede ser un mapa de bits o una impresora, pero en este caso, es la ventana. Collide es la función que comprueba que un asteroide choca con la nave advance vrocks f = do set vrocks [value :~tail] repaint f draw vrocks vship dc view = do rocks ← get vrocks value x ←get vship value let ship = point x (height - 2*diameter) positions = head rocks collisions = map (collide ship) positions drawShip dc ship mapM (drawRock dc) (zip positions collisions) when (or collisions) (play explode) Función de generado y avancede los Asteroides
La nave puede ser representada como una primitiva, al igual que los asteroides: drawShip dc pos = circle dc pos (div diameter 2) [brush := brushSolid red] drawRock dc (pos; collides) = |collides == true = circle dc pos (div diameter 2) [brush := brushSolid black] |collides == false = circle dc pos (div diameter 2) [brush := brushSolid yellow] Función de dibujado de primitivas
La nave puede ser representada con un mapa de bits, al igual que los asteroides: • drawShip dc pos = • drawBitmap dc ship pos True [ ] • drawRock dc (pos; collides) = • let picture = if collides then burning else rock • in drawBitmap dc picture pos True [ ] • collide pos0 pos1 = • let distance = vecLength (vecBetween pos0 pos1) • in distance ≤fromIntegral diameter • rock = bitmap "rock.ico" • burning = bitmap "burning.ico" • ship = bitmap "ship.ico" • explode = sound "explode.wav" Función de dibujado de mapa de bits
Con el símbolo '&' indicamos que la letra J del teclado, tendrá asociada la función de expandir el menú Juego • El campo help, indica qué texto poner en la barra de ayuda de la ventana • game ← menuPane [text := "&Juego"] • new ← menuItem game [text := "&Nuevo\tCtrl+N" • , help := "Empezar nuevo juego"] • pause ← menuItem game [text := "&Pausa\tCtrl+P" • , help := "Pausar el juego" • ,checkable := True] • menuLine game • quit ←menuQuit game [help := "Salir del juego"] • set new [on command := asteroids] • set pause [on command := set t [enabled :~not]] • set quit [on command := close f ] • La opción 'checkable' añade una marca de selección. • Con el comando 'on command', añadimos una funcionalidad a cada botón. • 'new' crea una nueva ventana de juego • Para pausar el juego, tan solo hay que desactivar el temporizador • Por último close f, cierra la ventana Generación de la barra de menú
http://haskell.org/haskellwiki/WxHaskell • http://www.wxwidgets.org/ • http://www.linformaticien.com/ • El proyecto Verificación de sitios Web utilizando Lenguajes funcionales [2005] • Haskell Ready to Dazzle the Real World [2005] • Slicing wxHaskell modules to derive the User Interface Abstract Model [2007] • http://zenon.dsic.upv.es/muterm/muterm.php (Del profesor Raúl Gutiérrez herramienta de terminación MU-TERM) Bibliografía
Mateu Villavet profesor de la escuela Politécnica Superior de la Universidad de Gerona y Salvador Lucas profesor de la Universidad Politécnica de Valencia nos contestó a algunas dudas. • El profesor de la Universidad Politécnica de Valencia que participa en el desarrollo de la herramienta de terminación MU-TERM cuya versión 'de sobremesa' utiliza wxHaskell acerca del procedimiento necesario para instalar WxHaskell Mejoras
¿Como habéis conseguido instalar WxHaskell? • Siguiendo las instrucciones de la Web.Lo único que tienes que vigilar son las versiones de wxhaskell y del GHC queutilices para la compatibilidad Respuesta a preguntas (Mateu Villavet)
¿Cuantas clases prácticas hacéis de WxHaskell?¿Es fácil de manejar, y de entender?¿se hicieron algunos proyectos en la Universidad de Gerona ? ¿y trabajosde investigación? • La práctica de haskell ha sido realizar un juego con wxhaskell. algunosalumnos han hecho el Pacman. La verdad es que no hay mucha documentación pero el artículo que hay en la sesión 5 de laboratorio • es de gran ayuda:http://ima.udg.edu/Docencia/3105200736/index.htmlSobre un proyecto final de carrera hecho con GHC y wxHaskell paraaprender lambda-cálculo puedes visitar:http://ima.udg.edu/~villaret/tilc/TILC-Presentation.htmlSi quieres comentárselo a tu profesor por si desea utilizarlo en casoque estudiéis lambda cálculo. Respuesta a preguntas (Mateu Villavet)
¿Cuantas clases se dedican a WxHaskell? • No dedicamos ninguna clase a wxHaskell. En realidad, los alumnos utilizan un móduloHaskell que yo les proporciono para integrar la práctica que realizan y poder utilizarla con una interfaz gráfica realizada en wxHaskell. No necesitan conocer nada sobre la librería... Respuesta a preguntas (Salvador Lucas)
¿Es fácil el uso de WxHaskell? • Es relativamente fácil, una vez que te familiarizas con la manera de especificar la interfaz gráfica y tratar la interacción mediante eventos, etc. Respuesta a preguntas (Salvador Lucas)
¿Cómo se instala WxHaskell? • te recomiendo que te instales cabal, ya que es la mejor forma para trabajar y descargarte paquetes de haskell: http://www.haskell.org/cabal/ y después instalar el paquete con: cabal install wx-core wx Respuesta a preguntas (Raúl Gutiérrez)
También nos pusimos en contacto con el profesor Doaitse Swierstra de la Universidad de Utrecht Mejoras
¿Podría funcionar el UHC para instalar WxHaskell? • La instalación de WxHaskell en sí no es realmente un problema hoy en día, solo hace falta lograr la correcta combinación de sistema operativo, WxWidgets y WxHaskell GHC. • En la actualidad, todavía le faltan muchas cosas a WxHaskell para ejecutar programas con UHC, esperemos que este problema se subsane en el futuro • Para instalar WxHaskell en Ubuntu podéis seguir estas instrucciones que fueron producidas por uno de nuestros estudiantes: http://www.students.cs.uu.nl/~jfklein/fp/Install_wxhaskell_on_ubuntu.txt Respuesta a preguntas (Doaitse Swierstra)