D言語 Part 6

このエントリーをはてなブックマークに追加
932デフォルトの名無しさん:2005/07/27(水) 16:56:55
Elephantって標準では(build.exeでは)コンパイルオプションに-gがつけられないのか?
933デフォルトの名無しさん:2005/07/27(水) 18:39:09
>>927
 a[0..a.length] = i++;

 for(int i=0; i<a.length;){
  a[i] = i++;
 }
になると思うのは間違い。

 int tmp = i++;
 for(int i=0; i<a.length;){
  a[i] = tmp;
 }
どちらかといえばこっち。
934デフォルトの名無しさん:2005/07/27(水) 19:15:59
Child
{
 this()
 {
  (i)C=3
 }
}
935デフォルトの名無しさん:2005/07/27(水) 19:31:02
>>934
意図に気づくのに48時間費やした
936デフォルトの名無しさん:2005/07/27(水) 20:20:29
その間わずか15分
937デフォルトの名無しさん:2005/07/27(水) 20:29:52
ヒント:相対性理論
938デフォルトの名無しさん:2005/07/27(水) 23:04:27
>>933
どっちかと言うとこうだろ?

for(int j=0; j<a.length;j++)
 a[j] = i;
i++;

っていうか、思いっきり無限ループしてるじゃないか。
939デフォルトの名無しさん:2005/07/27(水) 23:12:23
>>938
jはiと見間違えるからkとか使ってくれよ。
というかj使うヤツ久しぶりに見た。
940デフォルトの名無しさん:2005/07/27(水) 23:30:11
ハァ?jぐらい普通に使うわ。
どんなフォントだ
941デフォルトの名無しさん:2005/07/27(水) 23:32:26
>>939みたいに言う香具師はさすがに初めて見たなw
942デフォルトの名無しさん:2005/07/27(水) 23:37:39
MS Pゴシックとか使ってるとアレだけどな。
プログラマなら、0に斜線の入ったフォント使ってるだろ、という意見もあるが。
943デフォルトの名無しさん:2005/07/28(木) 00:43:56
Bitstream Vera使っとけ
944927:2005/07/28(木) 00:45:55
いや、これが仕様だっていうなら納得するんだけど
本家の定義では

In general, (a[n..m] op e) is defined as:
for (i = n; i < m; i++)
  a[i] op e;

ということらしいから、>>927の結果は
a[0] = 0
a[1] = 1
  :
a[7] = 7
となるのが筋だと思うのよ
eが複数回評価されるのか、最初に1回だけ評価されるのかについては記述がないし
945デフォルトの名無しさん:2005/07/28(木) 00:52:21
記述がないなら筋もへったくれもないだろ
946デフォルトの名無しさん:2005/07/28(木) 00:59:18
右辺値の評価が終わり、左辺値の評価が終わり、インクリメント
って
オペレータの優先順位の話だから
代入の定義と関係ないんでないかな。
947デフォルトの名無しさん:2005/07/28(木) 00:59:55
「一般に」であって「絶対に」なわけじゃないし
948927:2005/07/28(木) 01:46:15
だからって右辺に左辺と同じ長さ・型の配列があったら右辺を毎回評価、
数値だけなら最初の1回だけ評価というのは不自然じゃないですかそうですか。

とか書こうとしたけどよく見たらこのあたりはまだ実装してないのね。
今後どうにかなってしまうことを期待します。
949デフォルトの名無しさん:2005/07/28(木) 02:40:17
>>948
一つ聞きたいけど、右辺が左辺と同じ長さ・型の配列なら毎回評価すると判断してる理由は何?
右辺が配列でも評価は一度しかしていないと思うけど。
int[]f(){printf("a\n");return new int[2];}
void main(){int[2]s;s[] = f();}
こういうコードを書いても一度しか表示しないし
950デフォルトの名無しさん:2005/07/28(木) 06:27:04
変に展開された形を想像するから毎回評価されるとか思うんだ。
見た目通り、式は1つなんだから評価後に1回インクリメントでいいじゃないか。
毎回評価させたければforなりで明示的にそう書けばいい。
951927:2005/07/28(木) 09:54:30
公式で挙げられてる例だと

b[] = a[] + 3;

というのが

for (i=0; i<a.length; i++)
  b[i] = a[i] + 3;

と「同等」なのであれば、これは右辺を毎回評価してることになりなせんか?
ってこの例、今のdmdではコンパイルできないんだけど。

あとforで明示的に書けばいいというのなら、配列のスライシング等を言語機能にする
意義がなくなると思う。
952デフォルトの名無しさん:2005/07/28(木) 10:03:51
問題なのはインクリメントがどうこうじゃなくて、クラスオブジェクトの配列を作りたいときに

SomeClass[8] a;
a[] = new SomeClass();

と書いたとき、実際にはインスタンスは一つしか作成してなくて
配列の要素は全部同じオブジェクトを指してるというのが感覚的に納得いかないのんです。
いたずらにfor文を書くより、最初から複数回評価される実装のほうが有益じゃないですか?
一回だけ評価させたいんであれば

SomeClass[8] a;
SomeClass t;
t = new SomeClass();
a[] = t;

と書けばいいわけだし
953デフォルトの名無しさん:2005/07/28(木) 14:40:53
変則的な式評価をするのは&& || , ?: だけでいいじゃん。
これ以上増やされると気持ち悪くてかなわん。
俺は右辺を複数回評価をするとか変な仕様になるよりも、
自分でfor文でも書くほうが明示的で分かりやすいと思う。
954デフォルトの名無しさん:2005/07/28(木) 23:39:28
>>944
> 配列へのデータセット
> 代入式の左辺にスライス、 右辺に要素型と同じ型の値が来ると、 左辺の配列の内容が全て 右辺の値にセットされます。
>
> int[3] s;
> int* p;
>
> s[] = 3;// s[0] = 3, s[1] = 3, s[2] = 3 と同じ意味
> p[0..2] = 3;// p[0] = 3, p[1] = 3 と同じ意味
配列へのデータセットについては rvalue について書かれているが、
「一般には」 a[] = e とあるように右辺は expression として扱われるということだと思う。
a[1..3] = b[4..7] は配列要素のコピーだし、ごっちゃごちゃだね。

>>952
それがそーいう機能じゃないのは結局そーいう機能がないのが悪いんだろ。
 foreach(3){
  arrayA[#] = arrayB[$-#-1];
 }

 array.foreach = { new Hoge };
ってのを今から仕様に追加しよーぜ。
955デフォルトの名無しさん:2005/07/29(金) 00:20:40
よう分からんけど
foreach(inout Hoge h;array)
    h = new Hoge;
で十分と思うけどなぁ。
956デフォルトの名無しさん:2005/07/29(金) 00:27:45
>>955
 foreach(inout Hoge h;array)
が長いのと、arrayの要素に対して操作しているということが
Hoge h のせいで直感的じゃないのが嫌な感じ。
957デフォルトの名無しさん:2005/07/29(金) 10:46:18
927キモイ。あとセンスがない。
958デフォルトの名無しさん:2005/07/29(金) 11:15:32
俺はそうは思わなかったけどな。

a[10..20] = new Hoge;

とかはスライシングで出来た方が良くないか?
959デフォルトの名無しさん:2005/07/29(金) 18:10:33
>>957
どっちにも同意・・・
960デフォルトの名無しさん:2005/07/29(金) 19:31:59
いろんな書き方が
出来るようになるのは、いいんじゃないの?

俺は、perl厨なので
for (1..3){$_}
for(arry){$_}系が
出来ると楽でいいんだけどな

927が責任をもってリクエストしておいてね

961デフォルトの名無しさん:2005/07/29(金) 19:41:34
一つの式の右辺値が複数回評価されるなんて、気色悪すぎなんだが、
そう思わない人もいるんだな、と思った。
962デフォルトの名無しさん:2005/07/29(金) 20:02:06
複数回評価する場合はこうするのはどうだろうか
a[10..20] = {new Hoge;};

…とかD学び始めたばかりの漏れが言ってみる
963デフォルトの名無しさん:2005/07/29(金) 20:30:10
そりゃ気持ち悪いけど、気持ち悪いってだけで判断しちゃだめだろ。
慣れれば普通かもしれないしな。
964デフォルトの名無しさん:2005/07/29(金) 21:31:59
Rubyならそこらへんの問題はとっくに解決してるのにね。
後発のくせにDって運子だね。
965デフォルトの名無しさん:2005/07/29(金) 22:02:58
akIDE 0.296が出てるね。
966デフォルトの名無しさん:2005/07/30(土) 00:03:09
>>964
evalのあるインタプリタと一緒にすんな

・・・と言いたいが便利そうだな、複数評価構文
967デフォルトの名無しさん:2005/07/30(土) 00:51:13
しかし#defineと同様の欠点を引きずるのはどうかと。<複数評価構文
968デフォルトの名無しさん:2005/07/30(土) 08:04:44
a[10..20] = new Hoge[10];
みたいなのはどうだろう
969デフォルトの名無しさん:2005/07/30(土) 08:25:10
>>968
ほほぅ
970デフォルトの名無しさん:2005/07/30(土) 09:23:59
文脈によってnew Type[n]の意味が変わるのは...
New!(Type).array(n)とかrange(n)みたいな
配列生成関数を作って使うのはだめなの?
字面はいまいちだけど。
971デフォルトの名無しさん:2005/07/30(土) 09:54:07
なんかもう収拾つかなそうだねこの言語は。
大切なのはバランス感覚なんだよ。
972デフォルトの名無しさん:2005/07/30(土) 10:46:28
>>971
収拾つかないのは、おれら
つくってる人はしっかりしていると思う
973デフォルトの名無しさん:2005/07/30(土) 13:50:46
そのうち導入する予定の配列リテラルに期待しよう。
974デフォルトの名無しさん:2005/07/30(土) 19:28:43
結論:JavaかC++でOK。
975デフォルトの名無しさん:2005/07/30(土) 22:23:31
>>974
馬鹿発見
976デフォルトの名無しさん:2005/07/31(日) 04:56:12
>>975
馬鹿発見
977デフォルトの名無しさん:2005/07/31(日) 07:27:02
>>974=976
m9(^д^)プギャーッ
空気嫁ねー奴はすっこんでろ
978デフォルトの名無しさん:2005/07/31(日) 08:47:10
話戻すが

>>973
連想配列リテラルのこと?
979デフォルトの名無しさん:2005/07/31(日) 10:37:34
公式の項future
> 3. Array literal expressions.
どんなものかは知らない。
980デフォルトの名無しさん:2005/07/31(日) 11:27:20
一般的な a[] op e; のことでしょ。多分。
981デフォルトの名無しさん
>>980

Newsgroupsの提案記事で読んだ記憶があるのは、例えば、
a[] = [1,2,3,4]とか、b[3..6]=[i,j,k]とかそんな感じのものだった。