Message: 2
From: "David House" <dmhouse@gmail.com>
Subject: [Haskell-cafe] Writing an extensible interpreter
 
 
I'm in the process of writing an interpreter for the self-modifying
automaton languages SMATINY [1], designed by ihope (whose name some of
you may recognise from IRC). The current effort is online [2], but
it's at a rather early stage and there's a few modifications I'd like
to make to it.

[snip]

However, the remaining issue is step 1): how would the metacode handle
additional constructors to the Step ADT? Type classes won't work here:
the intepreter has a type of [Step] -> String. With type classes this
would have a type of something like Step a => [a] -> String, but by
the homogeneity of lists you'd only be able to have one type of step
in your program.

You can get around the homogeneity of lists problem with existential types:

http://www.haskell.org/hawiki/ExistentialTypes
http://halogen.note.amherst.edu/~jdtang/scheme_in_48/tutorial/evaluator2.html#equal

Another solution might be to eliminate the algebraic data type entirely and have the Parsec actions return a Smatiny action.  Instead of dispatching on the constructor of Step, package up any information you need as a closure and make Step a type synonym for 'Smatiny ()' or 'Smatiny a' or whatever type you need.  Then the interpreter main loop just executes the action returned by the parser. 

- Jonathan