Hugs
Tipus | compilador |
---|---|
Llicència | llicència BSD |
Característiques tècniques | |
Escrit en | C |
Més informació | |
Lloc web | haskell.org… |
| |
Hugs (Haskell User's Gofer System) és un intèrpret bytecode per al llenguatge funcional Haskell. Ofereix compilació ràpida i una velocitat d'execució acceptable. A més, inclou una llibreria gràfica simple. Hugs és una bona eina per a tota aquell que està aprenent les bases de Haskell, la qual cosa no implica que sigui una "implementació de joguina". Actualment l'intèrpret GHCi supera la capacitat de Hugs i més des que la versió 7.4 de GHCi admet tota mena de declaracions a nivell de mòdul.[1]
Llista de diferències amb l'estàndard Haskell 98 aquí.[2] Malgrat que diu que no suporta Unicode (només codif. Latin-1), al Linux amb codificació UTF-8 els accents funcionen tant a les cadenes de text com als identificadors.
Hugs és un programa de codi obert que disposa de versions per als sistemes operatius més difosos tals com Linux, BSD, Microsoft Windows o Mac OS X.
Per començar
[modifica]Activació de Hugs amb extensions pròpies
[modifica]Buscant l'extensió TRex (registres extensibles)[5] que molta gent troba a faltar a GHC.[6] Després de fer una mica d'arqueologia (pel nom TRex i lo amagat de l'activació), cal desactivar la compatibilitat amb Haskell98 (opció +98) canviant-la de signe -98:[7]
# per possibilitar els registres extensibles cal importar el mòdul corresp. hugs -98 Hugs.Trex Hugs.Trex> (a=True, b="Hello", c=12::Int | (b1="World")) (a = True, b = "Hello", b1 = "World", c = 12) Hugs.Trex>
exemple:
-- fitxer prova.hs amb extensions específiques Hugs
module Main where
import Hugs.Trex
type Coord = Double
type Punt2D = Rec (x::Coord, y::Coord)
type Punt3D = Rec (x::Coord, y::Coord, z::Coord)
punt2D = (x=1, y=1) :: Punt2D
-- emptyRec :: Rec EmptyRow -- registre buit predefinit
-- (x=1 | (y=1)) -- extensió de registres
-- (x=v | rec) -- patró de descomposició per encaix de valors de registres
-- (x::tipus | rec) -- patró de descomposició per encaix de tipus de registres
-- (rec \ z) al context vol dir ''rec'' no conté el camp ''z''
-- afegeix un camp z del mateix tipus que el camp x
afegeixCoordZ :: (r\z, r\x) => t -> Rec (x::t | r) -> Rec (x::t, z::t | r)
afegeixCoordZ z (x = x | resta_de_camps) = (x = x, z = z | resta_de_camps)
punt3D = afegeixCoordZ 3 punt2D :: Punt3D
-- accepta registres que continguin camps (x, y, ...) que implementin ''Show''
imprimeixXY :: (Show t, r\x, r\y) => Rec (x::t, y::t | r) -> IO ()
imprimeixXY punt = putStrLn xy
where xy = show (#x punt) ++", "++ show (#y punt)
incrementaX :: (Num t, r\x) => Rec (x::t | r) -> Rec (x::t | r)
incrementaX (x=v | resta_de_camps) = (x=v+1 | resta_de_camps)
main = do
let punt3D' = incrementaX punt3D
imprimeixXY punt2D
imprimeixXY punt3D'
Executant amb compatibilitat H98 desactivada per activar les extensions de llenguatge:[7]
runhugs -98 prova.hs
Referències
[modifica]Enllaços externs
[modifica]- Pàgina oficial de Hugs (anglès)