Am Dienstag 05 Mai 2009 21:42:00 schrieb Tobias Olausson:
> This simple implementation of CPU does not behave as expected in the
> latest version of  ghc using ST.Lazy since it updates the `pc` in the
> wrong order.
> When we use ghc-6.8 the code works as expected both with lazy and strict
> ST. How is that? How do we fix this so we can use ghc-6.10.

Fix 1: compile with optimisations.
The sample code worked here with that.

Fix 2: change fetch:

> fetch :: CPU s OPCode
> fetch = getVar pc >>= \v -> alterVar pc (+1) >> readMem v

The lazy ST doesn't actually read the STRef before readMem v is called, so it 
reads the 
altered STRef and consequently the wrong memory address. Make sure that v is 
determined 
before the STRef is altered, e.g. by

fetch = getVar pc >>= \v -> v `seq` (alterVar pc (+1) >> readMem v)

or

fetch = do
    v <- getVar pc
    w <- readMem v
    alterVar pc succ
    return w
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to