2012-02-07 1 views
6

私は小さなスカラDSLを作成していますが、実際には解決できない次の問題に遭遇しています。私が達成したいものの小さな概念例:Scala DSL:パラメータのないメソッドを使用したメソッドチェーン

(Compute 
write "hello" 
read 'name 
calc() 
calc() 
write "hello" + 'name 
) 

このDSLを定義するコードは大体これです:

Object Compute extends Compute{ 
    ... 
implicit def str2Message:Message = ... 
} 
class Compute{ 
def write(msg:Message):Compute = ... 
def read(s:Symbol):Compute = ... 
def calc():Compute = { ... } 
} 

質問:どのように私はカルク後にこれらの括弧を取り除くことができます?出来ますか?もしそうなら、どうですか?定義の中でそれらを省略するだけでは、コンパイルエラーのために助けにならない。

答えて

3

[OK]を、私が思うに、私が受け入れ可能な解決策を見つけた...私は今、この可能な構文

という名前のオブジェクトを使用して
| write "hello" 
| read 'name 
| calc 
| calc 
| write "hello " + 'name 

を達成し、私が望んでいたほとんどのDSLを書くことができています。正常に、 ";"そのパラメータがない場合、calcの後に必要です。ここでのトリックは、DSLオブジェクト自体(ここでは、次の行の "|")を受け入れることです。このパラメータを暗黙的にすることで、このコードの最後の文としてcalcを使用することもできます。 まあ、それは確かに私の望むようにすることはできませんが、これもOKです

+0

よろしく!トリッキー! ))))) – noncom

-1

最初に、calcの定義からかっこを削除してみます。次に、かっこの代わりに全体を中括弧で囲みます。中括弧と括弧は同じ意味ではなく、括弧はセミコロンを使用しない限り、一行コードで最も効果的です。関連項目What is the formal difference in Scala between braces and parentheses, and when should they be used?

+1

ここでは、paranthesesを使用する理由があります。 methodchainingは実際に改行では機能しません。ただし、scalaはその唯一のステートメントを知っているので、 "()"で囲まれています。 "{}"で動作しません。構文のスカラ砂糖はもう働かないし、私は別の方法を連鎖呼び出すことができないからです。 – wrm

+0

ああ、私は他の方法を考えていました。どのようなコンパイルエラーがありますか?実行可能にするためにあなたの例を凝縮できますか? – thoredge

+0

最後の行を示し、次のように表示されます。 \t - Computeクラスのメソッド書き込みに関する引数がありません。部分的に適用された関数として扱う場合は、このメソッドの後に '_'を続けます。 \t - ')'が必要ですが、シンボルリテラルが見つかりました。 ここで問題となるのは、 'x.y(p1).z(p2)'から 'x y p1 z p2 'への通常の変換は、明らかに砂糖に変換できない' x.y.z(p2) 'に似ているためです。同様のことを達成するためにメソッド連鎖を使う以外の方法がありますが、私はこの構文を実現するために1つの作業方法を見つけることができません... – wrm

3

括弧を取り除くことはできませんが、置き換えることはできます。

object method 
non-reserved-word 

それはそれはobject.method(non-reserved-word)を意味前提としています。たとえば:Scalaはこのような何かを見ている時はいつでも

object it 

class Compute { 
def calc(x: it.type):Compute = { ... } 

(Compute 
write "hello" 
read 'name 
calc it 
calc it 
write "hello" + 'name 
) 

は、ビットを展開します。

object method object 
method2 object2 
新しいオブジェクトであることを method2を期待それはこれらが object.method(object); method2.objectのように、二つの独立した文ですと仮定し

、およびobject2方法:逆に、いつでもそれはこのようなものを見ています。

これらの前提は、Scala文法の一部です。これは、このように意図されています。 「|」

+0

私はちょうどこの瞬間に書いたように(calcをパラメータとします)私の答え)。私はまた、ケースクラスや静的メソッド呼び出しのようないくつかの他の方法を試しましたが、これが唯一の方法だと思われます。 – wrm

+0

時間がある場合は、かっこを取り除くことが不可能な理由を書き留めてください。 – kisileno

+0

もう一つの質問は、すべての式を丸める括弧についてですが、それらを避けることができますか? – kisileno

関連する問題