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を実行しながら、クライアントコードを安全に実行したいと思います。そして、これを安全に行うために、 forのような構造の使用を制限し、 (可能な場合のみ)リストの作成を削除し、許可された名前空間で定義したイディオムのみを実行/参照できるようにします。

すべての標準的なイディオムを上書きせずに、これを行うための機能はありますか?

そうでない場合、名前空間にインポートされたすべての標準イディオムをオーバーライドする自動方法(おそらくリフレクションを介して)はありますか?

4

1 に答える 1

3

これは、コンパイルする前に内部のコードを検査できるScala2.10の実験的なマクロで実行できる可能restrictedScopeがあります。

ただし、許可されたメソッドと禁止されたメソッドについてツリーをフィルタリングするのは難しいと思います。したがって、これが実行可能かどうかはわかりません。

あるいは、実験的なscala仮想化ブランチを利用することもできます。これにより、少なくとも、自分の好みに合わせて単純にオーバーロードforしてステートメントを作成できます。if参考

ただし、これには独自のコンパイラを出荷する必要があるため、問題の範囲とターゲットユーザーベースによって異なります。(Scala DSLに関する詳細情報。

于 2012-04-28T13:17:53.837 に答える