[Haskell-cafe] Design of a DSL in Haskell

Joerg Fritsch fritsch at joerg.cc
Mon Dec 3 17:02:24 CET 2012


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
>>> 
>>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20121203/3b5c2584/attachment.htm>


More information about the Haskell-Cafe mailing list