ページ

2009年6月18日木曜日

[VB10] VB2010 の暗黙的な行継続

昨日書いた 「[VB10] Visual Basic 2010 の新機能」 に関連してちょっとおもしろそうだったので。

Implicit Line Continuation in VB 10 (Tyler Whitney) より
(と言ってもまだよく読んでないんですが)

暗黙的な行継続を認めたとき

Return 1
+foo()

これは Return 1 なんでしょうか?それとも Return 1+foo() なんでしょうか?
2行目は foo() メソッドの呼び出しに単項+演算子が付いたものとも解釈できるわけですね。
C# だとステートメント末に “;” が付くのでこのような曖昧性はおこりませんが、ステートメント末を指定しない VB ではこういったことがおこってしまうわけです。
(C# で +foo(); と書くと 「メソッドの戻り値に単項+演算子を適用した値が何にも使われていない」 ってことで error か warning になったように思いますが、まぁ、それは別の話ってことで)

さらにこんなのも例示されています。

With y
    A=x
    .xfield
End With

さて、これは

暗黙の行継続されてて、こう?
    With y
       A=x.xfield
    End With

それとも書かれてる通り、こう?
    With y
        A=x
        .xfield
    End With

これまたどちらとも解釈可能になってしまいます。

また、VB には Do . . . Loop ステートメントWhile . . . End While ステートメント なんてものもあります。
そのため

Do
    While x = 0
        . . .
    End While
Loop

なんてのも Do . . . Loop なのか、それとも Do と While を繋げて Do While . . . なのかがすぐには判断できません。
この場合は、先読みしていって End While が出てくるか Loop が出てくるかといった具合に探していけば曖昧性無しに解釈可能かもしれませんが、いろいろとややこしいことになりそうですし、場合によっては曖昧性が発生するようにも思えます。

上記記事には他の事例も載っていますが、こんな風に VB では 「どこでも改行できる」 なんてことは不可能なわけです。
C/C++/C#/Java と言った言語は 「改行は空白文字の一種」 とみなされて、空白を書けるところであればどこでも改行できます。(もちろん、プリプロセッサや文字列定数の中などは改行は別扱いされたりしますが)
VB の文法をこのように変更することはどう考えても不可能なので、文法的に曖昧性が発生せず、みんなが改行したいだろうと思われるところを抽出し、そして 「ここでの改行は認めよう」 というのをルール化したのが暗黙の行継続という機能なわけですね。


0 件のコメント:

コメントを投稿