2012-12-02 94 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) |] 

或任何適合你。