2

我将首先解释限制范围的含义:

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 时,我想安全地运行客户端代码。为了安全地做到这一点,我可能想限制forif等结构的使用(仅在可能的情况下),删除列表的创建并只允许执行/引用我在允许的命名空间中定义的习语。

是否有工具可以做到这一点,而不覆盖所有标准习语?

如果没有,是否有一种自动方式(可能通过反射)来覆盖导入到命名空间的所有标准习语?

4

1 回答 1

3

可能与 Scala 2.10 中的实验宏有关,它允许您restrictedScope在编译之前检查内部代码。

但是,我认为您将很难为允许和禁止的方法过滤树。所以我不确定这是否可行。

或者,您可以使用实验性的scala-virtualized分支,它至少可以让您简单地重载forif声明自己喜欢的语句。(参考

然而,这也需要发布您自己的编译器,因此它实际上取决于您的问题范围和目标用户群。(有关 Scala DSL 的更多信息。

于 2012-04-28T13:17:53.837 回答