1 1 HSP(Haskell Server Pages) Alejandro del Real Chicharro José Emilio Villena Irigoyen
2 2 Índice Introducción La función page La sintaxis de HSP HJavaScript HSP Foro Web Conclusiones Futuros Trabajos Bibliografía
3 3 Introducción No hace mucho tiempo, la World Wide Web estaba formada casi exclusivamente de páginas estáticas. Hoy, sin embargo, el uso de páginas dinámicas en la Web se ha incrementado hasta tal punto de necesitar mejores herramientas para la creación de éstas. Los programadores comienzan a usar algunos lenguajes script especializados que permiten mezclar XML con código, p.e. PHP, ASP o también puedan usar CGI. La mayoría de los lenguajes compartían los mismos defectos, y algunos hasta varios de estos. Ellos modelaban texto HTML como texto sin formato, y esto violaba uno de los principios de abstracción de Tennent.
4 4 Introducción Se busca un lenguaje funcional que soporte un modelo de programación completo y la facilidad de uso de un lenguaje script especializado, mientras aún mantenga el gran potencial de XML. Erik Meijer y Danny van Velzen Haskell Server Pages En el 2000, Erik Meijer y Danny van Velzen presentaron lo que ellos llamaron como ‘Haskell Server Pages’ (HSP), un lenguaje de programación Web de dominio específico, basado en la funcionalidad de la programación del lenguaje Haskell. Introduciendo un nuevo tipo de datos data XML que garantizaba la correcta formación de páginas dinámicas y una mejor integración de XML con otros códigos. Permitir a los programadores usar fragmentos de sintaxis XML en código Haskell, y viceversa, permitir embeber expresiones Haskell dentro de fragmentos XML.
5 5 Introducción Código ASP: > (, ) Sacamos el bucle para hacer la página más ordenada.
6 6 Introducción Código ASP: El problema es que ASP no permite esto. (, ) Tendríamos que ejecutarlo dentro de un módulo de Visual Basic.
7 7 Introducción Código en Haskell: table :: TABLE table = cells ::[[(Int, Int)]] cells = [ [(x,y) | x [1..16] ] | y [1..16] ] mkRows:: [[(Int, Int)]] [TR] mkRows = map $ \cs mkColums :: [[(Int,Int)]] —>[TD] mkColums = map $ \c Está todo más estructurado. $ Es una función asociativa por la derecha para la eliminación de paréntesis
8 8 Introducción A parte de las extensiones puramente sintácticas, HSP también facilita un modelo de programación con tipos de datos, clases y funciones que ayuden con algunas tareas de la programación Web. Por ejemplo: Mantener el estado de los usuarios en transacciones usando sesiones. Mantener el estado de aplicaciones entre transacciones con diferentes usuarios. Acceder a consultas de datos y variables de entorno
9 9 La función page pagemain Para generar una completa aplicación de páginas HSP, necesitamos definir la función page. De forma análoga a la función main de Haskell. page la función page es llamada cuando una página HSP es requerida. page = ¡Hola Mundo!
10 10 La función page Como un documento válido XML (o bien XHTML) es también una de las fuentes principales de los programas HSP, necesitamos construir páginas que nos permitan utilizar la potencia de XML junto con el lenguaje Haskell. Por ejemplo un trozo de código en XML que muestra un reloj con la hora de cuando un página fue pedida sería: Páginas XML y páginas Híbridas Página XML ¡Hola mundo! getSystemTime Página pedida con
11 11 La función page Y el mismo código ya aplicado a una página HSP sería: Páginas XML y páginas Híbridas page= Página XML ¡Hola mundo! getSystemTime Página pedida con Aunque hay un ligero problema con estas páginas. La función getSystemTime reside en el modulo System.Time, el cuál necesita ser importado para que la función sea usada.
12 12 La función page Con HSP no habría problemas pero con pero en páginas XML no hay ningún lugar donde poder añadir la importación. Para salvar este problema se introducen las páginas híbridas que contienen una combinación de páginas XML con un nivel alto de declaraciones. Páginas XML y páginas Híbridas Página XML ¡Hola mundo! Página demandada
13 13 La función page page Para poder crear páginas híbridas se añade una nueva función más elaborada de page, especificando como una página correcta en HSP, puede parecerse a: Sintaxis formal de una página page : : = module | xml Podemos utilizar un módulo normal de HSP, un árbol completo XML, o bien una combinación de los dos.
14 14 La función page ¿Cuál es el tipo de la función de nuestro ejemplo “hola mundo”? Solución más simple: Dejar el tipo XML Pero no es tan sencillo, porque permitimos cálculos impuros cálculos con efectos laterales para ser embebidos dentro de los fragmentos de XML. Ejemplo de computación embebida: getSystemTime con el tipo IO Time Computación embebida y mónada HSP
15 15 La función page HSP suspende la computación embebida hasta que es evaluada explícitamente Parece que las funciones devuelven valores XML puros, pero pueden contener computaciones no evaluadas No hay forma de distinguir entre valores XML puros y los que contienen computaciones no evaluadas Computación embebida y mónada HSP
16 16 La función page Para solucionar esto se introdujo una mónada HSP Encapsula los efectos laterales Proporciona entorno E/S a las páginas Web Todas las expresiones XML serán resueltas computando una mónada HSP. Ejemplo ¡Hola mundo! Tiene tipo HSP XML a pesar de no tener efectos laterales No es algo perfecto, pero es preferible a no tener efectos laterales nunca Computación embebida y mónada HSP
17 17 Sintaxis HSP Encuentro entre XML y Haskell HolaMundol = ¡Hola Mundo! Hay dos cosas interesantes que comentar No necesitamos usar ningún mecanismo de escape para dejar el contexto del código cuando queremos escribir el fragmente XML, en HSP todos los fragmentos XML están garantizados para estar siempre bien-formados.
18 18 Sintaxis HSP Las expresiones malformadas darían error helloWorld = Hello World! Las etiquetas funcionan ellas solas cómo escapes boldHelloWorld = Hello World! Siempre que queramos que el contenido interno sea evaluado por una expresión, deberemos usar caracteres de escape hello name = Hello !
19 19 Sintaxis HSP Queremos también que nuestros elementos XML sean capaces de tener atributos RedHelloWorld :: HSP XML redHelloWorld = Hello World! Al igual que los hijos, los valores de atributos pueden también ser computados a partir de expresiones embebidas hwColor :: String -> HSP XML hwColor c = Hello World!
20 20 Sintaxis HSP Todas las páginas HSP deben definir y exportar una página de función definiendo el contenido de la página. page = Hello World! ¡¡¡Ya tenemos nuestra primera página HSP!!!
21 21 Sintaxis HSP - Concordancia de patrones Concordancia de Elementos Lo primero de todo lo que podemos comparar directamente en elementos, cómo isImg = True isImg _ = False Nuestra interpretación intuitiva de lo de arriba es que implementa isImg devolverá True si un elemento img se da, y False en otro caso
22 22 Sintaxis HSP - Concordancia de patrones Concordancia de Atributos Para concordancia de patrones en atributos, primero necesitamos considerar cómo queremos usarlos. Lo primero de todo, en XML el orden de atributos es irrelevante, por lo que para la instancia de dos elementos y, ¡Son equivalentes!
23 23 Sintaxis HSP - Concordancia de patrones Concordancia de Hijos La concordancia de patrones en hijos se puede escribir cómo en este ejemplo getPText = t Comparar un simple hijo es bastante simple, pero para ejemplos más complicados existe un problema “comparar un número arbitrario de elementos ” o “empezar por comparar un elemento, seguido por uno o más ocurrencias de un elemento y un elemento en la secuencia”
24 24 Sintaxis HSP - Concordancia de patrones Para esto hemos desarrollado HaRP (Haskell Regular Patterns). El sistema para patrones de expresiones regulares en Haskell Ejemplo para obtener todo el texto de los párrafos de un documento getText :: XML -> [String] getText [ * ] = t Denota que debería haber 0 o más p encerrados en el elemento body
25 25 Sintaxis HSP – Sintaxis formal Sintaxis formal Extendemos la gramática Haskell con nuevas producciones de expresiones XML, las cuales añadimos al lenguaje cómo una expresión atómica posible aexp ::= var | lit | ( exp )... | xml La nueva manera de expresión, xml, puede ser también un elemento cerrado con hijos, o una etiqueta vacía auto-contenida xml ::= child...child |
26 26 Sintaxis HSP – Sintaxis formal Los atributos son pares nombre-valor, seguidos opcionalmente por una expresión extra attrs ::= attrs1 aexp | attrs1 attrs1 ::= name = aexp... name = aexp Un hijo puede ser un elemento jerarquizado, PCDATA o una expresión Haskell embebida child ::= xml | PCDATA |
27 27 Sintaxis HSP – Sintaxis formal Un nombre en XML puede ser calificado opcionalmente por un espacio de nombres a cuyo elemento pertenece. Nuestra producción de nombre queda así name ::= string : string | string donde el espacio de nombres definido anteriormente está especificado
28 28 Sintaxis HSP – Entorno Las páginas HSP tienen acceso a un entorno especial que contiene información si tenemos en cuenta el contexto en el cual son evaluadas. Los componentes principales son: Petición: Peticiones HTTP que iniciaron la llamada a la página Respuesta: Respuesta HTTP que ha sido generada, la cual se enviará con los resultados de la llamada a la página Aplicación: Contiene datos con visibilidad de aplicación, por ejemplo datos que persisten entre transacciones de páginas Sesión: Contiene datos que pertenecen a un cliente específico
29 29 Sintaxis HSP – Entorno Entorno de Petición ASP Request (“hello”) PHP $_REQUEST[“hello”] HSP getParameter “hello”
30 30 Sintaxis HSP – Entorno En el entorno del programación lo más importante es consultar cadenas de caracteres (pares nombre-valor) de la forma param1 = valor1&…¶mn = valorn Los parámetros en la petición pueden ser accedidos usando las funciones getParameter :: String -> HSP (Maybe String) readParameter :: Read a => String -> HSP (Maybe a)
31 31 Sintaxis HSP – Entorno Entorno de Respuesta Los componentes de respuesta almacenan cabeceras que serán enviadas de vuelta al cliente receptor con los contenidos de los documentos. Estos son conjuntos que usan funciones especializadas cómo setNoCache :: HSP () En HSP ninguna salida debería ser añadida a la respuesta manualmente, todos los contenidos deberían estar generados por la función de página, garantizando la correcta formación del XML generado Por ejemplo, no sería correcto Hola miMensaje :: String-> HSP XML miMensaje nombre = Hola
32 32 Sintaxis HSP – Entorno Entorno de Aplicación El componente de Aplicación contiene datos que están compartiendo entre todas las páginas de una aplicación, y que persiste entre peticiones simples a páginas El tipo de Aplicación es por si mismo abstracto, por lo que la única manera de crear un valor del tipo que está usando la aplicación es toApplication :: (Typeable a) => a -> Application
33 33 Sintaxis HSP – Entorno El entorno de Aplicación es actualmente un tipo de envoltorio (Wrapper) dinámico, el cual es usado para habilitar al componente de la Aplicación ser de cualquier tipo newtype Application = MkApp {appContents :: Dynamic} toApplication = MkApp. toDynamic Para acceder a los datos de aplicación de dentro de una página, un programador puede usar la función getApplication :: (Typeable a) => HSP a que devuelve un valor de su particular tipo de Aplicación
34 34 Sintaxis HSP – Entorno Ejemplo (un contador) Queremos actualizar los valores del contador necesitamos almacenarlo en una referencia Type MyApplication = Mvar Int Ponemos estas declaraciones en un módulo que llamamos MiAplicacion.hs y añadimos toMyApplication :: MyApplication -> Application toMyApplication = toApplication getMyApplication :: HSP MyApplication getMyApplication = getApplication
35 35 Sintaxis HSP – Entorno Función para incrementar el contador incrContador :: HSP () incrContador = do ctr
36 36 Sintaxis HSP – Entorno Ya sólo queda darle un valor inicial al contador En el modulo Aplicación.hsp primeramente hemos de importar MiAplicacion.hs, y la definición initApplication = do ctr
37 37 Sintaxis HSP – Entorno La página import MiAplicacion page = do incrementarContador Hola visitante nr ¡Hola! Eres el visitante nr de esta página.
38 38 Sintaxis HSP – Entorno Entorno de Sesión Los componentes de Sesión son un repositorio de datos que deja a las páginas mantener un estado entre transacciones Acceso al repositorio getSessionVar :: String -> HSP (Maybe String) setSessionVar :: String -> String -> HSP () Configurar tiempo de vida setSessionExpires :: ClockTime -> HSP () Forzando su terminación abandon :: HSP () almacenados en el lado del cliente usando cookies
39 39 HJavaScript Surgen la necesidad de un lenguaje script que pueda dar funcionalidad a nuestras páginas del lado del cliente HJScript se ha desarrollado con dos metas: Proveer al programador una sintaxis lo más abstracta posible Proveer una sintaxis cómo la original (JavaScript) Obviamente esto no es posible
40 40 HJavaScript Para modelar un lenguaje imperativo vamos a trabajar con una mónada La mónada será escritora-estado Parte escritora: Usada para el código JavaScript a la salida Parte estado: Usada para la gestión del gensym
41 41 HJavaScript Las 2 funciones básicas en la mónada, aparte de devolver y registrar son newVarName :: HJScript String newVarName = do s HJScript () outputCode = tell
42 42 HJavaScript También necesitamos una función evaluadora que genere el código de salida hjscript :: HJScript t -> HJState -> (t, JSBlock ()) hjscript script s = runWriter $ runStateT script s y una función que nos deja evaluar una computación dentro de otra: hjsInside :: HJScript t -> HJScript (t, JSBlock ()) hjsInside script = censor (const EmptyBlock) $ listen script
43 43 HJavaScript Sintaxis Para declarar una variable nombreVar
44 44 HJavaScript Elección de un símbolo operador $$ Así para invocar funciones en HJavaScript podremos hacerlo así call myFunction (a,b) O bien así myFunction$$(a,b)
45 45 HJavaScript Usar métodos de objetos en JavaScript Math.abs(n) d.getYear() En HJavaScript sería Math#abs$$(n) d#getYear()
46 46 HJavaScript Para integrar HJavaScript con el resto de HSP necesitamos escribir instancias para IsXML y IsAttrValue IsXML es necesario para Ejecutar un script cuando la página se carga Definir funciones en la sección de cabecera IsAttrValue es necesario para Atributos de eventos: onClick, onEvent, …
47 47 HJavaScript Instancia isXML instance IsXML (JsBlock ()) where toXML b = Instancia isAttrValue instance IsAttrValue (JsBlock ()) where toAttrValue b = toAttrValue $ pprBlock b
48 48 Foro en HSP Diseño del foro: Foro organizado en hilos Cada hilo consta de uno o más mensajes Cada mensaje consta de: Texto Quién lo escribió Cuándo lo escribió
49 49 Foro en HSP Configuraremos una base de datos Inicialmente suponemos que podemos acceder a la base de datos Empezaremos desarrollando un foro muy simple en el que sólo se muestre un mensaje, y lo iremos ampliando gradualmente
50 50 Foro en HSP Definición de registros data Hilo = Hilo { tema :: String, mensajes :: [Mensaje] } data Mensaje = Mensaje { autor, contenido :: String, fecha :: CalenderTime }
51 51 Foro en HSP Para mostrar un mensaje: mostrarMensaje :: Mensaje -> XML Información del mensaje grabado en si mismo o bien mostrarMensaje :: Mensaje -> HSP XML Información extra de otras fuentes
52 52 Foro en HSP Nos quedamos con la segunda opción mostrarMensaje :: Mensaje-> HSP XML mostrarMensaje mensaje =
53 53 Foro en HSP Se mostraría algo así
54 54 Foro en HSP Para simplificar el foro, esta será la manera por defecto de mostrar un mensaje instance IsXML Mensaje where toXML = mostrarMensaje Ahora vamos a definir una función para mostrar un hilo entero Asumimos que todos los hilos contienen al menos un mensaje Colocamos cada mensaje debajo del siguiente
55 55 Foro en HSP Función que muestra un hilo mostrarHilo :: Hilo -> HSP XML mostrarHilo hilo = do let disposicionMensajes = foldl1 (^^) $ map block $ hilo#mensajes enlacePrincipal = aLink “indice.hsp” “Volver al índice” toXML $ h1 (hilo#tema) ^^ enlacePrincipal ^^ disposicionMensajes ^^ enlacePrincipal ^^ Es un combinador que coloca cualquier objeto en disposición vertical.
56 56 Foro en HSP Código de: mostrarHilo.hsp import HSP Forum.Databases (getThread) import HSP.Layout pagina = do mthid redirect “indice.hsp” Just thId -> do mthread redirect “indice.hsp” Just hilo -> paginaHilo hilo paginaHilo hilo = mostrarHilo hilo =... mostrarMensaje mensaje =... { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_56.jpg", "name": "56 Foro en HSP Código de: mostrarHilo.hsp import HSP Forum.Databases (getThread) import HSP.Layout pagina = do mthid redirect indice.hsp Just thId -> do mthread redirect indice.hsp Just hilo -> paginaHilo hilo paginaHilo hilo = mostrarHilo hilo =...", "description": "mostrarMensaje mensaje =....", "width": "800" } 57 57 Foro en HSP Quedaría algo así { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_57.jpg", "name": "57 Foro en HSP Quedaría algo así", "description": "57 Foro en HSP Quedaría algo así", "width": "800" } 58 58 Foro en HSP Ahora vamos a definir la página índice de los hilos Necesitamos recuperar la id de los hilos y la línea del tema para todos los mensajes Dar formato a los pares en un enlace que nos llevará al hilo. Listar todos los enlaces { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_58.jpg", "name": "58 Foro en HSP Ahora vamos a definir la página índice de los hilos Necesitamos recuperar la id de los hilos y la línea del tema para todos los mensajes Dar formato a los pares en un enlace que nos llevará al hilo.", "description": "Listar todos los enlaces.", "width": "800" } 59 59 Foro en HSP Función para crear un enlace a un tema enlaceHilo :: Int -> String -> HSP XML enlaceHilo threaded = aLink (“mostrarHilo.hsp?idHilo=” ++ show threaded) Función para listar los hilos listaHilos :: [(Int, String)] -> HSP XML listaHilos hilos = ul $ map (uncurry enlaceHilo) hilos { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_59.jpg", "name": "59 Foro en HSP Función para crear un enlace a un tema enlaceHilo :: Int -> String -> HSP XML enlaceHilo threaded = aLink ( mostrarHilo.hsp idHilo= ++ show threaded) Función para listar los hilos listaHilos :: [(Int, String)] -> HSP XML listaHilos hilos = ul $ map (uncurry enlaceHilo) hilos", "description": "59 Foro en HSP Función para crear un enlace a un tema enlaceHilo :: Int -> String -> HSP XML enlaceHilo threaded = aLink ( mostrarHilo.hsp idHilo= ++ show threaded) Función para listar los hilos listaHilos :: [(Int, String)] -> HSP XML listaHilos hilos = ul $ map (uncurry enlaceHilo) hilos", "width": "800" } 60 60 Foro en HSP La página dinámica resultante page = do mthinfo 62 62 Foro en HSP Creamos un módulo llamado MiAplicacion.hs donde definimos type ConexionBD = (Database -> IO a) -> IO a type MiAplicacion = (Mvar (),ConexionBD) myToApplication :: MyApplication -> Application myToApplication = toApplication myGetApplication :: HSP MyApplication myGetApplication = toApplication { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_62.jpg", "name": "62 Foro en HSP Creamos un módulo llamado MiAplicacion.hs donde definimos type ConexionBD = (Database -> IO a) -> IO a type MiAplicacion = (Mvar (),ConexionBD) myToApplication :: MyApplication -> Application myToApplication = toApplication myGetApplication :: HSP MyApplication myGetApplication = toApplication", "description": "62 Foro en HSP Creamos un módulo llamado MiAplicacion.hs donde definimos type ConexionBD = (Database -> IO a) -> IO a type MiAplicacion = (Mvar (),ConexionBD) myToApplication :: MyApplication -> Application myToApplication = toApplication myGetApplication :: HSP MyApplication myGetApplication = toApplication", "width": "800" } 63 63 Foro en HSP Definimos dos funciones para trabajar sobre las conexiones conexionBD :: (Database -> IO a) -> HSP a conexionBD q = do (_, conn) IO a) -> HSP a conexionBDsegura q = do (lock, conn) 64 64 Foro en HSP Nos queda instalar el fichero Aplicacion.hs initApplication = do lock 65 65 Foro en HSP Para obtener todos los mensajes de un hilo particular darHilo :: Int -> HSP (Maybe Hilo) darHilo idHilo = do r1 query db consultaHilos case r1 of [] -> return Nothing -- No existe el hilo [rec] -> do r2 query db consultaMensajes return $ Hilo { tema = rec!Th.tema, mensajes = map hacerMensaje r2 } where consultaHilos = do t 66 66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_66.jpg", "name": "66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos", "description": "66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos", "width": "800" } 67 67 Foro en HSP Página intermedia page = do [thId, autor, contenidos, tema] do conexionBDsegura $ insertarHiloDeMensajes tema autor mensaje redirect $ “mostrarHilo.hsp?idHilo=” ++ show ti where insertarMensaje autor conts thid = \db -> do let (Just aut, Just txt) = (autor, conts) time 68 68 Foro en HSP insert db Th.posts (Th.idHilo 70 70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField “tema”] filaAutor = withLabel textField “autor” filaContenido = withLabel textArea “contenido” idHiloOculto = fmap (hidden “idHilo”) mthreadId botonEnvio = submit “Enviar” `set` [“value” := “Submit post”] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ “:”), f n] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_70.jpg", "name": "70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField tema ] filaAutor = withLabel textField autor filaContenido = withLabel textArea contenido idHiloOculto = fmap (hidden idHilo ) mthreadId botonEnvio = submit Enviar `set` [ value := Submit post ] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ : ), f n]", "description": "70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField tema ] filaAutor = withLabel textField autor filaContenido = withLabel textArea contenido idHiloOculto = fmap (hidden idHilo ) mthreadId botonEnvio = submit Enviar `set` [ value := Submit post ] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ : ), f n]", "width": "800" } 71 71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_71.jpg", "name": "71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = ", "description": "71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = ", "width": "800" } 72 72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_72.jpg", "name": "72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo", "description": "72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo", "width": "800" } 73 73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales. El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_73.jpg", "name": "73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales.", "description": "El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos..", "width": "800" } 74 74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell. Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_74.jpg", "name": "74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell.", "description": "Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no..", "width": "800" } 75 75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP. analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_75.jpg", "name": "75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP.", "description": "analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos..", "width": "800" } 76 76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell. Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_76.jpg", "name": "76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell.", "description": "Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros.", "width": "800" } 77 77 Bibliografía ASP.NET home. http://msdn.microsoft.com/asp.net/.http://msdn.microsoft.com/asp.net/ PHP: Hypertext Processor home. http://www.php.net/.http://www.php.net/ WASH home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/.home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/ Extensible Markup Language. http://www.w3c.org/XML.http://www.w3c.org/XML Buscadores científicos GOOGLE Scholar. http://scholar.google.com/http://scholar.google.com/ SCIRUS. Buscador de ciencia. http://www.scirus.com/srsapp/ Buscador de publicaciones científicas y de páginas Web de contenido científico.
57 57 Foro en HSP Quedaría algo así
58 58 Foro en HSP Ahora vamos a definir la página índice de los hilos Necesitamos recuperar la id de los hilos y la línea del tema para todos los mensajes Dar formato a los pares en un enlace que nos llevará al hilo. Listar todos los enlaces
59 59 Foro en HSP Función para crear un enlace a un tema enlaceHilo :: Int -> String -> HSP XML enlaceHilo threaded = aLink (“mostrarHilo.hsp?idHilo=” ++ show threaded) Función para listar los hilos listaHilos :: [(Int, String)] -> HSP XML listaHilos hilos = ul $ map (uncurry enlaceHilo) hilos
60 60 Foro en HSP La página dinámica resultante page = do mthinfo
61 61 Foro en HSP Conexiones a la base de datos HaskellDB Hay problemas con accesos concurrentes Asegurar que sólo hay un recurso de conexión Implementar un mecanismo para controlar quién y cuándo lo usa
62 62 Foro en HSP Creamos un módulo llamado MiAplicacion.hs donde definimos type ConexionBD = (Database -> IO a) -> IO a type MiAplicacion = (Mvar (),ConexionBD) myToApplication :: MyApplication -> Application myToApplication = toApplication myGetApplication :: HSP MyApplication myGetApplication = toApplication
63 63 Foro en HSP Definimos dos funciones para trabajar sobre las conexiones conexionBD :: (Database -> IO a) -> HSP a conexionBD q = do (_, conn) IO a) -> HSP a conexionBDsegura q = do (lock, conn) 64 64 Foro en HSP Nos queda instalar el fichero Aplicacion.hs initApplication = do lock 65 65 Foro en HSP Para obtener todos los mensajes de un hilo particular darHilo :: Int -> HSP (Maybe Hilo) darHilo idHilo = do r1 query db consultaHilos case r1 of [] -> return Nothing -- No existe el hilo [rec] -> do r2 query db consultaMensajes return $ Hilo { tema = rec!Th.tema, mensajes = map hacerMensaje r2 } where consultaHilos = do t 66 66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_66.jpg", "name": "66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos", "description": "66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos", "width": "800" } 67 67 Foro en HSP Página intermedia page = do [thId, autor, contenidos, tema] do conexionBDsegura $ insertarHiloDeMensajes tema autor mensaje redirect $ “mostrarHilo.hsp?idHilo=” ++ show ti where insertarMensaje autor conts thid = \db -> do let (Just aut, Just txt) = (autor, conts) time 68 68 Foro en HSP insert db Th.posts (Th.idHilo 70 70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField “tema”] filaAutor = withLabel textField “autor” filaContenido = withLabel textArea “contenido” idHiloOculto = fmap (hidden “idHilo”) mthreadId botonEnvio = submit “Enviar” `set` [“value” := “Submit post”] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ “:”), f n] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_70.jpg", "name": "70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField tema ] filaAutor = withLabel textField autor filaContenido = withLabel textArea contenido idHiloOculto = fmap (hidden idHilo ) mthreadId botonEnvio = submit Enviar `set` [ value := Submit post ] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ : ), f n]", "description": "70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField tema ] filaAutor = withLabel textField autor filaContenido = withLabel textArea contenido idHiloOculto = fmap (hidden idHilo ) mthreadId botonEnvio = submit Enviar `set` [ value := Submit post ] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ : ), f n]", "width": "800" } 71 71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_71.jpg", "name": "71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = ", "description": "71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = ", "width": "800" } 72 72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_72.jpg", "name": "72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo", "description": "72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo", "width": "800" } 73 73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales. El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_73.jpg", "name": "73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales.", "description": "El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos..", "width": "800" } 74 74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell. Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_74.jpg", "name": "74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell.", "description": "Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no..", "width": "800" } 75 75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP. analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_75.jpg", "name": "75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP.", "description": "analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos..", "width": "800" } 76 76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell. Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_76.jpg", "name": "76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell.", "description": "Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros.", "width": "800" } 77 77 Bibliografía ASP.NET home. http://msdn.microsoft.com/asp.net/.http://msdn.microsoft.com/asp.net/ PHP: Hypertext Processor home. http://www.php.net/.http://www.php.net/ WASH home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/.home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/ Extensible Markup Language. http://www.w3c.org/XML.http://www.w3c.org/XML Buscadores científicos GOOGLE Scholar. http://scholar.google.com/http://scholar.google.com/ SCIRUS. Buscador de ciencia. http://www.scirus.com/srsapp/ Buscador de publicaciones científicas y de páginas Web de contenido científico.
64 64 Foro en HSP Nos queda instalar el fichero Aplicacion.hs initApplication = do lock
66 66 Foro en HSP Función para almacenar hilos en su tabla correspondiente darInformacionHilo :: HSP [(Int, String)] darInformacionHilo = do r1 query db (table Th.hilo) return $ map (\rec -> (rec!Th.idHilo, rec!Th.tema)) r1 Creando/Enviando nuevos mensajes Comenzar un nuevo hilo o responder a un hilo existente Responder a un hilo se hará en una página aparte Visualizar mensajes tras enviarlos Introducimos una página intermedia entre la página de envío y la página que muestra los datos
67 67 Foro en HSP Página intermedia page = do [thId, autor, contenidos, tema] do conexionBDsegura $ insertarHiloDeMensajes tema autor mensaje redirect $ “mostrarHilo.hsp?idHilo=” ++ show ti where insertarMensaje autor conts thid = \db -> do let (Just aut, Just txt) = (autor, conts) time 68 68 Foro en HSP insert db Th.posts (Th.idHilo 70 70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField “tema”] filaAutor = withLabel textField “autor” filaContenido = withLabel textArea “contenido” idHiloOculto = fmap (hidden “idHilo”) mthreadId botonEnvio = submit “Enviar” `set` [“value” := “Submit post”] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ “:”), f n] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_70.jpg", "name": "70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField tema ] filaAutor = withLabel textField autor filaContenido = withLabel textArea contenido idHiloOculto = fmap (hidden idHilo ) mthreadId botonEnvio = submit Enviar `set` [ value := Submit post ] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ : ), f n]", "description": "70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField tema ] filaAutor = withLabel textField autor filaContenido = withLabel textArea contenido idHiloOculto = fmap (hidden idHilo ) mthreadId botonEnvio = submit Enviar `set` [ value := Submit post ] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ : ), f n]", "width": "800" } 71 71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_71.jpg", "name": "71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = ", "description": "71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo = ", "width": "800" } 72 72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_72.jpg", "name": "72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo", "description": "72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo", "width": "800" } 73 73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales. El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_73.jpg", "name": "73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales.", "description": "El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos..", "width": "800" } 74 74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell. Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_74.jpg", "name": "74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell.", "description": "Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no..", "width": "800" } 75 75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP. analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos. { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_75.jpg", "name": "75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP.", "description": "analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos..", "width": "800" } 76 76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell. Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.es/17/3414398/slides/slide_76.jpg", "name": "76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell.", "description": "Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros.", "width": "800" } 77 77 Bibliografía ASP.NET home. http://msdn.microsoft.com/asp.net/.http://msdn.microsoft.com/asp.net/ PHP: Hypertext Processor home. http://www.php.net/.http://www.php.net/ WASH home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/.home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/ Extensible Markup Language. http://www.w3c.org/XML.http://www.w3c.org/XML Buscadores científicos GOOGLE Scholar. http://scholar.google.com/http://scholar.google.com/ SCIRUS. Buscador de ciencia. http://www.scirus.com/srsapp/ Buscador de publicaciones científicas y de páginas Web de contenido científico.
68 68 Foro en HSP insert db Th.posts (Th.idHilo
69 69 Foro en HSP Formulario para enviar Mensaje formularioMensaje :: (Maybe Int) -> HSP XML formularioMensaje mthreadId =
70 70 Foro en HSP where filaDelTema = case mthreadId of Just _ -> [] Nothing -> [withLabel textField “tema”] filaAutor = withLabel textField “autor” filaContenido = withLabel textArea “contenido” idHiloOculto = fmap (hidden “idHilo”) mthreadId botonEnvio = submit “Enviar” `set` [“value” := “Submit post”] Definimos la función withLabel withLabel :: (String -> HSP XML) -> String -> [HSP XML] withLabel f n@(c:cs) = [label n (toUpper c : cs ++ “:”), f n]
71 71 Foro en HSP Para incluir el formulario con hilos, necesitamos retocar ligeramente el código para asegurar que tenemos acceso al id del hilo paginaHilo hilo idHilo =
72 72 Foro en HSP La página dedicada a comenzar los hilos, comenzarHilo.hsp, será import formularioMensaje page = Nuevo Hilo
73 73 Conclusiones La utilización de la potencia de un lenguaje funcional como es Haskell junto con la simplicidad de la utilización de un lenguaje script han hecho de HSP un lenguaje tan bueno como sus iguales. El área donde debemos realizar mayores esfuerzos para mejorar el lenguaje es en la construcción de librerías, donde los otros lenguajes tienen mayor ventaja. La meta inicial en la construcción del diseño del lenguaje HSP era que tuviera el mismo poder expresivo que Haskell para atraer al programador funcional experto, y además fuera muy intuitivo para el programador Web novato. El problema de que no esté muy extendido es que necesita de una comunidad activa que ayude con extensiones y mejoras, como librerías, manuales y programas de ejemplos.
74 74 Futuros trabajos El modelo de programación presentado define la sintaxis y la semántica de la extensión XML a Haskell. Pero hay algunas extensiones que podrían introducirse para simplificar la forma de expresar con certeza algunos modismos. Una extensión que vendría conveniente cuando los patrones enlacen elementos es permitir resumir el nombre del elemento en la sintaxis XML concreta. Otra posible extensión es permitir una forma de búsqueda de atributo que tendrá éxito independientemente de la existencia del atributo o no.
75 75 Futuros trabajos Otra cosa a tener en cuenta, es la implementación, ya que ésta proporciona una completa funcionalidad al sistema HSP. analizador de tipos Una solución al horrible mensaje de error que aparece en el pre-procesador sintáctico puro, antes de comprobar los tipos es extender el pre-proceso con un analizador de tipos que pueda manejar nuestra sintaxis XML tan bien como el código Haskell incluido en todas las extensiones que HSP usa. Crear numerosos documentos de ayuda en pdf, y conseguir desarrollar un gran número de librerías para conexiones a bases de datos.
76 76 Bibliografía Erik Meijer. Server-side Web Scripting in Haskell. Journal of Functional Programming, 1(1), 1998. Erik Meijer and Mark Shields. XMλ: A Functional Language for Constructing and Manipulating XML Documents. (Draft), 1999. Paul Graunke, Shriram Krishnamurthi, Steve Van der Hoeven and Matthias Felleisen. Programming the Web with High-level Programming Languages. In Proceedings of the European Symposium On Programming, 2001. Erik Meijer and Danny van Velzen. Haskell Server Pages: Functional Programming and the Battle for the Middle Tier. In Proceedings of the Haskell Workshop, 2000. Ruiz, B.C., Gutierrez, F., Guerrero, P., Gallardo, J.E. Razonando con Haskell. Una introducción a la Programación Funcional. Los autores. 2000 Broberg, Niklas. Thesis for the Degree of Master of Science.Haskell Server Pages (DRAFT) Chalmers University of Technology 2005 Documentos y libros
77 77 Bibliografía ASP.NET home. http://msdn.microsoft.com/asp.net/.http://msdn.microsoft.com/asp.net/ PHP: Hypertext Processor home. http://www.php.net/.http://www.php.net/ WASH home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/.home.http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/ Extensible Markup Language. http://www.w3c.org/XML.http://www.w3c.org/XML Buscadores científicos GOOGLE Scholar. http://scholar.google.com/http://scholar.google.com/ SCIRUS. Buscador de ciencia. http://www.scirus.com/srsapp/ Buscador de publicaciones científicas y de páginas Web de contenido científico.