2012-12-02 63 views
2

这可能是一个非常基本的问题。在Haskell中实现DSL

我在DSL工作是eventuyally会允许我说:

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

我刚开始对翻译功能runCWMWL工作,我不知道是否有可能逃脱真正的Haskell不知何故(以及如何?)在do-block内部或外部。

我想为我的解释器中的一些必需的前奏功能(如print)提供一个defautl包装器,但我想知道是否有更优雅的方式共同loacate DSL和Haskell而不会回落成为普通库只要。

+0

我不明白你的代码,但'?BOOL'似乎不是Haskell? –

+0

@NiklasB它是理想情况下应该成为浅层(?)嵌入式DSL的一部分。 –

+1

如果'CWMWL'是一个monad,那么你只需要为[MonadIO]编写一个实例(http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-IO- Class.html)类。如何在您的DSL中嵌入IO操作以及如何使用'runCWMWL'运行它们将由您决定。 – JJJ

回答

5

Template Haskell可以看看QuasiQuoting。你可以做

import Language.CWMWL 

main = runCWMWL [eval| 
    ("isFib::", 1000, ?BOOL) |] 

main = [run|("isFib::", 1000, ?BOOL) |] 

或任何适合你。