Pythonに見られるインデントによる制御構造の是非

このエントリーをはてなブックマークに追加
553デフォルトの名無しさん
例外使わない?
554デフォルトの名無しさん:2008/02/09(土) 12:19:44
>>553
俺も例外使う。例外ならforループどころか関数の壁を越えてbreakできる。
555デフォルトの名無しさん:2008/02/09(土) 12:23:23
556デフォルトの名無しさん:2008/02/09(土) 13:55:24
まぁさ、例外あるような言語ではgotoいらないかもしれないけど、
Cとかだと普通に使うよ?
557デフォルトの名無しさん:2008/02/09(土) 14:28:31
いや,普通には使わないわ(ww
558デフォルトの名無しさん:2008/02/09(土) 14:35:39
>>557

そう?ファンクショントレース埋め込むときとか、以下のように
エラーの場合、リソース開放して戻るときとか頻繁に使うなぁ。
{
  A *a = NULL; B *b = NULL; C *c = NULL; int result = E_UNKNOWN;

  if ((a = A_new()) == NULL) {
    result = E_MEM; goto END_FUNC;
  }
  if ((b = B_new()) == NULL) {
...

END_FUNC:
  if (a !=NULL && result != E_SUCCESS) {
    A_free(a);
  }
  ...
}
559デフォルトの名無しさん:2008/02/09(土) 15:58:34
まぁスコープ抜けるときにデストラクタが呼ばれる言語だったり、
アスペクト指向言語だったら、こんなgotoはいらないのだけどさ。
560デフォルトの名無しさん:2008/02/09(土) 16:00:10
>>559 つーか単にGC付きならそれでいいのでは。
561デフォルトの名無しさん:2008/02/09(土) 16:11:47
>>560
ファンクショントレースしこむには、スコープぬけるときにデストラクタ
よばれるか、アスペクト指向じゃなければ難しいんじゃない。
アーキテクチャに依存しないように仕込むには。

2007/07/11 10:10:10:[TRACE]FuncA IN (args=...)
2007/07/11 10:10:10:[TRACE]FuncA out (result=0)

てな感じに。
562デフォルトの名無しさん:2008/02/09(土) 16:22:19
>>561
その程度ならtry:finally:があれば十分じゃん…
563デフォルトの名無しさん:2008/02/09(土) 16:25:54
>>562
try:finallyで仕込むのメンドイでしょ。gotoと大して変わらないし。
アスペクト指向が一番楽だけど。
564デフォルトの名無しさん:2008/02/09(土) 16:30:13
>>563
try:finally:がgotoと変わらないって…
gotoでは関数内で例外が発生した時の振舞いがまるで違うんだけど…
565デフォルトの名無しさん:2008/02/09(土) 16:34:17
>>564
いや議論がごっちゃになってるのだけど。ロギングに例外機構を
使用しようとするところもおかしいし、例外の振る舞いとgoto
をごっちゃにするのもおかしい。
566デフォルトの名無しさん:2008/02/09(土) 16:37:56
>>565
> ロギングに例外機構を
> 使用しようとするところもおかしいし、

全然おかしくない。
try:finally:はtry:句から抜ける時を捕まえるという、
まさにトレースにぴったりの機構だろ。

> 例外の振る舞いとgoto
> をごっちゃにするのもおかしい。

例外が発生した時にOUTの記録を残せないトレースなんて
役に立たないと思う。
567デフォルトの名無しさん:2008/02/09(土) 16:39:39
元の議論は、gotoが必要な時があるかどうか。
>>558が提示したケースもgoto無しで十分対応できることが示された以上、
もうその時点で議論の結着はついていると思われ。
568デフォルトの名無しさん:2008/02/09(土) 16:40:28
coreutilsとかLinuxのカーネルとか見ると、gotoって便利だなと思わないか?
569デフォルトの名無しさん:2008/02/09(土) 16:46:29
>>566
try finallyは例外を捕まえるための機構であって、ファンクション
トレースのための機構ではない。

デストラクタでロギングするほうがよっぽどスマート。try finally
に依存したロギングよりも。そしてアスペクト指向のほうが
デストラクタロギングよりももっとスマートだといっているのだよ。
570デフォルトの名無しさん:2008/02/09(土) 16:46:44
>>568
CとPythonでは言語の抽象度がまるで違うんだから、
coreutilsだのLinux kernelだのは参考にならない。

Cでtry:finally:と同等な機構を仕込むのがどれだけ大変かわかるか?
571デフォルトの名無しさん:2008/02/09(土) 16:48:29
>>569
> try finallyは例外を捕まえるための機構であって、

いいえ、全然違います。ひょっとしてtry:except:と勘違いしている?

> デストラクタでロギングするほうがよっぽどスマート。

デストラクタはオブジェクトの解放をする機構であって、
ロギングのための機構ではない。
572デフォルトの名無しさん:2008/02/09(土) 16:50:24
言語に備わっているものは自由に使えばいいじゃん。
(俺)ルールが決まっていれば混乱することもない。
573デフォルトの名無しさん:2008/02/09(土) 16:52:32
558はせっかくPythonが提供している仕組みを無視して
Cの原始的なやり方を押し通そうとしているように見える。
574デフォルトの名無しさん:2008/02/09(土) 16:56:40
いや、もともとCの話だったのだけど・・・。まぁPythonのようなクソ言語使ってないけど。
575デフォルトの名無しさん:2008/02/09(土) 16:59:35
ならpythonスレに来なきゃいいのにw
576デフォルトの名無しさん:2008/02/09(土) 17:05:22
寂しかったんだろ。
こういう態度じゃ,友達もいないだろう。
577デフォルトの名無しさん:2008/02/09(土) 17:07:46
このスレはオフサイドルールについて議論するためのスレであって
たまたま1がPythonしか知らなかったのだと思うわけだが。

しかしオフサイドルールの話題ですらないな。
578デフォルトの名無しさん:2008/02/09(土) 17:20:17
>>570
>556 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 13:55:24
>まぁさ、例外あるような言語ではgotoいらないかもしれないけど、
>Cとかだと普通に使うよ?
>557 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:28:31
>いや,普通には使わないわ(ww

ここから始まった話題なので、
今に限ってはCのgotoの話をしている。pythonは今のトピックにおいて関係なし。
Cは例外ないから>>558がgotoなしで書けるという話も決着がついてない。
ここで例外使えばいいという指摘自体が的外れ。
まあ実際gotoは無くてもいいが、あると遥かリソース開放とかは便利。
むろんGCとか例外とかがあればそっちのが便利だが。