我将首先解释限制范围的含义:
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时,我想安全地运行客户端代码。为了安全地执行此操作,我可能希望限制构造的使用,例如用于和如果(仅在可能的情况下),删除列表的创建并仅允许成语我在允许的命名空间中定义要执行/引用。
是否有设施可以做到这一点,而不是覆盖所有标准习语?
如果没有,是否有自动方式(可能通过反射)覆盖导入命名空间的所有标准习语?
答案 0 :(得分:3)
此可能可以与Scala 2.10中的实验宏一起使用,它允许您在编译之前检查restrictedScope
内的代码。
但是,我认为你很难过滤树的允许和禁止方法。所以我不确定这是否可行。
或者,您可以使用实验性的 scala-virtualized 分支,这至少可以让您根据自己的喜好简单地重载for
和if
语句。 (Reference)
然而,这还需要运送您自己的编译器,因此它实际上取决于您的问题范围和目标用户群。 (Some more info on Scala DSLs.)