C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 行末のセミコロンの省略 [1]


(過去ログ 53 を表示中)

[トピック内 37 記事 (21 - 37 表示)]  << 0 | 1 >>

■29212 / inTopicNo.21)  Re[6]: 行末のセミコロンの省略
  
□投稿者/ 774RR (253回)-(2008/12/05(Fri) 15:18:32)
なんでたかが行末だけにこだわるのかよくわからない。
行末にこだわるのならインデントにもこだわってほしい。
括弧の位置にもこだわってほしい。

とりあえず python などどうですか?
インデントが文法の一部ですが、なにか?
引用返信 編集キー/
■29213 / inTopicNo.22)  Re[7]: 行末のセミコロンの省略
□投稿者/ .SHO (301回)-(2008/12/05(Fri) 15:26:13)
No29212 (774RR さん) に返信

> なんでたかが行末だけにこだわるのかよくわからない。

多分よく忘れるからだと思います。

引用返信 編集キー/
■29242 / inTopicNo.23)  Re[8]: 行末のセミコロンの省略
□投稿者/ たくボン (95回)-(2008/12/05(Fri) 21:55:42)
No29213 (.SHO さん) に返信
> ■No29212 (774RR さん) に返信
> 多分よく忘れるからだと思います。

俺もよくVBなのに;や()書いてしまいます。

言語仕様やコンパイラの挙動を熟知していればトリッキー(普通の人からはトリッキーに見えるだけ)なコーディングもできますし、使う人のレベルにあわせて言語もあると思います。
言語仕様である程度の制限をかけておかないとお行儀の悪いコードが蔓延しますし、引いては言語とOSを提供しているMSから見れば不利益になることも多いでしょうし。

VBが出てきた背景にはWindowsシェアの拡大が目的であり、そのためにはプログラマの受け口を広げるためにC++だけでなくVBが登場しました(うろ覚えですがVB2くらいまでは、コンパイラが一旦C++と同じようなエントリマップ吐いてたような記憶があるので、なんちゃってBASICだなぁって思ってました)

当然、言語が成熟してくると言語仕様外のコーディングも当たり前(VB4くらいからAPI使用とか当たり前になりましたし)になってきて、リソースの管理ができていないお行儀の悪いプログラムが増えてきたので、.NETの登場だと思います。MSはC#の登場でVBプログラマの移行を狙ってたと思いますが、依然日本ではVBユーザが多いのも事実だと思います。

時代と共に言語は変わるので、プログラマは変化に対応しないとロートル化しますが、この変化が進歩に繋がっていると思います。
(JavaScriptなんかはいい例で、時代と共に言語仕様を大きく超えたとても強力な言語になったと思いますし)

個人的に言語なんかは目的や政治的要因で変わっても問題ないかなと思っています。
if thenやend〜のブロック終了のほうが冗長であまり好きになれないですし(でもVBを蹴ると仕事も少ないのが現実・・・orz)

言語仕様が気持ち悪いとか、邪魔臭いって気持ちもよくわかります。

そういう時は、仕事と趣味で言語をわけてみるのもいいと思います:-)
引用返信 編集キー/
■29244 / inTopicNo.24)  Re[9]: 行末のセミコロンの省略
□投稿者/ はいこーん (1回)-(2008/12/05(Fri) 23:18:35)
No29242 (たくボン さん) に返信
> 俺もよくVBなのに;や()書いてしまいます。

セミコロンはともかく () はいいでしょう。
引用返信 編集キー/
■29245 / inTopicNo.25)  Re[10]: 行末のセミコロンの省略
□投稿者/ たくボン (96回)-(2008/12/06(Sat) 01:58:25)
No29244 (はいこーん さん) に返信
> ■No29242 (たくボン さん) に返信
>>俺もよくVBなのに;や()書いてしまいます。
> 
> セミコロンはともかく () はいいでしょう。

へぇ〜、いいんだ。

For (i as integer = 0 To 10)
   '…
Next

Using (sr As New IO.StreamReader("hoge.txt"))
   '…
End Using

きっと叱られてるのは俺が悪いんですね。

引用返信 編集キー/
■29253 / inTopicNo.26)  Re[9]: 行末のセミコロンの省略
□投稿者/ .SHO (313回)-(2008/12/06(Sat) 11:44:47)
No29242 (たくボン さん) に返信

> 言語仕様である程度の制限をかけておかないとお行儀の悪いコードが蔓延しますし

これは違うと思います。

それと、なんとなくなんですが C# だとセミコロンなくても
コンパイラは困らないかも?という気になってきました。

他の言語はともかく、C#でセミコロンがないとコンパイラが
困るという例が何かありますか?

引用返信 編集キー/
■29259 / inTopicNo.27)  Re[10]: 行末のセミコロンの省略
□投稿者/ 出水 (100回)-(2008/12/06(Sat) 12:36:38)
続いてもいいし切ってもいい構文の時どちらに倒すか問題になります
改行を完全なデリミタとするのであれば、そんなに問題になりませんが、
これは下位互換性を著しく損なうので、新規の言語でないと導入できないでしょう

その辺を賢く判断する、ってのは一見便利に見えるのですが、
ゆくゆくは微妙な所が出てきて、判断ルールをちゃんと把握する必要が出てきます
初心者向けだけど、使いこむとじゃじゃ馬っぷりが出てくるものは少なくありません

私自身は見えない文字が制御にかかわるってのは馴染めません
その辺はソースを見やすいように文法とは無関係に整形するためのもので、
それを文法が強制するというのは、ちょっと窮屈すぎると思います
引用返信 編集キー/
■29260 / inTopicNo.28)  Re[11]: 行末のセミコロンの省略
□投稿者/ .SHO (316回)-(2008/12/06(Sat) 12:41:52)
No29259 (出水 さん) に返信

> 続いてもいいし切ってもいい構文の時どちらに倒すか問題になります
> 改行を完全なデリミタとするのであれば、そんなに問題になりませんが、
> これは下位互換性を著しく損なうので、新規の言語でないと導入できないでしょう

改行をデリミタにするのは私も論外だと思います。
その前提で、どちらに倒すか問題になる具体例があると
凄くありがたいのですが。。。
引用返信 編集キー/
■29268 / inTopicNo.29)  Re[12]: 行末のセミコロンの省略
□投稿者/ 出水 (101回)-(2008/12/06(Sat) 14:57:47)
> その前提で、どちらに倒すか問題になる具体例があると
> 凄くありがたいのですが。。。

具体例ならすでに出ているじゃないですか…

引用返信 編集キー/
■29269 / inTopicNo.30)  Re[13]: 行末のセミコロンの省略
□投稿者/ .SHO (320回)-(2008/12/06(Sat) 15:18:17)
No29268 (出水 さん) に返信

> 具体例ならすでに出ているじゃないですか…

すいません。出てました。

#印刷して探してしまった^^;
#JavaScriptの話だと思って最後まで読んでませんでした。。。orz

引用返信 編集キー/
■29270 / inTopicNo.31)  Re[2]: 行末のセミコロンの省略
□投稿者/ .SHO (321回)-(2008/12/06(Sat) 15:48:07)
> throw
> new Exception();
> このコードの意味が変わらないような省略ルールでなければなりません.

この場合、throw; のように単独だと、new Exception(); は
「到達できないコード」として検出できるので
throw new Exception();
でいいような気もします。

まぁ「到達できないコード」はワーニングなので
throw;
new Exception();
でも、絶対ダメということはないのですが。。。
引用返信 編集キー/
■29271 / inTopicNo.32)  Re[12]: 行末のセミコロンの省略
□投稿者/ NyaRuRu (76回)-(2008/12/06(Sat) 16:04:55)
2008/12/06(Sat) 16:13:38 編集(投稿者)
No29260 (.SHO さん) に返信
> ■No29259 (出水 さん) に返信
> 
>>続いてもいいし切ってもいい構文の時どちらに倒すか問題になります
>>改行を完全なデリミタとするのであれば、そんなに問題になりませんが、
>>これは下位互換性を著しく損なうので、新規の言語でないと導入できないでしょう
> 
> 改行をデリミタにするのは私も論外だと思います。
> その前提で、どちらに倒すか問題になる具体例があると
> 凄くありがたいのですが。。。

とりあえず前の投稿で調べて分かっているのが以下の問題です.

≪パラメータを省略できる命令の問題≫
throw
new Exception();

≪後置演算子の記号が別の用途に使われている問題≫
ケース1. 丸括弧
{
   Func<string,string> f;
   string s;

   var a = f     // ここにセミコロンを挿入できてしまう
   (s+"!").ToString();
}

ケース2. 角括弧
(これは現在エラーとなるコードなので互換性の問題はありません)
{
    [AttributeUsage(AttributeTargets.All)]
    class DummyAttribute : Attribute
    {
        public DummyAttribute(string s)
        {
        }
    }

    class ListList : List<ListList>{}

    static class Program
    {
        static int Dummy(string s)
        {
            return 0;
        }

        static ListList _list = default(ListList);

        // 以下の (A) または (B) どちらか一方にのみ
        // セミコロンを挿入するとコンパイルが通る
        static ListList _s = _list   // (A)
        [Dummy("!")]                 // (B)
        static void Main(string[] args)
        {
        }
    }
}

C/C++ では中置演算子絡みの問題も作れますが,
今のところ C# で中置演算子を絡めた問題は構成できてないです.

引用返信 編集キー/
■29272 / inTopicNo.33)  Re[13]: 行末のセミコロンの省略
□投稿者/ .SHO (322回)-(2008/12/06(Sat) 16:11:05)
No29271 (NyaRuRu さん) に返信

> とりあえず前の投稿で調べて分かっているのが以下の問題です.

本当にありがとうございます!
土日でしっかり勉強させて頂きます。
引用返信 編集キー/
■29361 / inTopicNo.34)  Re[13]: 行末のセミコロンの省略
□投稿者/ .SHO (334回)-(2008/12/08(Mon) 20:40:09)
No29271 (NyaRuRu さん) に返信

>    Func<string,string> f;
>    string s;
> 
>    var a = f     // ここにセミコロンを挿入できてしまう
>    (s+"!").ToString();

これも、(s+"!").ToString(); は、コンパイルは通りますが
意味をなさないので f にくっつけてしまっていいように思えます。

引用返信 編集キー/
■29363 / inTopicNo.35)  Re[14]: 行末のセミコロンの省略
□投稿者/ NyaRuRu (78回)-(2008/12/09(Tue) 01:17:11)
No29361 (.SHO さん) に返信
> ■No29271 (NyaRuRu さん) に返信
> 
>>   Func<string,string> f;
>>   string s;
>>
>>   var a = f     // ここにセミコロンを挿入できてしまう
>>   (s+"!").ToString();
> 
> これも、(s+"!").ToString(); は、コンパイルは通りますが
> 意味をなさないので f にくっつけてしまっていいように思えます。

うーむ,"意味"ですか.

確かに,コードとして意味が無さそうな例をだしてしまったのは申し訳ないのですが,
かといって,意味がありそうな例が構成できないというわけでもないように思います.

戻り値を捨てている文を一律に「意味を成さない」というのは無理で,実際それは
メソッドの中のアクションというか副作用次第です.
世界のどこにも何の影響も残さないようなアクションなら,確かに意味を成しません.
しかし,世界のどこかに影響を残すなら,それは「意味を成しうる」ものです.

例えば StringBuilder クラスの多くのメソッドは,自分自身の内容を変更し,
戻り値としては自分自身の参照を返すようになっています.

var sb1 = new StringBuilder();
var sb2 = new StringBuilder()

(isFooBar() ? sb1 : sb2).AppendLine("Hello");

Console.WriteLine(sb1.ToString());
Console.WriteLine(sb2.ToString());

例えばこの (isFooBar() ? sb1 : sb2).AppendLine("Hello"); は,
丸括弧で始まって,戻り値を捨てているものの,アクションの効果を期待して
単独で使われても不思議ではないような例です.
こういうケースを自動で判別できないように思います.

引用返信 編集キー/
■29365 / inTopicNo.36)  Re[3]: 行末のセミコロンの省略
□投稿者/ 出水 (103回)-(2008/12/09(Tue) 05:36:38)
私が例を出さなかったのは、個々の例だけを見てこれがいい、これがだめという
議論の方向に持っていきたくないな、と思ったからです

ここで出された例をすべて決着したところで、すべての問題構文が洗い出されるわけじゃないです

で、どうすればいいかというと、BNF記法レベルで再構築すればいいんです
掲示板のネタとしては面白くない結論なのですが…
引用返信 編集キー/
■29378 / inTopicNo.37)  Re[4]: 行末のセミコロンの省略
□投稿者/ .SHO (336回)-(2008/12/09(Tue) 09:50:31)
No29363 (NyaRuRu さん) に返信
No29365 (出水 さん) に返信

> 意味がありそうな例が構成できないというわけでもないように思います.

はい。「なんとなく」と最初に書いたのは、私もそう思うからです。
ただ、意味のある例が1つも出ていない(いなかった)のと、私の
能力ではいい例が思いつかなかったので、1つでも意味のある例が
あればいいなと思った次第です。

> 私が例を出さなかったのは、個々の例だけを見てこれがいい、これがだめという
> 議論の方向に持っていきたくないな、と思ったからです

私も、個々の例の評価をしたいわけではないです。
ただ、上にも書いたように意味のある例が1個あれば、すんなり納得できる
んだけどということです。

ということで

> (isFooBar() ? sb1 : sb2).AppendLine("Hello");

この例はシンプルでわかりやすかったです。
ありがとうございました。
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -