Scalaで内部DSLを構築しようとすると、共通の問題が発生し、解決策を作ることができませんでした。物事はより一般的な言語のようなビットを見えるようにするために、私は、構文は次のようになりたいのです。実際にはScalaの一連の式からリストを作成する
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
は、いくつかの問題があります。最初の問題は、ここでmodel
オブジェクトにこのように2つの引数を取ることです。誰かにアイディアがあれば教えてください。モデルは今、その後、その後、次のラムダを消費apply
メソッドを持つオブジェクトを返す関数である
model('Foo) {
...
}
:しかし、私が代わりにやったことは、もう少しこのような何かを行うことです。私は一緒に暮らすことができます。私もラムダの中で同様の問題で生きることができたので、内側にはdecl 'Real 'x
またはdecl('Real,'x)
のようなものがあります。しかし、私がしたいのは、括弧内のすべての式の結果をリストとして返されるようにすることです。言い換えれば、私が欲しいのは、このような何かを書くことです:decl(...)
はタイプDeclaration
の何かに評価され、{...}
が、その後List[Declaration]
と評価さ
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
。私は、これを行うために暗黙的な方法を使用するいくつかの方法があると思うが、私はそれを見つけることができませんでした。要するに、私がしたいのですが:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
... ...
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
コメントや提案の同等に評価しますか?
はい、私は、宣言的なGUI DSLのいくつかについてもこのアプローチを見てきました。私はこれが近いことに同意する。私はちょうどあなたが追加したり削除したりするたびに、物事の間に "、"があることを心配する必要があるので、すべてのものを取り巻く必要はなく、 "、"というのは問題があります。最後に。 –
あなたのコメントに答えるために自分の答えを変更しました。 – paradigmatic
ああ、とても賢い。コンストラクタの構文とローカルで定義されたメソッドの使用。私はそれが好きで、うまくいくと思う。実際、コードを簡略化して "new Model( 'Foo){...}'にすることができます。コンストラクタの文脈で括弧で囲まれた中カッコで、そのスコープに簡単に物事を導入できるという事実を利用するうまい方法です。 Scala 2.10のマクロがこれをもっと簡単にするのだろうか? –