2012-04-28 114 views
2

我將解釋什麼,我通過限制範圍首先意味着:是否有可能在Scala中創建一個「受限範圍」?

restrictedScope (allowedNamespace) { 
    /* THE CLIENT CODE GOES HERE */ 
    /* the namespace in this closure is limited only to the idioms 
     I allow, both in terms of reserved words and standard functions */ 

    val result = allowedNamespace.run(); // works, since run() ... 
    // ... is a function of allowedNamespace 
    val list = new List(); // does not work, since List is not in scope 

    /* CLIENT CODE SAMPLE (prepare, release and wait are defined in allowedNamespace) */ 
    prepare("service 1") 
    wait(1000) 
    release("service 1") 
    ... 

} 

在執行基於常規的Scala代碼嚴格勢在必行DSL,我想安全地運行客戶端代碼。爲了安全起見,我可能想要限制這樣的構造的使用,如,如果(只有可能的話),刪除列表的創建,並且只允許我在允許的命名空間中定義的習語被執行/引用。

是否有設施可以做到這一點,而不會覆蓋所有標準成語?

如果沒有,是否有自動方式(可能通過反射)來覆蓋導入到命名空間的所有標準成語?

+1

我想這就是他們所說的一流的上下文,但我不確定。 – missingfaktor 2012-04-28 13:48:28

回答

3

可能有可能在斯卡拉2.10實驗宏這將讓你在編譯之前檢查裏面restrictedScope代碼來執行。

但是,我認爲你很難過濾樹的允許和禁止方法。所以我不確定這是否可行。

或者,你可以利用實驗斯卡拉虛擬化分支,這之中至少可以讓你簡單地重載forif陳述自己的喜好。 (Reference

然而,這也需要運送你自己的編譯器,所以它確實取決於你的問題的範圍和目標用戶羣。 (Some more info on Scala DSLs.

+0

scala-virtualized是一個非常整潔的項目,即使我無法運送它。謝謝你指出。 Ifs和Fors可以留下來,只要我重寫剩下的命名空間即可。 – sdkfasldf 2012-04-29 00:46:57

相關問題