The below is probably not a good example since it does not require a DSL but the principle is clear that I want to take things from teh host language that I do not have implemented (yet) in my DSL.

--Joerg

On Dec 3, 2012, at 4:25 PM, Joerg Fritsch wrote:

Thanks Brent,

my question is basically how the function embed would in practice be implemented.

I want to be able to take everything that my own language does not have from the host language, ideally so that I can say:

evalt <- eval ("isFib::", 1000, ?BOOL))
case evalt of
           Left Str -> ....
           Right Str -> .... 


or so.
        
--Joerg

On Dec 3, 2012, at 4:04 PM, Brent Yorgey wrote:

(Sorry, forgot to reply to the list initially; see conversation below.)

On Mon, Dec 03, 2012 at 03:49:00PM +0100, Joerg Fritsch wrote:
Brent,

I believe that inside the do-block (that basically calls my
interpreter) I cannot call any other Haskell function that are not
recognized by my parser and interpreter.

This seems to just require some sort of "escape mechanism" for
embedding arbitrary Haskell code into your language.  For example a
primitive

 embed :: a -> CWMWL a

(assuming CWMWL is the name of your monad).  Whether this makes sense,
how to implement embed, etc. depends entirely on your language and
interpreter.  

However, as you imply below, this may or may not be possible depending
on the type a.  In that case I suggest making embed a type class method.
Something like

 class Embeddable a where
   embed :: a -> CWMWL a

I still get the feeling, though, that I have not really understood
your question.

I am also trying to learn how I could preserve state from one line
of code of my DSL to the next. I understand that inside the
interpreter one would use a combination of the state monad and the
reader monad, but could not find any non trivial example.

Yes, you can use the state monad to preserve state from one line to
the next.  I am not sure what you mean by using a combination of state
and reader monads.  There is nothing magical about the combination.
You would use state + reader simply if you had some mutable state as
well as some read-only configuration to thread through your
interpreter.

xmonad is certainly a nontrivial example but perhaps it is a bit *too*
nontrivial.  If I think of any other good examples I'll let you know.

-Brent



On Dec 3, 2012, at 1:23 PM, Brent Yorgey wrote:

On Sun, Dec 02, 2012 at 03:01:46PM +0100, Joerg Fritsch wrote:
This is probably a very basic question.

I am working on a DSL that eventuyally would allow me to say:

import language.cwmwl
main = runCWMWL $ do
  eval ("isFib::", 1000, ?BOOL)

I have just started to work on the interpreter-function runCWMWL and I wonder whether it is possible to escape to real Haskell somehow (and how?) either inside ot outside the do-block.

I don't think I understand the question.  The above already *is* real
Haskell.  What is there to escape?

I thought of providing a defautl-wrapper for some required prelude
functions (such as print) inside my interpreter but I wonder if
there are more elegant ways to co-loacate a DSL and Haskell without
falling back to being a normal library only.

I don't understand this sentence either.  Can you explain what you are
trying to do in more detail?

-Brent