[Haskell-cafe] A Strict GCL Interpreter in Haskell

Hector Guilarte hectorg87 at gmail.com
Thu Jul 2 12:35:17 EDT 2009


Hi everyone!

(First of all, I don't know Monads!)

I made a GCL (Guarded Command Language) Compiler and Interpreter for my
Languages and Machines course in my University with alex, happy and ghc. I
still have a doubt:

1) Since Haskell is Lazy, and my GCL program is being interpreted in Haskell
then my GCL is Lazy too (I know is not as simple as that but believe me,
somehow it is behaving lazy). The problem is that it can't be lazy (said to
me by my teacher on monday) so I tried using seq, but it didn't work, I'll
paste the code after this:
Programs in GCL like:
a)
var i : value
main
    i <- 1 / 0
end

b)
var i : value
main
    i <- 1 / 0;
    show i
end

c)
var i : value
var foo : array of 2
main
    i <- foo[42]
end

d)
var i : value
var foo : array of 2
main
    i <- foo[42];
    show i
end

act like this:
a and c finish interpretation
b throws division by zero error and finish interpretation
d throws index out of bounds error and finish interpretation

Now the code:
(it is in Spanish. ListLValue is a List of L-Values for the assigments,
ListExpr is the list of Expressions to be assigned, Tabla is the Symbol
Table (Data.Map), actualizarVar updates a Variable in the Symbol Table with
the new value "valor", ActualizarArray updates the position "indice" of an
array in the Symbol Table. evalExpr evaluates an arithmetic Expression and
returns an Int. Inside evalExpr are the verifications for division by zero
of modulo by zero.)

evalAsignacion:: ListLvalue -> ListExpr -> Tabla -> Tabla
evalAsignacion [] [] tabla = tabla
evalAsignacion ((Lid id):valueList) (expr:exprList) tabla =
    let valor = (evalExpr expr tabla)
    in valor `seq` evalAsignacion valueList exprList (actualizarVar id valor
tabla)
evalAsignacion ((LArrayPosition id exprArray):valueList) (expr:exprList)
tabla =
    let valor = (evalExpr expr tabla)
        indice = (evalExpr exprArray tabla)
    in valor `seq` indice `seq` evalAsignacion valueList exprList
(actualizarArray id indice valor tabla)

evalExpr:: Expr -> Tabla -> Int
evalExpr expr tabla =
    let salida = (snd (evalAritmetico expr tabla))
    in salida `seq` if (isLeft salida) then error (getLeft salida)
                              else getRight salida

--((Int,Int) is the Line and Colum, that's for error reporting)
evalAritmetico :: Expr -> Tabla -> ((Int,Int),(Either String Int))
--LET ME KNOW IF YOU NEED THIS PART TOO


Thanks in advance,

Hector Guilarte
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090702/5a9eb4b6/attachment.html


More information about the Haskell-Cafe mailing list