2012-04-28 72 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

相关问题