5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

D言語 Part12

1 :デフォルトの名無しさん:2007/02/10(土) 01:09:54
プログラミング言語 D について語るスレッドです。
過去スレは >>2

■本家
ttp://www.digitalmars.com/d/
ttp://www.kmonos.net/alang/d/ (和訳)

■コンパイラ
ttp://www.digitalmars.com/d/dcompiler.html (DMD, 本家)
ttp://dgcc.sourceforge.net/ (GDC, gccフロントエンド)
ttp://gdcmac.sourceforge.net/ (GDCのmac用バイナリ)

■参考URL
ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究)
ttp://dsource.org/ (dsource)

2 :デフォルトの名無しさん:2007/02/10(土) 01:10:56
■過去スレ
Part11 http://pc10.2ch.net/test/read.cgi/tech/1165621441/
Part10 http://pc8.2ch.net/test/read.cgi/tech/1158013550/
Part 9 http://pc8.2ch.net/test/read.cgi/tech/1146656260/
Part 8 http://pc8.2ch.net/test/read.cgi/tech/1137068104/
Part 7 http://pc8.2ch.net/test/read.cgi/tech/1122912733/
Part 6 http://pc8.2ch.net/test/read.cgi/tech/1109933426/
Part 5 http://pc5.2ch.net/test/read.cgi/tech/1102785854/
Part 4 http://pc5.2ch.net/test/read.cgi/tech/1091185216/
Part 3 http://pc5.2ch.net/test/read.cgi/tech/1079068715/
Part 2 http://f3.aaacafe.ne.jp/~null/cache/1079280501.html
Part 1 http://pc5.2ch.net/tech/kako/1003/10036/1003674814.html

3 :デフォルトの名無しさん:2007/02/10(土) 01:35:59
いちもつ

4 :デフォルトの名無しさん:2007/02/10(土) 06:18:03
もつもつ

5 :デフォルトの名無しさん:2007/02/11(日) 08:08:53
mixin("いちおつ");

6 :デフォルトの名無しさん:2007/02/11(日) 08:22:34
D言語ってJavaのJFrame並に簡単にGUI作れる?

7 :デフォルトの名無しさん:2007/02/11(日) 10:36:28
GUIビルダみたいなのは見たこと無し。

Frame frame = new Frame();
frame.children ~= new Label("UserID:");
frame.children ~= new TextBox();
Application.run(frame);

くらいの簡単さならDWTあたりが多分可能。

8 :デフォルトの名無しさん:2007/02/11(日) 14:28:08



9 :デフォルトの名無しさん:2007/02/11(日) 16:32:14
>>7
ttp://www.dprogramming.com/entice.php

10 :デフォルトの名無しさん:2007/02/12(月) 00:49:18
char[] otu = ">>1乙";
mixin(`printf("` ~ otu ~ `");`);

11 :デフォルトの名無しさん:2007/02/12(月) 01:03:52
1.005のchangelog見たら萎えたw

12 :デフォルトの名無しさん:2007/02/12(月) 01:47:59
そこでむしろおっきしないと

13 :デフォルトの名無しさん:2007/02/12(月) 02:59:43
import std.stdio;

class A {
  int onApply(int delegate(inout int) yield) {
    return yield(1);
  }
}

void main() {
  foreach(n; new A) {
    writefln("%d", n);
  }
}

> foreach(n; new A) {
で n の型を推論できないと言われるんだが、
onApply の型から推論できるようにした方がいいよね?
単に未実装なだけ?

14 :デフォルトの名無しさん:2007/02/12(月) 03:03:53
しまった。opApply じゃなくて onApply になってた・・・。

15 :デフォルトの名無しさん:2007/02/12(月) 05:06:41
// app.d
import std.stdio, std.random, std.c.time;

class App {
 abstract void run();

 static void run(lazy App app) {
  rand_seed(time(null), 10);

  try {
   app.run();
  } catch(Exception e) {
   writefln("Exception: %s", e.msg);
  }
 }
}

// main.d
import app;

class AppHoge : App {
 // this() { throw new Exception("hoge"); }
 void run() {
  writefln("hoge");
 }
}

void main() {
 App.run(new AppHoge);
}

lazy のおかげで、AppHoge のコンストラクタで例外が投げられてもちゃんと catch されるね。

16 :デフォルトの名無しさん:2007/02/12(月) 06:16:20
unittest で「必ず例外が投げられる処理」を実行して、
例外が投げられたらそのまま実行を続け、
例外が投げられなかったら assert する、ということをしたいのですが・・・

先ず、try-catch-finally 文に
「例外が投げられなかった場合」の処理をする部分がないので、
実装にフラグが必要になってエレガントでないのと、
コールスタックのダンプの方法が分からないので、
その処理を関数化してしまうと、エラー箇所を表示するのに
引数に __FILE__ と __LINE__ を渡す必要が出てきます。

void mustThrow(lazy void expr, char[] filename, int line) {
 bool thrown = false;
 try {
  expr;
 } catch {
  thrown = true;
 }
 if(!thrown) {
  writefln("No exception was thrown: %s(%d)", filename, line);
  assert(false);
 }
}

前者の問題(エレガントでない)はともかくとして、
後者の問題(__FILE__, __LINE__ をいちいち指定する必要がある)は何とかなりませんか?

コンパイラ: GDC 0.22 for Mac OS X, based on DMD 1.004

17 :デフォルトの名無しさん:2007/02/12(月) 06:36:50
DMD1.005なら、こうもできるみたいだが http://d.hatena.ne.jp/shinichiro_h/20070208
"あのmixin"が無いなら、__FILE__を付けるのはどうしようもない希ガス。

あと、
 try { 
  expr; //どうせここでcatchに飛ぶはず
    assert(false);
 } catch { 
  ...
 } 
とかやってもいいんじゃないかと思った。
まともに動くかどうかは試してないから分からないけど。


18 :デフォルトの名無しさん:2007/02/12(月) 06:39:35
それだと assert(false); の例外が catch されてしまうのです。
expr が AssertError を投げる可能性を考えると、
catch(AssertError) で catch することもできませんし。

素直に DMD 1.005 対応の GDC を待つしかないようですね・・・。

19 :デフォルトの名無しさん:2007/02/12(月) 06:53:46
ひとつ閃いた。

bool throws(lazy void expr) {
 try {
  expr;
 } catch {
  return true;
 }
 return false;
}

void error() {
 throw new Exception("hoge");
}

void main() {
 assert(throws(error()));
 assert(throws(0));
}

二段階になるのがちょっとイマイチだけど、
それはそれで分かりやすい気もするのでこれでいいかも。

20 :デフォルトの名無しさん:2007/02/12(月) 07:21:27
scope(success)

21 :デフォルトの名無しさん:2007/02/12(月) 07:25:15
その発想はなかったわ

22 :デフォルトの名無しさん:2007/02/12(月) 07:41:53
expr の例外を catch すると scope(success) の条件外になり、
さもなくば expr の例外が外に漏れちゃって・・・

23 :デフォルトの名無しさん:2007/02/12(月) 08:06:44
ややこしいな

24 :デフォルトの名無しさん:2007/02/12(月) 08:27:38
悪名高い

for(int i = 0; i < 10; ++i) {
 ...
}

みたいなループは D でも for 使わないとダメ?
まあ、foreach(i; new Range(10)) { ... } みたいにできる Range は定義できるけど、
どうも -O3 でも遅いみたいだし・・・。

いっその事、foreach(i; 10) { ... } がその代わりになるように
言語仕様の変更を提案した方がいいんだろうか。
foreach(i; 2, 10, 2) で 2 から 10 まで 2 つごとに・・・とか。

25 :デフォルトの名無しさん:2007/02/12(月) 09:15:35
>悪名高い

kwsk


26 :デフォルトの名無しさん:2007/02/12(月) 09:19:38
ん? いや、C 教えた時によく
for 文分かりにくいー、とか言う人いるじゃん?

27 :デフォルトの名無しさん:2007/02/12(月) 09:30:42
お前のまわりだけだろ

28 :デフォルトの名無しさん:2007/02/12(月) 09:45:15
C 風の for 文を敢えて採用しない言語がちらほらあるのは、
C 風の for 文での指定回数ループが直感的じゃないからだぜ。

29 :デフォルトの名無しさん:2007/02/12(月) 09:47:36
直感的ではないがあれは便利だ

30 :デフォルトの名無しさん:2007/02/12(月) 09:56:51
まあ、便利だから、それはそれで別にあっていいんだけど、
foreach(i; 10) { ... } とかできたらさらに便利じゃない?

31 :デフォルトの名無しさん:2007/02/12(月) 10:37:20
foreach(i;createArray(10)){
 ...
}

int[] createArray(int n){
 int[] array;
 array.length = n;
 for(int i=0;i<n;i++)
  array [n]= i;
 return array;
}

とかやっとけば?

32 :デフォルトの名無しさん:2007/02/12(月) 10:57:56
いや、だから、やろうと思えばやれるけど、
最適化しても遅いからなんだかなあと・・・。

33 :デフォルトの名無しさん:2007/02/12(月) 11:11:32
んじゃmixinで配列リテラル生成しとくとかどうよ。
mixinよく判らんから例出せんけど、できるんじゃないかな。

34 :デフォルトの名無しさん:2007/02/12(月) 11:22:58
配列リテラルじゃ最適化しようがないから遅いじゃん?

35 :デフォルトの名無しさん:2007/02/12(月) 11:22:58
>>30
ぱっと見、直感的に見えるかもしれないけど、
変数で指定すると異様になるよ。


36 :デフォルトの名無しさん:2007/02/12(月) 11:24:27
変数か・・・。確かに aggregate 用の foreach と紛らわしいか。
作るなら別文法か?

37 :デフォルトの名無しさん:2007/02/12(月) 11:56:46
新しい文法を導入してまでforを置き換えるメリットはないね

38 :デフォルトの名無しさん:2007/02/12(月) 12:04:04
mixinを使うと...わかりにくいなこれ。

import std.metastrings;
template times(int n,char[]code){
    const char[]times=
        Format!(`cast(void)&null[
            ((){
                for(int __dollar=0;__dollar<%s;++__dollar)
                    {%s};
            }(),0)];`,
        ToString!(n),
        code);}
void main(){
    mixin(times!(10,`printf("%d\n",$);`));
}


39 :デフォルトの名無しさん:2007/02/12(月) 12:40:59
普通に
foreach(i; 1..10)
 write(i);
ってかけたらいいんじゃね?

40 :デフォルトの名無しさん:2007/02/12(月) 12:55:05
そこでrange型の導入ですよ


41 :デフォルトの名無しさん:2007/02/12(月) 13:16:28
ちうか、こういうのは匿名メソッドで条件指定できるのが一番いいんだがなあ。。。
C#のpredicateみたいな。
そうなってくるとyield構文もほしくなる・・・。

42 :デフォルトの名無しさん:2007/02/12(月) 15:47:35
ほらほら、Rubyから色々取り入れようよ、とRubyの好きな俺。

範囲型とブロックで(1..10).each(){ |i| hoge(i); }とか。
onApplyReverseとかforeach周りの妙な仕様が整理できるぜぇ。

43 :デフォルトの名無しさん:2007/02/12(月) 16:05:39
Rubyだったら10.times{|i|...}だろw

44 :デフォルトの名無しさん:2007/02/12(月) 17:20:04
void times( int[] n, void delegate(int) yield ) {
 for(int i=0; i<n[0]; ++i)
  yield(i);
}

void main() {
 [10].times((int i){
  printf("%d\n", i*i);
 });
}

うそですごめんなさい

45 :44:2007/02/12(月) 17:24:25
てか普通にPythonと同じやり方でいいんじゃね?
struct xrange {
 int limit;
 static xrange opCall(int limit) { xrange self; self.limit=limit; return self; }

 int opApply( int delegate(inout int) dg ) {
  for(int i=0; i<limit; ++i)
   if(int r = dg(i))
    return r;
  return 0;
 }
};

void main() {
 foreach(i; xrange(10))
  printf("%d\n", i*i);
}

46 :デフォルトの名無しさん:2007/02/12(月) 17:44:19
class Range {
static Range t;

static this() { t = new Range; }

static Range opSlice( int n, int m ) {
t.start = n; t.end = m;
return t;
}

int opApply(int delegate(inout int) dg) {
int result;
for (int i = start; i < end; i++) {
result = dg(i);
if (result) break;
}
return result;
}

int start, end;
}

void main() {
foreach (i; Range[3..8])
writefln(i);
}
既出ですかそうですか

47 :デフォルトの名無しさん:2007/02/12(月) 17:54:36
ム板でインデントを認識、表示して欲しいなぁとかスレ違い

48 :デフォルトの名無しさん:2007/02/12(月) 18:02:12
ループはfor文で十分。

>>47
インデント対応した2chブラウザ使えばいい。

49 :デフォルトの名無しさん:2007/02/12(月) 18:03:17
int main()
{
  writefln("こうするのは面倒だしね");
  return 0;
}


50 :デフォルトの名無しさん:2007/02/12(月) 18:05:23
貼る時全角に痴漢すれば

51 :デフォルトの名無しさん:2007/02/12(月) 18:10:19
>>50
置換するなら&nbsp;で良いんじゃ?

52 :デフォルトの名無しさん:2007/02/12(月) 18:16:57
慣れるとインデントなしで読めるようになる

困るのは Python とかかな


53 :デフォルトの名無しさん:2007/02/12(月) 18:30:17
>>49
それだと結局コピペ時には&#160;ってなるから、
&#32;の方を使ってくれた方がありがたい。

54 :デフォルトの名無しさん:2007/02/12(月) 18:31:24
foreach(int i; Range(2001, 2010)){ writefln(i); }
Range(2010, 2061).each((int i){ writefln(i); });
等々。

かなりRubyぽいところまで出来るけど、
やっぱりforeachキーワードや引数の呪縛から逃れたいなぁ。

55 :デフォルトの名無しさん:2007/02/12(月) 21:05:11
引っ張って悪いんだがインデント対応の2chブラウザってあるのか?
Jane使ってるんだけど実はできたりする?

56 :デフォルトの名無しさん:2007/02/12(月) 22:04:49
そのぐらいD言語で作れ

57 :デフォルトの名無しさん:2007/02/12(月) 22:48:37
>>45
それ、遅いのよね。-O3 でも。

>>39 はいい感じの文法だと思う。
というか、それも妄想してたんだ、そういや。

58 :デフォルトの名無しさん:2007/02/12(月) 23:00:10
foreachで回すことはできないけれど
1,2,3,...という連番アクセスが必要、
ってのはどういう状況があるだろうか。

ずるずると既存の機能を拡張してくのは
なんか微妙な感じがするから、もっと
個々の用途に即した形の機能が追加される
方がよい気がする。

59 :デフォルトの名無しさん:2007/02/12(月) 23:21:59
指定回数だけ同じ処理を実行したい場合とか、
配列の要素数より少ないだけ回したいときとか。

60 :デフォルトの名無しさん:2007/02/12(月) 23:30:44
後者はスライス使える。
最適化も効くみたいだ。

61 :デフォルトの名無しさん:2007/02/12(月) 23:45:45
スライスで前の方を削ると
インデックスがずれるので面倒っちい

62 :デフォルトの名無しさん:2007/02/13(火) 00:08:38
>>59
前者はカウンタ要らないから指定回数実行の構文があればその方が直感的かなと思う。

>>61
それは使ってて結構強烈に感じた。
配列の一部だけ回すって結構需要ありそうな気がするんだが。まー具体例は思いつかん。

63 :デフォルトの名無しさん:2007/02/13(火) 00:26:01
ペアで扱う場合に先頭1つだけループから外すとか。
もう片方のループの範囲を決めるのにそのインデックスが必要になるから、
そっちもずらさにゃいかんなる。

64 :デフォルトの名無しさん:2007/02/13(火) 00:33:28
foreach(i, n; array[1..array.length])
 foreach(j, n; array[0..i+1]) // ← ここで + 1 が必要
  ...

↓こっちの形なら不必要。ただ、j を使いたい場合にインデックスがおもっくそズレる。

foreach(i, n; array[0..array.length-1])
 foreach(j, n; array[i+1..array.length])
  ...

65 :デフォルトの名無しさん:2007/02/13(火) 00:49:39
「制御構造」を関数化(モジュール化)するスマートな方法は、て感じか。

「モジュールにdelegate渡してコールバックしてもらう」に
型推論+無名デリゲートまで組み合わせれば
既にかなりのことが出来ると思うんだけど。

それでも残る問題は、パフォーマンスと微妙な読みづらさ?

# あと、foreach特別扱いされすぎだろと思う……

66 :デフォルトの名無しさん:2007/02/13(火) 01:01:51
折角ネイティブ言語でちゃんと最適化もすることをウリにしてるんだし、
パフォーマンスと書きやすさ読みやすさの両立は欲しいね。

現状は、foreach+スライスよりは、
for の方が読みやすいし使いやすい感じか?

67 :デフォルトの名無しさん:2007/02/13(火) 01:05:53
(a..b)とは別に(a...b)がほしいな。意味はRubyと逆でもいいから。

68 :デフォルトの名無しさん:2007/02/13(火) 01:09:57
あと単純に、range型が欲しい、という要望も混ざってるかな。今の話では。

69 :デフォルトの名無しさん:2007/02/13(火) 01:28:38
foreach(i, 0, 10; null) ...
foreach(i, 0, 10, n; array) ...

こういうのでいい気がしてきた。

70 :デフォルトの名無しさん:2007/02/13(火) 01:29:46
前者はもう foreach(i, 0, 10) でいいか。

71 :デフォルトの名無しさん:2007/02/13(火) 01:45:45
foreach(i : 5..10; array)
foreach((i, j) : (0, 0)..(5, 10))
n次元ベクトルを走査できるぜw

72 :デフォルトの名無しさん:2007/02/13(火) 02:29:13
opApply との整合性も考慮する必要があるんだよな。
範囲指定があると、その範囲を引数に追加・・・という事になるんだろうけど、
int opApply(int delegate(inout size_t i, inout T n) dg, range rng) { ... }
この range がどちらの引数と対応しているかって問題がある。

先頭から対応させていくという制限をかければ、
rng は i と対応することになる。
そうすれば >>71 みたいなことが実現できそうだ。

class T[] { // 内部実装のイメージとして捉えて
 int opApply(int delegate(inout size_t, inout T) dg, range rng) {
  for(size_t i = rng.first; i <= rng.last; ++i) {
   int res = dg(i, elems[i]);
   if(res != 0) return res;
  }
  return 0;
 }
}

n 次元の場合は foreach(i : 0..5, j : 0..10) ... としたのでいい気がする。

73 :デフォルトの名無しさん:2007/02/13(火) 03:00:02
forくらい使いこなせよ・・・

74 :デフォルトの名無しさん:2007/02/13(火) 03:03:07
そういう問題じゃないだろ・・・

75 :デフォルトの名無しさん:2007/02/13(火) 07:11:59
for(int i; range(0, 10)){

}

int[] range(int a, int b){
int[] hoge = new int[b - a + 1];
for(int i = 0; i < hoge.length; i++){
hoge[i] = a + i;
}
return hoge;
}

76 :デフォルトの名無しさん:2007/02/13(火) 07:24:52
ループの予感。色んな意味で。

77 :デフォルトの名無しさん:2007/02/13(火) 07:39:34
最適化とかよくわからないんだけど

たとえば上で言ってるみたいに

foreach(i : 5..10, j : 3..5) {
    ...
}

こういう構文があったとしてそれを使った場合と

for(int i = 5; i < 10; i++)
    for(int j = 3; j < 5; j++) {
        ...
    }

という風に書いたのではやっぱり前者のほうがより効果的な最適化を期待できるの?

78 :デフォルトの名無しさん:2007/02/13(火) 07:47:52
前者が後者に最適化されればそれで十分。
あとは読みやすさや書きやすさ、学習しやすさや保守しやすさ等の問題。

for だと何度も同じ変数が出てきて、変数名変えるの面倒だとか、
初心者に意味を教えるのが面倒だとか、直感的じゃないとか、
まあ色々不満があるから、それを解消できればいいな、と。

79 :デフォルトの名無しさん:2007/02/13(火) 07:52:34
foreach(int i; range(0, 10)){
 :
}

int[] range(int start, int end, int step = 1){
 int[] array = new int[(end - start) / step + 1];
 for(int i = 0; i < array.length; i++){
  array[i] = start + i * step;
 }
 return array;
}


80 :デフォルトの名無しさん:2007/02/13(火) 07:54:39
配列の生成は超遅いんで、
opApply を持ったオブジェクトを返す実装にした方がいいけど、
それでも for には負ける。

81 :デフォルトの名無しさん:2007/02/13(火) 08:05:52
よくわからんなぁ。
BASIC風の
FOR I = 1 TO 10 STEP 2
のほうがC式よりマシってことか?

効率面で言えば、ループの度に関数呼び出しが発生するような
方式は遅くて当たり前だろ。話にならない。
C式のforループなら比較、インクリメント、ジャンプしかしないし
ループカウンタがレジスタに乗ることが期待できるからな。

学習しやすさ分かりにくさってのは正直疑問なんだが。
Cのシンタクスが美的であるかどうかはともかく、Cの後継言語は
現実問題としてありふれてるし、皆使い慣れてるだろ。
別に言うほど分かりにくいわけでもないしな。

82 :デフォルトの名無しさん:2007/02/13(火) 08:13:16
#define range(a, b, c) int i = a; i <= b; i +=c

for(range(0, 10, 2)){

}


83 :デフォルトの名無しさん:2007/02/13(火) 08:13:43
Dのコンパイラは短い関数のインライン化はしてくれないんだっけ?

84 :デフォルトの名無しさん:2007/02/13(火) 08:30:53
>>81
マシってこと。

効率面に関して話にならないのは当たり前じゃなくて、
opApply を使った方法が最大限 inline 化されて最大限最適化されれば
for ループと同じとこまで最適化される可能性はあると思う。
ただ、現状ではそこまで最適化されないようだし、
だからこそ「言語的に」サポートされて欲しいなあ、と。

あと、for 文がそんなにスバラシイんだったら
foreach 文なんて誰も同時に採用しない。
for 文がなくてもいいとは言わんが、
「もっと便利な方法考えられるけど、
 使い慣れてるから使いにくくてもオーケー」
というのは、ガンガン機能アップしていこうぜ的な
D 言語の雰囲気と反するんじゃないかね。

85 :デフォルトの名無しさん:2007/02/13(火) 08:32:56
引数付きマクロがDにあればいいんだろ?

86 :デフォルトの名無しさん:2007/02/13(火) 08:33:56
マクロはダメだろう。
常識的に考えて。

87 :デフォルトの名無しさん:2007/02/13(火) 08:41:57
writefln = "aaa";
まじでコレ通るじゃん

ええんか?

88 :デフォルトの名無しさん:2007/02/13(火) 08:49:42
987 名前:デフォルトの名無しさん [sage] :2007/02/10(土) 01:14:43
int foo(int hoge) { ... }

foo = 2; // foo(2); になる

プロパティじゃなくてもこうなるんだけど、
正直これってどうなんだろうな。

988 名前:デフォルトの名無しさん [sage] :2007/02/10(土) 01:33:11
プロパティとの明確な区別が無いから今のところはしょうがない


ということらしい。
ええんか?

89 :デフォルトの名無しさん:2007/02/13(火) 09:12:46
良いんじゃない?
あえてそのコードを書く必要性もないわけだし

90 :デフォルトの名無しさん:2007/02/13(火) 09:20:37
でもキモイヨー。

そういや、Ruby の attr_accessor みたいに
プロパティを自動的に作ってくれるようなものはあるの?

91 :デフォルトの名無しさん:2007/02/13(火) 09:30:31
だから
property int x(){

}
とかにしろと

92 :デフォルトの名無しさん:2007/02/13(火) 09:34:41
キーワードが増えるのがお気に召さないんだろうかね。

93 :デフォルトの名無しさん:2007/02/13(火) 09:34:50
仕様いじくりまわして使えなくしてしまおうという
スパイの陰謀にしか思えない

94 :デフォルトの名無しさん:2007/02/13(火) 09:53:19
どこのスパイだ

95 :デフォルトの名無しさん:2007/02/13(火) 09:57:16
Microsoft

96 :デフォルトの名無しさん:2007/02/13(火) 10:04:30
Jで始まる言語に関わる会社だな。

97 :デフォルトの名無しさん:2007/02/13(火) 10:17:55
やっぱ問題は速度じゃ無いよなぁ。>>81の言うとおりだし。
可読性とか重複の排除とかそういう点を追求したい。
速度なんてユーザが違和感を感じなきゃそれでイイ、って分野では、ね。

>>57
遅いのは仕方ない。スピード追求したけりゃ可読性を犠牲にして普通のfor使おう。
まぁ、気にするほど可読性落ちやしないさ。for文にはCから引き継いだ「慣れ」があるし。
あと、>>39は確かに可読性はイイが、文法を拡張するとなると、そこまでは……と思う。

というか、みんなforeachステートメント前提に考えすぎじゃないか?
foreachの基礎になってるのはdelegateのパラメータ渡しなんだから、
その際に利用者にdelegateキーワードを見せない、って方向の方がいい。
Let's言語拡張妄想。

Range[2004..3000].step(4) : (int year){ // Rangeオブジェクトは>>46を拝借
 orimpicPlaceTable[year].doOrimpic();
}
class Range{
 void step(int stepValue, void delegate(int) yield){ /* 実装略 */ }
 // いっそ void step(int stepValue) : (void delegate(int) yield){ /* */ } てのも……
}

98 :デフォルトの名無しさん:2007/02/13(火) 10:29:28
可読性で気になるのは、
こっちでは foreach 使って、
こっちでは似た処理だけど foreach 使えないから for 使って、
っていう風な場合もかな。
統一性がないというか何というか。
使い分けに深い意味があるのかと思いきや、
言語的な制限から仕方なく、とかなるのがね。

>foreach前提
単なる回数ループだと foreach にする必然性はないかもしれないけど、
配列の一部だけ foreach したい場合とかは foreach にする必然性はあるね。
別のものをもってくると、可読性が落ちるけど、
かといって現状の foreach だとスライスするしかなくて、
それだと 0 からスライスする場合でないとインデックスがずれてしまって・・・と。

99 :97:2007/02/13(火) 10:42:13
アレ? 文章考えてる間にだいぶ進んでた罠。

>>84
私ゃコンパイラの最適化実装なんてさっぱりなんですが、
ホントに最大限のinline化とか期待できるんでしょか。
onApplyが受け取るのがdelegateである以上
delegateをinline展開せにゃならんってことだと思うのだけど、
何となく、それは難しい事だと思ってたんですが。

# それでも、Walterならきっと何とかしてくれる……! とかちょっと期待も。

100 :デフォルトの名無しさん:2007/02/13(火) 10:45:58
んまあ、あくまで最大限の最適化ってことで・・・。
そして、それを要求するよりは、言語的に実装する方が楽そうだ、と。

101 :デフォルトの名無しさん:2007/02/13(火) 11:00:56
Range[2004..3000].step(4) = (int year){
 orimpicPlaceTable[year].doOrimpic();
};

ってね。
できなくもなさそう。テストはしてない。

要はdelegateを渡すのに
func({
 Statement;
});
こんな{}のが邪魔なだけだと思った。

102 :デフォルトの名無しさん:2007/02/13(火) 11:01:50
>>98
rubyだとArrayのeachとeach_indexが微妙に統一感がない。each_with_indexとかさらに。

103 :デフォルトの名無しさん:2007/02/13(火) 11:20:47
>>101
何か Ruby のイテレータっぽいね。
類する文法は作れそうな予感。
今でも似た事は無理矢理できそうだけど。

>>102
まあ、Ruby は動的型言語で
オーバーロードできないからね・・・。
そのあたりは仕方がない気がする。
まあ、引数の個数で呼び分けくらいはして欲しいんだけど。

104 :デフォルトの名無しさん:2007/02/13(火) 11:25:51
foreach(int sliceIndex, int num; array[10..20])みたいに書けなかった……よね。

10..20の部分、やはりrange型か何かに切り出して欲しいな。組み込み型として。
範囲を表すのに直感的でいい記法なのに、配列のインデックスにしか使えないのは勿体ない。
あと>>67も含めて。やっぱ10..20のとき20は含まないべきだよなァー。

105 :デフォルトの名無しさん:2007/02/13(火) 11:32:20
>>104
書けるんだけど、sliceIndex は 0〜10 になって、10〜20 にはならない。
最適化もちゃんと効いて高速なんだけどなあ。

106 :デフォルトの名無しさん:2007/02/13(火) 11:35:50
import std.stdio;

struct Times {
 int n;
 void opShr(void delegate(int) yield) {
  for(int i = 0; i < n; ++i) {
   yield(i);
  }
 }
}

Times times(int n) {
 Times t;
 t.n = n;
 return t;
}

void main() {
 times(5) >> (int i){
  writefln("%d", i);
 };
}

うほっ

107 :デフォルトの名無しさん:2007/02/13(火) 11:37:00
auto arr = [0,1,2,3,4,5,6,7,8,9];
foreach (i=3, v; arr[3..8])
 writef(i," ",v,";");

-> 3 3; 4 4; 5 5; ...
と妄想

108 :デフォルトの名無しさん:2007/02/13(火) 11:42:57
>>106
そこは static opCall で作ろうぜ

109 :デフォルトの名無しさん:2007/02/13(火) 11:43:49
>>108
opCall でプロパティになるかと思ったら
ならなかったんだよー。

110 :デフォルトの名無しさん:2007/02/13(火) 11:44:32
二項演算子に do とか欲しくなってきた。
オーバーロード専用でも良いから。

111 :デフォルトの名無しさん:2007/02/13(火) 11:49:38
>>101
いけそうでいけない気がする……。
記法としてはとても良い感じなんですが。
演算子オーバーロードじゃ理想的な演算子無いし、
無理矢理あてたとしても末尾に}();なんて付いちゃいそう。

>>103
Rubyのイテレータはいいものだと思うです。
今じゃ”ブロック付き呼び出し”のが主流の呼び方っぽいけど。
Dでもdelegate引数が()の外に飛び出せさえすれば、
同じ表記(Dらしく型表記は付くけど)ができるんだけど……。

112 :デフォルトの名無しさん:2007/02/13(火) 11:51:19
>>111
そこで代入形式で呼び出すプロパティなんですよ

113 :デフォルトの名無しさん:2007/02/13(火) 11:55:15
普通のプロパティならイケるね。

import std.stdio;

struct IntEx {
 int value;

 void times(void delegate(int) yield) {
  for(int i = 0; i < value; ++i) {
   yield(i);
  }
 }
}

IntEx ex(int value) {
 IntEx ex;
 ex.value = value;
 return ex;
}

void main() {
 ex(5).times = (int n){
  writefln("%d", n);
 };
}

114 :デフォルトの名無しさん:2007/02/13(火) 12:03:42
>>112
あ、なるほど……。代入すると見せかけて、受け取ったdelegateを呼び出すのか。

わーい、超バッドノウハウ。でもそれがグッドな言語仕様に化けてくれれば儲けモノかな。

115 :デフォルトの名無しさん:2007/02/13(火) 12:06:56
struct Times {
 int n, m, s;
 
 static Times opCall(int n) { return Times(0, n); }
 static Times opCall(int n, int m, int s=1) {
  Times t;
  t.n = n; t.m = m; t.s = s;
  return t;
 }
 
 void opShr(void delegate(int) dg) {
  for(int i=n; i < m; i+=s)
   dg(i);
 }
 alias opShr opShl_r;
}

void main() {
 Times(5) >> (int i) {
  writefln("%d", i);
 };
 
 (int i) {
  writefln("%d", i);
 } << Times(10, 15);
}
自分でワロてしまった

116 :デフォルトの名無しさん:2007/02/13(火) 12:08:40
ああ、static opCall ってそういう事か。

117 :デフォルトの名無しさん:2007/02/13(火) 12:09:17
つか、後置www

118 :デフォルトの名無しさん:2007/02/13(火) 12:14:49
import std.stdio;

struct If {
 bool b;

 static If opCall(bool b) {
  If i;
  i.b = b;
  return i;
 }

 void opShl_r(lazy void yield) {
  if(b) yield;
 }
}

void main() {
 writefln("false") << If(false);
 writefln("true") << If(true);
}

キモイヨー

119 :デフォルトの名無しさん:2007/02/13(火) 12:16:11
>>105
書けはするんだ……でもarray[10..20]を評価した時点で
10と20の値は忘れられちゃうもんなぁ。

ああ、この堪らないなもどかしさ。Walterはやはり焦らしプレイの天才なのか。

120 :デフォルトの名無しさん:2007/02/13(火) 12:17:39
opIn_r で
 writefln("true") in If(true);
とか

余計キモイか

121 :デフォルトの名無しさん:2007/02/13(火) 12:18:48
演算子オーバーロードってこんなに面白いかったのか。

122 :デフォルトの名無しさん:2007/02/13(火) 12:20:46
イテレータ風の記述をするには、要するに、
最後に置いた delegate を呼ぶための演算子があればいいんだよね。
上がってる候補は : だったり = だったりなんだが、
Walter タンのこだわってる解析の楽さ的には
: はラベルかどうかのチェックが必要になる場合がありそうだから無理そうだな。
= はプロパティあたりをいじくればできそうだけど、どうなんだろうか。
do はアリかも。キーワード追加しなくていいし。

123 :デフォルトの名無しさん:2007/02/13(火) 12:27:09
後置ifはRubyにもあるし、普通に使いどころはあるかも……。

しかし、何となくフォースの暗黒面に囚われかけてる感覚があるw
演算子オーバーロードは原則、元の意味から逸脱しない範囲で行うこと。
悪い子のみんな、Walterとの約束だ!

124 :デフォルトの名無しさん:2007/02/13(火) 12:29:23
>>122
いや、必ず括弧を書く必要があれば、
ラベルとの混同はなしでいけるか。
Ruby やプロパティの癖で括弧無しで考えてしまった。

>>123
実用はしたくないけど、遊びで使う分には面白すぎるw
これはヤバいね。

125 :デフォルトの名無しさん:2007/02/13(火) 12:29:31
個人的には
times(5)~(int i){
 hoge(i);
};
な感じが好きだな。

126 :デフォルトの名無しさん:2007/02/13(火) 12:33:27
-, *, /, |, & とかも良さげ。
良さげなのがありすぎて、
逆に危険な香りがプンプン匂ってくるw

127 :デフォルトの名無しさん:2007/02/13(火) 12:33:31
times(5) (int i){ hoge(i); };

いっそ記号無しは……無理、か? 読みづらいか。

128 :デフォルトの名無しさん:2007/02/13(火) 12:33:50
>>123 IODCCで広く使われることでしょう

129 :デフォルトの名無しさん:2007/02/13(火) 12:37:35
>>128 D言語ダークサイド友の会じゃねーかw

130 :デフォルトの名無しさん:2007/02/13(火) 12:37:48
そういや、opAssign なんてのがあったんだっけ。
これ使えば = もいけるな・・・。

131 :デフォルトの名無しさん:2007/02/13(火) 12:47:32
笑えるソースの見せ合いで大会とか開いたりして

132 :デフォルトの名無しさん:2007/02/13(火) 12:50:24
>>120
in 使うなら If じゃなくて case にしたら良さげだなw

133 :デフォルトの名無しさん:2007/02/13(火) 12:59:46
import std.stdio;

struct case_that {
 bool b;

 static case_that opCall(bool b) {
  case_that i;
  i.b = b;
  return i;
 }

 void opIn_r(lazy void yield) {
  if(b) yield;
 }
}

void main() {
 writefln("false") in case_that(false);
 writefln("true") in case_that(true);
}

おおお。これくらいは使っていいんじゃという誘惑に駆られそうだ。

134 :デフォルトの名無しさん:2007/02/13(火) 13:06:04
import std.stdio;

struct Times {
 static int index;

 static void opSliceAssign(lazy void v, size_t x, size_t y){
  for(index=x; index < y; index++)
   v();
 }
}

void main() {
 Times[10..20]=(
  writefln(Times.index),
  writefln(Times.index*2) );
}

良く解らないけど、とても気持ち悪いです。はい。

135 :デフォルトの名無しさん:2007/02/13(火) 13:07:19
opSliceAssign www

136 :デフォルトの名無しさん:2007/02/13(火) 13:10:40
どうせなら __dollar 使おうぜ

137 :デフォルトの名無しさん:2007/02/13(火) 13:19:29
>>122
doはキーワード増やさない点、あとRubyと同じだという点もナイスだけど、
場所によってキーワードの意味が違う、となるとちょいと嫌だな。
かつてのautoとscopeのようなことにならなきゃいいが。

でも案外、do-whileのdoと似てると解釈も出来るか……?

138 :デフォルトの名無しさん:2007/02/13(火) 13:22:38
import std.stdio;

struct range {
 static void opSliceAssign(void delegate(size_t i) yield, size_t x, size_t y) {
  for(size_t i = x; i < y; ++i) yield(i);
 }
}

struct times {
 static void opIndexAssign(void delegate(size_t i) yield, size_t n) {
  for(size_t i = 0; i < n; ++i) yield(i);
 }
}

void main() {
 range[3..10] = (size_t i) {
  writefln(i);
 };
 times[5] = (size_t i) {
  writefln(i);
 };
}

そういや、continue は return で代用できるとして、break が使えないや。
何か値を返すようにするのも面倒だし、限界はあるやね。

>>137
一応「イテレータ」を指向するという名目なら、
ループするということで do は意味的にオーケー?
まあ、Ruby のイテレータよろしく、
結局そこから逸脱した使われ方もされるだろうけど。

139 :デフォルトの名無しさん:2007/02/13(火) 13:30:51
>>138
do-whileで「ループ」のニュアンス持ってるのはwhileの方だから、
doだけならループに使われなくても問題無いんじゃないかな。
直訳したって「する」でしかないんだし。

140 :デフォルトの名無しさん:2007/02/13(火) 13:45:40
>>138
>そういや、continue は return で代用できるとして、break が使えないや。
break用の例外を投げるという荒業はどうだろう。気持ち悪いと言えばそれまでだけど。

141 :デフォルトの名無しさん:2007/02/13(火) 13:46:19
そういやそうね。
つまり、こんな妄想が・・・

import std.stdio;

void times(size_t n, int delegate(size_t i) yield) {
 for(size_t i = 0; i < n; ++i) {
  int res = yield(i);
  if(res != 0) return;
 }
}

void main() {
 times(5) do (size_t i) {
  writefln(i);
 }
}

まあ、{ } 内で break, continue, return の意味が変わるというあたり、
どう実装するのかというのが気になるところか。

142 :デフォルトの名無しさん:2007/02/13(火) 14:21:09
returnはreturnでcollectメソッドとかに使いたいので、
他の代用にされてしまうと困るかも。

char[][] titles = books.collect() do (Book book){
 return book.title;
};

opApplyはbreakとかサポートするために、
どうにも妙な作りになっちゃってるんだよね・・。
正直、Exception使ったほうがマシだった気がする。

Rubyじゃどう解決してたか、詳しい人いる?

143 :デフォルトの名無しさん:2007/02/13(火) 14:27:02
こうできてほしいな。
times(size_t i;5){
  writefln(i);
}
んでopApplyと同様にopStatementに対応して欲しい。

144 :デフォルトの名無しさん:2007/02/13(火) 14:40:29
>>142
delegate じゃなくて yield という特別なキーワード使ってるから
Ruby だとそこんところどうにでもなる。

145 :デフォルトの名無しさん:2007/02/13(火) 14:45:41
言語仕様としてマイクロスレッドが欲しいよ。
C#でいうとyieldね。

146 :デフォルトの名無しさん:2007/02/13(火) 15:02:46
python の yield みたいな外部イテレータも面白い。
マイクロスレッドの代わりにもなる?

147 :デフォルトの名無しさん:2007/02/13(火) 15:04:06
くだらないことでスレ延ばしてる香具師は自演厨か?

148 :デフォルトの名無しさん:2007/02/13(火) 15:44:05
>>146
それマイクロスレッド。

149 :デフォルトの名無しさん:2007/02/13(火) 16:12:31
てかもう、ステートメント自体を記述できるようにするのはどうだ?
statement LinkedForeach{
private int i;
private Collection src;
private Collection dest;
public LinkedForeach(Collection src, Collection dest)
{
this.src = src;
this.dest = dest;
}

public bool next(out Items items)
{
this.i++;
if(this.src.length < this.i && this.dest.length < this.i)
{
items = new Items(this.src[this.i], this.dest[this.i]);
return true; // 継続
}else
{
return false; // 終了
}
}
}

-----
void functionX(Collection c, Collection d){
LinkedForeach(Items items; c, d)
{
// c, dのi番要素への操作が繰り返しで可能
}
}

150 :デフォルトの名無しさん:2007/02/13(火) 16:14:10
ちなみにstatementはステートメントとして使える + ステートメント終了時に自動で破棄(=auto)的なclassの仮想構文ね。

151 :デフォルトの名無しさん:2007/02/13(火) 17:51:14
はいはいわろすわろす

152 :デフォルトの名無しさん:2007/02/13(火) 17:51:33
delegateの構文としてdoを採用するんだったらこうなるわけか。

hoge(x, y, z) do|int x, int y|
...
end

どうみてもRubyです。

しかし盛り上がりすぎワロタw

153 :デフォルトの名無しさん:2007/02/13(火) 20:40:42
D言語の正式版の存在の意味が分からないw
明らかに人柱版としか思えないんですけどwwwww

154 :デフォルトの名無しさん:2007/02/13(火) 20:51:12
>>153
正式版も何も、単にバージョンが1になったというだけの話でしょw

155 :デフォルトの名無しさん:2007/02/13(火) 21:05:47
とりあえず落ち着かないとIDEとか無理だよな

156 :デフォルトの名無しさん:2007/02/13(火) 21:20:10
>>152
hoge(x, y, z) do (int x, int y) {
...
}

でいいんじゃねえの?
パイプって左右の区別なくて気持ち悪い。

157 :デフォルトの名無しさん:2007/02/13(火) 21:56:47
char[][] commentlessScript = File.collectLines("foo.myscript") do (char[] line){
 if(line == "---EndOfScript---"){ break; }
 if(line.startWith("#")){ continue; }
 return line;
};
class File{
 static char[][] collectLines(char[] filePath) do (char[] delegate(char[]) yield){
  char[][] result;
  open(filePath) do (File file){
   while(!file.eof){ result ~= yield(file.readLine()); }
  }
  return result;
 }
 static void open(char[] filePath) do (void delegate(File) yield){
  File file = new File(filePath); scope(exit){ file.close(); }
  yield(file);
 }
}
/* コンパイラは、delegateの呼び出しが行われるのがwhileやforの中のみと判断した場合に限り、
  そのdelegate内でのbreak、continueを許します。それらが行われた場合、delegateの実行は中断され、
  delegate呼び出しから最も近いforやwhileに対してbreak、continueが行われたものとして処理されます。 */

妄想が窮まってきたので、いい加減もう寝ます……。

158 :157:2007/02/13(火) 22:09:33
……コメントに付け足させてくれ。

/* 検討事項: ... do (loop char[] delegate(char[]) yield){ ... のようにloopキーワードを付けるなどして、
  delegate引数の宣言の側でbreak、continue可能なことを明示すべきかもしれません。
  この場合、この`yield`はwhileやforの中で呼び出さない限りコンパイルエラーになることになります。 */

今度こそ寝る。

159 :デフォルトの名無しさん:2007/02/13(火) 22:25:00
>>156
「関数呼び出し do 関数リテラル」って形だな。

doを既存の演算子に置き換えて、
その演算子をオーバーロードしたクラスを関数呼び出しが返せば、
「関数呼び出し 演算子 関数リテラル ;」という形にはなりそう。
その場合、文じゃなくて式だけど。

160 :デフォルトの名無しさん:2007/02/13(火) 23:16:44
forの方が単純でいいような気がしてきた。

161 :デフォルトの名無しさん:2007/02/13(火) 23:34:45
トリッキーなコードには演算子オーバーロードは欠かせない。

我々にはopDoが必要だ。

162 :デフォルトの名無しさん:2007/02/14(水) 05:40:33
ネタでしょ?

163 :デフォルトの名無しさん:2007/02/14(水) 05:57:51
括弧内に { } があるのってダサくね?

164 :デフォルトの名無しさん:2007/02/14(水) 06:31:20
まさかこんなのが古きよきforループより分かりやすい、初心者にも
教えやすいとか思ってないよな?
しかも性能が劣るのは確実

単なるジャンプに過ぎないbreakやcontinueの代わりに例外なんて
論外もいいところ

馬鹿じゃないの?ただのオナニーじゃん

165 :デフォルトの名無しさん:2007/02/14(水) 06:39:54
>>158
おまいばかじゃね?
ネタだとしても、折角do使ってキーワード増やさない様にしてるのに何してんだ。
そんなんなら最初から新たな構文作るだろ。

166 :デフォルトの名無しさん:2007/02/14(水) 06:41:12
くだらんことでスレ延ばしてる香具師は
仕様いじくりまわして使えなくしてしまおうという
スパイの陰謀にしか思えない


167 :デフォルトの名無しさん:2007/02/14(水) 06:44:17
どこのスパイだ

168 :デフォルトの名無しさん:2007/02/14(水) 06:52:10
Jで始まる言語を使うところだな。
Japanese

169 :デフォルトの名無しさん:2007/02/14(水) 06:52:26
for ループと do 記法の提案の話は別ジャン。

170 :デフォルトの名無しさん:2007/02/14(水) 07:43:56
一所懸命相手のレスをねじ曲げて馬鹿にしてるんだから水を差すな。

171 :デフォルトの名無しさん:2007/02/14(水) 08:03:36
うそみたいだろ
全部ネタなんだぜ

172 :デフォルトの名無しさん:2007/02/14(水) 08:20:55
Don't touch me!

173 :デフォルトの名無しさん:2007/02/14(水) 09:11:02
sampleのhtmlget.dのhtml表示部分のprintfをwritefに変えたら4invalid UTF-8 sequenceってなった(printfのままだと通る。ちなみに接続先はwww.google.co.jp)
・・・なんで?
もしかして、writefだとUTF-8通らないのか?

174 :173:2007/02/14(水) 09:11:56
あっ、改行忘れてた。すまん

175 :デフォルトの名無しさん:2007/02/14(水) 09:25:14
BOMとか関係あったりして

176 :デフォルトの名無しさん:2007/02/14(水) 11:44:20
逆だろ、writefはUTF-8とか16辺り以外通らない。

177 :デフォルトの名無しさん:2007/02/14(水) 12:01:41
みんな速度には結構神経使うな……当然ちゃ当然だが。

一口に速度と言っても、みんなどれくらいのをイメージしてるんだ?
俺は元々Java/Webな人間だし、個人的に作りたいモノも大抵Winアプリだしで、
停止時間が0.3秒くらいに収まればいいかな、くらいに思ってるけど。
だからforよりパフォーマンス落ちるとか程度は、(多分)全然許容範囲。

やっぱゲームとかリアルタイム処理な人は、
1万回のループが1/60秒以内に収まらなきゃ論外(数値は適当)、
delegateとか話にならん、て感じなんだろか。

178 :デフォルトの名無しさん:2007/02/14(水) 12:58:51
停止時間とか言ってる意味がよく分からんが、
ループ箇所の処理時間はボトルネックになりやすいという
一般論を前提にして今の話は進行してたんだろ

179 :デフォルトの名無しさん:2007/02/14(水) 13:04:37
>>176
たしかにそうみたいだな
import std.stdio;

void main()
{
printf("ほげほげ");
writef("ほげほげ");
}
で、ちゃんと表示されてるから。
でも、なんでちゃんと表示できなかったんだろう・・・>htmlget.d

180 :デフォルトの名無しさん:2007/02/14(水) 13:17:42
>>178
GC関係じゃね?<停止時間

181 :デフォルトの名無しさん:2007/02/14(水) 13:30:43
>>177
別に性能がどうでもいいんならVM言語やスクリプト言語でいいし
って話じゃねーの?

画像データをピクセル単位で弄くったりすることを考えると
遅いループなんて使う気にならないよ、少なくとも俺は。

182 :デフォルトの名無しさん:2007/02/14(水) 13:47:42
>>178
停止時間は例えば「ユーザがメニューから項目を選択してから、
再びユーザに制御が戻るまでの時間」くらいのつもりだった。

>>181
性能がどうでも良いとしても、Dは結構魅力的だと思うけど。
ランタイム要らずで起動の早い単体exeを作れる、かつC/C++より幾分モダンだし。

とゆーか、ごめん。なんか分かり切った事を聞いた気が自分でもしてきた。

183 :デフォルトの名無しさん:2007/02/14(水) 14:46:30
D言語そのものが人柱言語なんだからこのままイカレ仕様につっぱしってほしいぜ!
# 実用に使えるかどうかはプログラマの腕次第

184 :デフォルトの名無しさん:2007/02/14(水) 15:00:48
Rubyのイテレータとか見てると、
複雑な制御構造やありがちな制御構造をモジュール化して、
名前を付けられるって点がありがたいなぁ、と思う。

185 :デフォルトの名無しさん:2007/02/14(水) 15:13:57
>>177
意外と、会計処理でも、5時間かかるか、4時間で済むかは大問題だったりする。
夜間バッチのスケジュールが有って、会計処理なんて今時古いとか言われても、
必要なもんなんだし、お前らみたいにお絵かきやエロやってる訳じゃなく、従業員
が1万人関連取引先含めると20万人、顧客まで含めると100万人規模の、会社
にとっては、本当に死活問題。

186 :デフォルトの名無しさん:2007/02/14(水) 15:18:17
>>173
www.google.co.jpはuser agentを見てUTF-8返したりShift_JIS返したりしてた気が。
たぶんSJISで送られてきてる。

187 :デフォルトの名無しさん:2007/02/14(水) 15:43:07
>>186
つかさ。
普通にprintfで書き出して
hoge.exe > tmp.txt
でtmp.txtの文字コード調べりゃ済んだはずだよな

188 :デフォルトの名無しさん:2007/02/14(水) 15:48:27
そういう高速な処理したい人は普通にfor書いて
それ以外の速度が死活問題にならない人は短くてわかりやすい構文が使えるってのでいいんじゃないかな。

コンパイルはもともと激速なんだし構文増えてもそんなに遅くはならないと思うし。

189 :デフォルトの名無しさん:2007/02/14(水) 16:23:46
>>188
それはもったいないとおも

190 :デフォルトの名無しさん:2007/02/14(水) 16:45:38
>My goal is to make the Boost implementation code look as obsolete as a muzzle-loading smoothbore.
ガンガレWalterタソ!

191 :デフォルトの名無しさん:2007/02/14(水) 16:59:48
muzzle-loading smoothbore みた事無いからわかんないや

192 :デフォルトの名無しさん:2007/02/14(水) 17:01:40
>>188
ここらで直交性について触れておくべきだろうか。
まぁDはとっくに醜悪な恐竜になりつつあるがな。C++のように。

193 :デフォルトの名無しさん:2007/02/14(水) 17:12:22
> muzzle-loading smoothbore
ググって見たら軍事用語かいな。どういう喩えなのかさっぱり解らんw

>>192
STLだと型、データ構造、アルゴリズムだっけ。
Dが醜くなりつつあるというなら、どっかを削るべき?

194 :デフォルトの名無しさん:2007/02/14(水) 17:21:11
> muzzle-loading smoothbore

muzzle-loadingは先込め式銃で銃口から玉を込める銃のこと。
そしてsmoothboreはライフリングがない銃の事らしい。
とりあえず火縄銃なのかな?

195 :デフォルトの名無しさん:2007/02/14(水) 17:26:15
> 火縄銃
なるほど、obsoluteだな

196 :デフォルトの名無しさん:2007/02/14(水) 17:34:46
つまりDの目標はBoostを現在の銃と火縄銃くらい時代が違う物にしたいと

197 :デフォルトの名無しさん:2007/02/14(水) 17:36:10
要は「ちょwwBoostwwwwww」ってなるくらいってことだろ

198 :デフォルトの名無しさん:2007/02/14(水) 17:43:37
for や do のあたりの話をまとめると、こんな感じか。

・ foreach(i : 1..array.length, n; array) { ... }
 ってできたら、インデックスもズレないし、便利だよね?

・ ついでに
 foreach(i : 0..TIMES) { ... }
 ってできてもいいんじゃね?

・ それとは別に、Ruby のイテレータみたいなの欲しいな。
 times(5) do (size_t i) { ... }
 void times(size_t n, int delegate(size_t) yield) { ... }
 みたいな。

199 :デフォルトの名無しさん:2007/02/14(水) 17:44:36
boostが出てくるということは、
強力で設計の良いライブラリも持ちたいという意志はあるのねw
頑張れWalter! 出来れば「標準」ライブラリで頼むぜ!

200 :デフォルトの名無しさん:2007/02/14(水) 17:46:57
>>199
>強力で設計の良いライブラリ
boostはそんなライブラリじゃない訳だが。

201 :デフォルトの名無しさん:2007/02/14(水) 17:48:39
頑張れWalter!

202 :デフォルトの名無しさん:2007/02/14(水) 17:49:35
>>200
Walterはboostを持ちたいと言っている訳じゃないんだからいいんじゃね?


203 :デフォルトの名無しさん:2007/02/14(水) 17:52:26
boost は標準化目指してなかったっけ?

204 :デフォルトの名無しさん:2007/02/14(水) 17:53:56
>>202
既にtupleとかbindとか標準ライブラリでサポートされてきてるじゃん。

205 :デフォルトの名無しさん:2007/02/14(水) 17:54:41
>>198
そのあたりHaskellだとキレイにかけそう。

206 :デフォルトの名無しさん:2007/02/14(水) 17:55:59
>>203
C++0xで採用される予定のtr1はboostが基になってるのが多いね。

207 :デフォルトの名無しさん:2007/02/14(水) 18:04:07
とりあえず boost は糞で桶?

208 :デフォルトの名無しさん:2007/02/14(水) 19:30:05
"Boost implementation code look as..." だから、
boostの「実装コードが」時代遅れに見えるくらいにしたい、じゃね。
boostと同じ(or以上の)レベルの事を、もっと奇麗なコードで出来る言語仕様を……
というニュアンスとも。

209 :デフォルトの名無しさん:2007/02/14(水) 20:33:13
>>208
俺にもそう読めた
boostライブラリを言語仕様で実現したいんじゃないの

210 :デフォルトの名無しさん:2007/02/14(水) 22:02:34
209が208に同意してるのに微妙に違うこと言ってて混乱。

Boostみたいなライブラリをダーティハック(とかいったらC++の人に叱られそう)なしで出来るようにしたいって話では。

211 :デフォルトの名無しさん:2007/02/14(水) 22:13:58
変態っていえば多分彼らは納得してくれる。

212 :デフォルトの名無しさん:2007/02/14(水) 22:25:59
たしかにやべえ変なことしてるなあコレwって部分に興奮してる部分はあるかもだよな、>C++の人

213 :209:2007/02/14(水) 22:40:39
>>210
よく読んでみたら確かに微妙に違ったみたい
ニュアンスを完全には把握できてないや

ところでさあ
TangoってErrorクラスがなくなってたりして
dfl(dwtも?)と一緒に使うことができないっぽいんだがどうしようもないのかこれ

214 :デフォルトの名無しさん:2007/02/15(木) 09:26:23
ファイルコピーてstd.fileに無いの?

215 :デフォルトの名無しさん:2007/02/15(木) 10:20:57
>>214
? ふつうにvoid copy(char[] from, char[] to); が載ってるが。

216 :199:2007/02/15(木) 10:33:07
>>200
boostを思い出してみるに、確かに何となく違った気がする。
C++の言語仕様ならこれだけのことが可能なんだから、
これくらいは基礎として入っているべきだ、て感じ? 実際>>206な話だし。

GUIに通信にXMLにと何でも最初から入ってる、Javaみたいな意味での”強力”さってのは、
Dの標準ライブラリでは目指して無さそう? それはそれでいいのだけど。

217 :デフォルトの名無しさん:2007/02/15(木) 11:33:55
>>216
標準ライブラリにバイナリ本体を載せなくても、標準的なインターフェースは定義予約しておいてほしいと思う。


218 :デフォルトの名無しさん:2007/02/15(木) 13:05:53
>>186
あぁ、本当だ
よくよく見たらcharset=Shift_JISになってたわ

219 :デフォルトの名無しさん:2007/02/15(木) 20:28:59
IEやExcelを操作したいのだけど
COMを扱うライブラリを、紹介してもらえないですか?
出来れば、スクリプト並みに楽に扱えるものだと嬉しいです

あー、DもCOMも検索しづらい


220 :デフォルトの名無しさん:2007/02/15(木) 23:33:38
伸びてるな

221 :デフォルトの名無しさん:2007/02/16(金) 00:54:15
>>113-152
この流れ、おもしろすぎwwww
はたから見てて、久々にD言語使いたくなったwwww




222 :デフォルトの名無しさん:2007/02/16(金) 02:18:21
yield欲しい……。

223 :デフォルトの名無しさん:2007/02/16(金) 02:24:25
てかマイクロスレッド自体は実現できるんだったな・・・。
うらおの奴が作ってたような・・・。

224 :デフォルトの名無しさん:2007/02/16(金) 02:33:01
>>223
使用メモリを自分で決めるのと例外が投げられないのがちょっと気になる。

225 :デフォルトの名無しさん:2007/02/16(金) 02:46:26
>>224
あー確かにそうだったな・・・。
でもスタックって最初からサイズ決まってるんじゃないっけ。

226 :デフォルトの名無しさん:2007/02/16(金) 03:35:21
What's New for D 1.006
Feb 15, 2007
New/Changed Features

* Added -Jpath switch, which is now required in order to import text files.
* Enhanced -v output to include actual filename.
* name string for TypeInfo_Struct now part of the TypeInfo_Struct comdat.
* Compile time execution of functions

227 :デフォルトの名無しさん:2007/02/16(金) 03:42:17
* Compile time execution of functions
コンパイル時ユニットテストが・・・!!

228 :デフォルトの名無しさん:2007/02/16(金) 10:34:50
> * Compile time execution of functions
定数要求されてるところに関数書いておくと、それが
いくつかの条件をみたす関数ならコンパイル時に実行しとくよ、
という話で、ユニットテストとはちょっと違う気が

229 :デフォルトの名無しさん:2007/02/16(金) 12:00:35
class Person{
 MyArray!(Person) children = new MyArray!(Person)();
}

とか、ひょっとして通るようになったんでせうか。

230 :229:2007/02/16(金) 12:44:32
ダメだた……orz

231 :デフォルトの名無しさん:2007/02/16(金) 13:24:14
よー考えたら、newはGCにメモリをねだる処理なんだから、
コンパイル時実行で解決できるわきゃなかったか……。スレ汚し失礼。

232 :デフォルトの名無しさん:2007/02/16(金) 16:00:13
Web鯖みたいの作っててacceptしたSocketをスレッド作ってどんどん渡してってるんだけど
GCが自動的に動いたときに Error: Thread error: cannot pause とかいってデッドロックしてしまう
これはphobosかなんかのバグ?

233 :デフォルトの名無しさん:2007/02/16(金) 17:41:38
GCが動く時には全てのスレッドを停止しなければならないとかは聞いたが、
どういう順番でどう停止させているのか、あたりに問題が潜んでる可能性はあるかも。

ただ、普通にデッドロックが発生する設計になっちゃってるせいじゃないか?
という疑念がひしひしと。同期の設計を慎重に見直してみたら?

234 :デフォルトの名無しさん:2007/02/16(金) 18:09:04
ttp://d.puremagic.com/issues/show_bug.cgi?id=645
これかな?

235 :デフォルトの名無しさん:2007/02/16(金) 19:05:41
std.threadを見てみたが、これはいたるところ微妙すぎないか?
というか書き直したほうがいいなこれ
Walterタンがんばって><

236 :デフォルトの名無しさん:2007/02/17(土) 01:44:30
>>235
ひどい奴だな、そこまでわかってるなら手伝ってやれよ。

つか別インプリメントして投稿ってのはナシなの?


237 :デフォルトの名無しさん:2007/02/17(土) 01:57:01
std.threadをてきとうに応急処置してみたんだがどうだろうか?
だれかえろいひと見てもらえると助かる
http://grugru.mine.nu/file.cgi?v=guru_guru_2560.zip

238 :237:2007/02/17(土) 02:07:30
あああ 間違った
void wait(uint milliseconds)
のほう変更し忘れた

239 :237:2007/02/17(土) 02:41:23
http://grugru.mine.nu/file.cgi?v=guru_guru_2561.zip
イベントのあたりがいろいろ間違ってたのをなおしました

240 :デフォルトの名無しさん:2007/02/17(土) 21:30:04
なんちゅ〜かDっぽくなくて恐縮なんだが、
テンプレートクラスA(T)とクラスBがあったとして、
A!(B)のオブジェクトのclassinfoをたどって、
Tの(ここではB)のClassInfoなりTypeInfoって取得可能?


241 :デフォルトの名無しさん:2007/02/17(土) 21:53:22
テンプレートクラスの引数はclassinfoだとメンバ変数nameが一応持ってはいるけど、文字列だしどうしようもない。

242 :デフォルトの名無しさん:2007/02/17(土) 22:26:49
mixinはどうだろ

243 :デフォルトの名無しさん:2007/02/17(土) 23:29:10
>>239

しかし俺には評価できない罠
どういう問題が解決されているのかな

244 :デフォルトの名無しさん:2007/02/17(土) 23:46:11
>>243
http://f17.aaa.livedoor.jp/~labamba/?BugTrack%2F26
たぶんこれが直ってるのと、スレッドハンドルがどんどんリークしていたのを修正しました

245 :デフォルトの名無しさん:2007/02/18(日) 01:25:19
>>242
classinfo.nameはコンパイル時定数じゃないから…

246 :デフォルトの名無しさん:2007/02/18(日) 02:13:13
>>244
>>234で絶賛放置中のBugであり>>232の原因の疑いアリという代物じゃないっすか。
問題ないならcommitして欲しいくらいですねぇ。
私ゃ評価も翻訳もできない身ですけど・・。

247 :デフォルトの名無しさん:2007/02/18(日) 02:58:27
>絶賛放置中
クソワロタ


身に覚えがあるし・・・

248 :デフォルトの名無しさん:2007/02/18(日) 09:11:54
>>240

import std.stdio;

class A(T){}
class B{}

template TypeOfA( T )
{
static if( is(T U : A!(U)) )
alias U TypeOfA;
else
alias void TypeOfA;
}

int main()
{
alias A!(B) A_B;

writefln( typeid( TypeOfA!(A_B) ) ); // modulename.B

return 0;
}

こんなんじゃだめ?

249 :240:2007/02/18(日) 10:35:53
>>248
A_Bの型からじゃなくて、A_Bのオブジェクトから取得可能か、知りたいんだよね。
Dっぽくなくて恐縮なんだが。

>>241のゆうように無理っぽそうだが。(dクス)


250 :デフォルトの名無しさん:2007/02/19(月) 01:35:01
SDLの話なんだが・・・
hoge.dとsdltest.dっていう名前のソースが二つあって、
以下のようにコンパイルすると、sdltest.dのほうだけ128が返るんだが・・・どうしてだろう?
この128はdmdが返してるのか、SDLが返してるのか・・・それすらも分からないorz
%dmd hoge.d SDL.lib #SDL.libはあらかじめPATHが通ってる
%dmd sdltest.d SDL.lib
ソースは以下の通り
import std.stdio;
import SDL

int main(char[][] args)
{
  if (SDL_Init(SDL_INIT_VIDEO))
    throw new Error("Could'nt initialize video");
  printf("hello,SDL!");
  return 0;
}

251 :デフォルトの名無しさん:2007/02/19(月) 01:36:24
あっ、import SDLに;忘れてた・・・orz
もう寝る。

252 :デフォルトの名無しさん:2007/02/19(月) 01:37:51
あぁ・・・orz
if (SDL_Init(SDL_INIT_VIDEO)) > if (SDL_Init(SDL_INIT_VIDEO) < 0)
でした・・・
こんどこそ寝る。

253 :デフォルトの名無しさん:2007/02/19(月) 01:50:54
あぁ・・・そうかDLLだ
おし、原因分かったから寝る。

254 :デフォルトの名無しさん:2007/02/19(月) 01:52:03
寝ろwww

255 :デフォルトの名無しさん:2007/02/19(月) 03:34:23
Nero Burning Rom

256 :デフォルトの名無しさん:2007/02/19(月) 03:45:00
std.socketのブロッキングモードがすごく使いにくいんだけどなんとかならんもんかなー
GCが動いたときにSIGUSERが発生してacceptとかreceiveがEINTRで抜けてくるから
期待してるブロッキングモードの利点があんまり無い(´・ω・)


257 :デフォルトの名無しさん:2007/02/19(月) 11:23:05
そいやDLLの話で思い出したが。
implibとか使ってDLLからインポートライブラリ作ろうとしても、
なんか現状、すんなりとできないよね?

extern(Windows)つけた関数がDのマングリング受けてて、リンカでコケまくり。
呼び出し規約とマングリングの区別で俺の頭が混乱してくる始末。
extern(Windows)な関数て、"FunctionName@8"みたく
マングリングされてくれなきゃいかんのでは……?

258 :257:2007/02/19(月) 12:12:51
あれ? ごめん、なんか全然違った気がする。

extern(Windows)使うと"_FunctionName@8"みたいなマングリングがされて、
DLLの方は素直に"FunctionName"みたいなエクスポート名になってるのに困るなぁ、
ということだった。

259 :デフォルトの名無しさん:2007/02/19(月) 13:21:44
.defを書け、というのがドキュメントに書いてあったような

260 :デフォルトの名無しさん:2007/02/19(月) 15:35:14
def tech

261 :デフォルトの名無しさん:2007/02/19(月) 21:43:13
>>259
あい。だからdefファイル作ったんだけども、やっぱりメンドイなぁ、て。
特に@以降の引数のサイズ表す数字が。

htodで.dファイル作って、
そこに含まれる関数定義を関数呼び出しコードに変換するスクリプトなんて書いて、
それをdmdに食わせてリンカにエラーメッセージ出力させて、
それをパースしてdefに変換するスクリプトなんて書いて……とか。

なんだかとても無駄なことをしてる気が。誰かいい方法知りません?

262 :デフォルトの名無しさん:2007/02/20(火) 00:31:08
>>256
signalでも抜けちゃうから、結局なんかやらないといけないけどな

263 :デフォルトの名無しさん:2007/02/20(火) 00:36:48
ってGCのときにSIGUSERが発生するので困ってたのか。

recvのwraper作ってEINTRを無視すれば良いんじゃないの?

264 :デフォルトの名無しさん:2007/02/20(火) 02:57:13
>>263
receiveとかsendはラッパ作れば問題ないけど、acceptの返り値がSocketなのがマズー
ラップクラスでオーバライドした関数を使ってくれない orz
acceptで返ってきたSocketのソケットディスクリプタだけコピーして、
自分のクラスにセットしようと思ってもモジュール外だからSocketのprivateにアクセスできないし。
結局ほとんど全部自前で作るはめに(´・ω・`)
phobosの方でなんとかしてもらえれば助かるんだけど。。

265 :デフォルトの名無しさん:2007/02/20(火) 10:36:58
>>264
acceptingをオーバーライドすればacceptで自前のSocketクラスを返せたはず

266 :デフォルトの名無しさん:2007/02/20(火) 12:59:45
>>265
キター できました。ありがとうございます
一生懸命 *((cast(int*)newSock)+2) = *((cast(int*)sock)+2);
とかやってたのは内緒

267 :336:2007/02/21(水) 13:52:55
What's New for D 1.007
Feb 20, 2007

・Comparison operators are no longer associative; comparison, equality, identity and in operators all have the same precedence.
・out and inout parameters are now allowed for compile time function execution.
・The .dup property is now allowed for compile time function execution.
・Updated lib to insert COMDATs into symbol table.
・Class references can no longer be implicitly converted to void*.


268 :デフォルトの名無しさん:2007/02/21(水) 15:08:40
What's New for D 1.007
Feb 20, 2007

・ 比較演算子を結合できないようにしました。比較に関する演算子は全て同じ優先順位になります。
 (a < b == c とか書けないようになった。
  どうしてもやりたい場合は多分 (a < b) == c でイケるんじゃないかと。
  c が bool だとありうるよね、一応)
・ out と inout 引数があっても、コンパイル時に関数を実行できるようになりました。
・ .dup プロパティがコンパイル時に実行できるようになりました。
・ COMDAT を lib のシンボルテーブルに含めました。
・ クラスの参照を暗黙に void* へキャストできないようにしました。

269 :デフォルトの名無しさん:2007/02/21(水) 15:25:56
微妙な修正群・・・
やはりこれは真の1.000への修正だろうか。

270 :デフォルトの名無しさん:2007/02/21(水) 15:28:59
>>269
かなり重要な修正じゃん。
それと今dmdが目指してるのは2.0。

271 :デフォルトの名無しさん:2007/02/21(水) 21:31:32
1.0はただの踏み台ですかw
安定志向という考えはD言語開発陣の辞書には無いということですかwwww

272 :デフォルトの名無しさん:2007/02/21(水) 21:34:51
そんなもん。D言語はWalterタソの玩具。安定指向な言語使いたければJavaとかC#とかC++とか使ってなって話で。

273 :デフォルトの名無しさん:2007/02/21(水) 22:40:45
なんと穏やかで小粒な修正……侘び寂びを感じるな。

実際の話、WalterもDの開発を通して新たに学ぶことがあるんだろうか。
Dで色々試して要るもの要らないものを見極めたら、
その集大成としてD--でも作ったほうがいいんじゃなかろーか、とか思う。

274 :デフォルトの名無しさん:2007/02/21(水) 22:42:08
1.005でぶっ飛んだ機能をつけたので、小粒な修正がしばらく続くかと。

275 :デフォルトの名無しさん:2007/02/21(水) 23:34:14
面白いおもちゃだよなあ。

276 :デフォルトの名無しさん:2007/02/22(木) 06:40:21
Walterタンは仕事でC++のコンパイラを作っててフラストレーションがたまってるから
趣味でDを作ってるンよ

277 :デフォルトの名無しさん:2007/02/22(木) 07:27:11
D言語って言うくらいだからC言語やC++より高性能なわけ?

278 :デフォルトの名無しさん:2007/02/22(木) 07:50:41
高性能ですが別に速かったり表現できることがすごいというわけでは無いんです

279 :デフォルトの名無しさん:2007/02/22(木) 08:06:03
高性能ですが
高性能ですが
高性能ですが

280 :デフォルトの名無しさん:2007/02/22(木) 08:10:09
C++厨がファビョったかな。

281 :デフォルトの名無しさん:2007/02/22(木) 11:00:34
D言語(笑)

282 :デフォルトの名無しさん:2007/02/22(木) 11:31:30
言語の性能ってのも微妙な話な気がするが、
「高機能」となら言ってもいい・・よな?

あと、綺麗なコードを書けるという意味では、
「表現できること」は比較にならんほど向上してると思う。

283 :デフォルトの名無しさん:2007/02/22(木) 11:32:16
>>277
おまいに問いたい。Z言語は最高に高機能なんですか?
ttp://ja.wikipedia.org/wiki/Z%E8%A8%80%E8%AA%9E


284 :デフォルトの名無しさん:2007/02/22(木) 13:18:45
D 言語は素晴らしいけど、
仕様が固まらないと実用する気にならないのが難点。

285 :デフォルトの名無しさん:2007/02/22(木) 13:20:56
仕様が固まったD言語なんてD言語じゃない><

286 :デフォルトの名無しさん:2007/02/22(木) 13:25:07
仕様が固まったD言語はD言語じゃなくてD-だよ

287 :デフォルトの名無しさん:2007/02/22(木) 13:57:55
正直、Walterタンの中では ver 1.000 って ver 0.1.000 くらいの感覚だよね。

288 :デフォルトの名無しさん:2007/02/22(木) 14:45:10
てゆーか正月にむりやりD1.0にしたからこんな「真のD1.0」とかなんとかいわれちゃうんだよね

289 :デフォルトの名無しさん:2007/02/22(木) 15:30:32
名前がDのせいで必要以上に期待されてるんだろな。

290 :デフォルトの名無しさん:2007/02/22(木) 16:38:09
名前がMarsのままならマイナー言語で終わるヤカン

291 :デフォルトの名無しさん:2007/02/22(木) 17:06:32
Dが完成する時=WalterタンがE言語に手を出す時
じゃないかな。

292 :デフォルトの名無しさん:2007/02/22(木) 17:09:31
Dが完成する時=Walterタンが飽きたとき

293 :デフォルトの名無しさん:2007/02/22(木) 18:18:25
他の誰かが受け継ぐ可能性も・・・

294 :デフォルトの名無しさん:2007/02/22(木) 18:29:57
      ☆ チン     マチクタビレタ〜
                        マチクタビレタ〜
       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ヽ ___\(\・∀・) < コルーチンまだ〜?
            \_/⊂ ⊂_ )   \_____________
          / ̄ ̄ ̄ ̄ ̄ ̄ /|
       | ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
       |  愛媛みかん  |/

295 :デフォルトの名無しさん:2007/02/22(木) 18:42:53
多倍長整数とかもあると嬉しい。

296 :デフォルトの名無しさん:2007/02/22(木) 19:40:27
多倍長型組み込まれないかなぁ
ライブラリでの提供より組み込み型の方がパッと見見やすい気がする
そんなもんどうでも良いと言うなら今から作る

297 :デフォルトの名無しさん:2007/02/22(木) 19:53:46
OutBufferがあってもInBufferがない。ついでにエンディアン関連も充実させてくれ。

298 :デフォルトの名無しさん:2007/02/22(木) 20:12:34
OutBufferって完全にMemoryStreamと役割かぶってて微妙なんだよなー
phobosを一度整理してこの手のライブラリ間の重複をなくして欲しい。

299 :デフォルトの名無しさん:2007/02/22(木) 20:40:27
このスレを見ている人はこんなスレも見ています。(ver 0.20)
【PS2】オトスタツOtostaz [家ゲー攻略]
べアルファレスを語るスレ part14 [家ゲーRPG]
【肉食いたい】お金くださいPart27【米もない】 [借金生活]
★合法的に誰かが金を貸してくれるスレ その42★ [借金生活]
45歳以上の転職Part7 -25 OR 6 TO 4- [転職]


300 :デフォルトの名無しさん:2007/02/23(金) 07:04:14
内部utf-16処理にしようとして、はてunicodeリテラルがあったかと我に帰る

301 :デフォルトの名無しさん:2007/02/23(金) 11:17:31
え、無かったっけ

302 :デフォルトの名無しさん:2007/02/23(金) 13:45:26
ttp://video.google.com/videoplay?docid=-7073020265668105471
Walter Bright @ NWCPP: Advanced D Programming Language Features

303 :デフォルトの名無しさん:2007/02/23(金) 14:25:07
手前の男の食い物が気になって気になって

304 :デフォルトの名無しさん:2007/02/23(金) 15:45:50
>>300
"ほげ"w
どっちにしろwcharを扱えるphobosの関数が足りてなくてどうしようもない。

305 :デフォルトの名無しさん:2007/02/23(金) 15:51:52
cast(wchar)hoge でもたしかUTF8からUTF16に変換してくれた気がする

306 :デフォルトの名無しさん:2007/02/23(金) 18:57:34
>>304-305
thx.

wchar[] apology =
"プログラムは動作を停止しました"w
~"解決策を確認しています"w
~"ご迷惑をおかけしまして申し訳ありません"w;

vip的になってしまった

307 :デフォルトの名無しさん:2007/02/23(金) 19:15:12
>>306
まぁD言語だと文字列は文脈に応じて自動的にwchar[]とかdchar[]にもなるからこれでいんだけどな
wchar[] apology = 
"プログラムは動作を停止しました"
"解決策を確認しています"
"ご迷惑をおかけしまして申し訳ありません";


308 :デフォルトの名無しさん:2007/02/23(金) 19:18:15
>>307
×文字列
○文字列リテラル

309 :デフォルトの名無しさん:2007/02/23(金) 20:23:26
>>308
お、すまんすまん。確かにその通り。
あんがと。

310 :デフォルトの名無しさん:2007/02/23(金) 20:34:39
>>302
Northwest C++ Users Groupの2007年集会で行われた、
WalterによるD言語のプレゼン……でいいのか?

トーク内容どころか右の要約(らしきもの)すらよく分からん(´・ω・`)
DとC++のコードを比較しながら
「mixinとかtupleとかscope guardとか良いものだー」って感じ?

311 :デフォルトの名無しさん:2007/02/23(金) 22:48:27
まぁ確かにmixinとかtupleとかscope guardは良いものだ

312 :デフォルトの名無しさん:2007/02/24(土) 00:01:09
tuple リテラルがないのは、いい文法が思いつかないからか?

313 :デフォルトの名無しさん:2007/02/24(土) 00:15:49
tupleってなにに使うのかよくわからない俺に誰か教えて欲しい。

314 :デフォルトの名無しさん:2007/02/24(土) 01:00:20
>>313 可変個引数テンプレートでしか使ってない俺

315 :デフォルトの名無しさん:2007/02/24(土) 02:04:17
nippleってなにに使うのかよくわからない俺に誰か教えて欲しい。

316 :デフォルトの名無しさん:2007/02/24(土) 02:21:11
サラミはおつまみですよ。

317 :デフォルトの名無しさん:2007/02/24(土) 02:39:16
D言語のエディタってまさかwindbg.exeじゃないよね?

318 :デフォルトの名無しさん:2007/02/24(土) 03:39:55
>>317
ネタは向こうでやってよ
http://pc10.2ch.net/test/read.cgi/tech/1164376614/l50


319 :デフォルトの名無しさん:2007/02/24(土) 05:24:43
エディタなんて付いてない

320 :デフォルトの名無しさん:2007/02/24(土) 08:30:58
>>313
適当に複数の値を戻り値にしたい場合に使える。
例えば Ruby だと

d, m = divmod(5, 2)

def divmod(x, y)
 return x / y, x % y
end

みたいにできる。
構造体使うのは各値に名前がつくからバグ抑制にはいいんだが、
適当にちょっとしたプログラムを作る時には少々うざったい。

321 :デフォルトの名無しさん:2007/02/24(土) 11:16:08
Dのtupleは関数から戻せないだろ

322 :313:2007/02/24(土) 12:04:27
おう成る程と思って試してみたらできなかったからちょい迷ってた。
公式で「関数からタプルを返せるように」 する予定は一応あるみたいだけども。

323 :デフォルトの名無しさん:2007/02/24(土) 12:25:44
%(int, int) divmod(int x, int y) {
 return %(x / y, x % y);
}

%(d, m) = divmod(x, y);

少しダサイか。
単項 % はないから導入可能な文法ではあるんだろうけど。
いくつか候補はあるけど、どうよ?

/(int, int) divmod(int x, int y) { return /(x / y, x % y); }      /(d, m) = divmod(x, y);
%(int, int) divmod(int x, int y) { return %(x / y, x % y); }      %(d, m) = divmod(x, y);
?(int, int) divmod(int x, int y) { return ?(x / y, x % y); }      ?(d, m) = divmod(x, y);
^(int, int) divmod(int x, int y) { return ^(x / y, x % y); }      ^(d, m) = divmod(x, y);
|(int, int) divmod(int x, int y) { return |(x / y, x % y); }       |(d, m) = divmod(x, y);
:(int, int) divmod(int x, int y) { return :(x / y, x % y); }       :(d, m) = divmod(x, y);
.(int, int) divmod(int x, int y) { return .(x / y, x % y); }       .(d, m) = divmod(x, y);
=(int, int) divmod(int x, int y) { return =(x / y, x % y); }      =(d, m) = divmod(x, y);
<(int, int) divmod(int x, int y) { return <(x / y, x % y); }      <(d, m) = divmod(x, y);
>(int, int) divmod(int x, int y) { return >(x / y, x % y); }      >(d, m) = divmod(x, y);
<<(int, int) divmod(int x, int y) { return <<(x / y, x % y); }    <<(d, m) = divmod(x, y);
>>(int, int) divmod(int x, int y) { return >>(x / y, x % y); }    >>(d, m) = divmod(x, y);
>>>(int, int) divmod(int x, int y) { return >>>(x / y, x % y); }  >>>(d, m) = divmod(x, y);
<=(int, int) divmod(int x, int y) { return <=(x / y, x % y); }    <=(d, m) = divmod(x, y);
>=(int, int) divmod(int x, int y) { return >=(x / y, x % y); }    >=(d, m) = divmod(x, y);

324 :デフォルトの名無しさん:2007/02/24(土) 13:51:11
こういうのはあかんのんか?

@(int, int) divmod(int x, int y) { return @(x / y, x % y); } @(d, m) = divmod(x, y);
$(int, int) divmod(int x, int y) { return $(x / y, x % y); } $(d, m) = divmod(x, y);
\(int, int) divmod(int x, int y) { return \(x / y, x % y); } \(d, m) = divmod(x, y);

325 :デフォルトの名無しさん:2007/02/24(土) 14:00:43
これがいいんだけどラベル構文があるから無理だし。
int:int divmod(int x, int y) { return x / y : x % y; } d:m = divmod(x, y);
""wのように[int,int]tって方法もありそう。

#タプルの連結を~でできるようにならないかなぁ。

326 :デフォルトの名無しさん:2007/02/24(土) 20:48:00
>>323
タプルリテラルがかけなくとも、単に型タプルを戻り値型のところに
書けるようになれば十分じゃない? Tuple!(int,int)てな感じで。
関数が(値タプルだけではなく)型タプルも返せるようになれば、
 template tuple(T...){
  Tuple!(T...) tuple(T...){
   return Tuple!(T...);
  }
 }
とかテンプレート関数を定義できるようになるだろうから、
テンプレート関数をコンパイル時実行させることを利用して
 tuple(int,int) func(){
  return 3,6
 }
とか書けるようになるだろうし。
castとかと類似の文面になる方がよいと思う。

327 :323じゃないけど:2007/02/24(土) 21:34:53
>>326
型タプルを返せるようになったならこうでしょ。
TL tuple(TL...)(TL tl){
  return tl;
}
下もこう。
tuple(int,int) func(){
  return tuple(3,6);
}
でも、やっぱタプルリテラルは必要。内部機能を使うのにimportをするのはダサい。

328 :デフォルトの名無しさん:2007/02/24(土) 23:21:12
キーワード導入したくないんだろうな、やっぱ。
でも、ここは導入してもいい気がする。

あと、タプルの展開もできるようにして欲しい。
Ruby だと配列を展開して引数に渡せるけど、あれみたいなやつを。

double foo(double x, double y) {
 return x / y;
}
auto x = tuple(1.0, 2.0);
writeln(foo(*x));

みたいな。


Ruby の関数の引数は確か実はタプルとして実装されてたと思うけど、
あれはコンマ演算子がタプル生成演算子になってるからできる芸当なんだよな。

D で C と同様の仕様のコンマ演算子って本当に必要なんだろうかね・・・と思ったけど、
三項演算子の中で複数の式を実行したい場合に必要と言えば必要か。
コンマ演算子は評価順が決まってるべきだけど、
引数は評価順が決まってない方が都合がいい場合もあるから、
両者を同一のモノで実装するのは速度との両立という観点からすればアレだし、
D では Ruby と同じにしない方が良さげだな。

329 :デフォルトの名無しさん:2007/02/24(土) 23:32:04
>>328
既にできるじゃん。
double foo(double x, double y) {
  return x / y;
}
auto x = TypeTuple!(1.0, 2.0);
writeln(foo(x));

330 :デフォルトの名無しさん:2007/02/25(日) 00:00:28
しまった。確認してなかった。
そうか、できるのか・・・。

331 :デフォルトの名無しさん:2007/02/25(日) 00:08:11
{
scope hoge = new File("foo.bar", FileMode.OutNew);
with(hoge){
writefln("Foo");
}
}

これを、

with(scope new File("foo.bar", FileMode.OutNew)){
writefln("Foo");
}

こうかけるようになったらいいなって思った。

332 :デフォルトの名無しさん:2007/02/25(日) 00:08:21
なんかD言語のタプルなんてどうでもよくて
Rubyの話をしに来てるみたいだな

333 :デフォルトの名無しさん:2007/02/25(日) 03:03:18
>>331
文法上は"with(Expression)"だからなぁ。
scopeは属性だからExpressionにはくっつけられないのよね。

でも、withのExpressionの値を保持しておく変数って、内部的に生成されてるはずだよね?
だとしたらその変数の型とかって、値から推論されて決まってるのかな。
「勝手に推論が使われて明示的な宣言ができない」部分があるってのは、良くない事な気がする。
推論は明示的な宣言を省略して簡略化できる機能、であってほしい。

……"with"を文法上は変数宣言っぽく扱って、修飾子がつけられるようにする、とか。

scope synchronized char[] with(["foo", "bar", "baz"]){
 writefln("Foo");
}

ああ、scopeとsynchronized以外に意味のある宣言が見当たらないや。
scopeのブロック外に出てるとかキモいし。

334 :デフォルトの名無しさん:2007/02/25(日) 04:31:48
絶賛放置中してしまっててすんません


335 :デフォルトの名無しさん:2007/02/25(日) 08:31:38
>>334

1,日本語覚えたてのウォルターたん
2,アスカが見参しちゃってるinabaたん
3,誤爆

336 :デフォルトの名無しさん:2007/02/25(日) 09:31:40
4, Dコンパイラ
5, GDC

337 :デフォルトの名無しさん:2007/02/25(日) 22:40:19
7,オレ達
8,2byte圏のみんな

338 :337:2007/02/25(日) 22:41:05
あぁw
6忘れてたw

339 :デフォルトの名無しさん:2007/02/25(日) 22:46:16
6 が絶賛放置中

340 :デフォルトの名無しさん:2007/02/26(月) 01:55:53
6, 後楽園遊園地で僕と悪臭

341 :デフォルトの名無しさん:2007/02/26(月) 05:30:09
>>340
空気嫁

342 :デフォルトの名無しさん:2007/02/26(月) 07:03:36
>>341 無理強いイクナイ

343 :デフォルトの名無しさん:2007/02/26(月) 09:46:49
あーあ……

いや、流れが潰れたからこれでいいのか。

344 :デフォルトの名無しさん:2007/02/26(月) 10:37:13
Dでコンソールアプリ作って
QtでGUIフロントエンドを作ると良い感じかもしれない。

345 :デフォルトの名無しさん:2007/02/26(月) 12:34:26
>>344
D言語のQtportingってもうあるのか?

346 :345:2007/02/26(月) 12:37:04
あっそっか、デザイナを使うってことね。

347 :デフォルトの名無しさん:2007/02/26(月) 13:38:01
Dにポーティングされていればベストなんだけどねぇ。
しかしQtのおかげでまたC++使い出すようになった・・・

348 :デフォルトの名無しさん:2007/02/26(月) 15:24:33
TrolltechがDに乗り換えるように仕向ければいいんだよ!
でもそんなことしたらKDEが凄い事になりそうだな。

349 :デフォルトの名無しさん:2007/02/26(月) 16:02:40
あるパッケージ(=ディレクトリ)内のモジュールを一括してimportする方法ってありましたっけ?

350 :デフォルトの名無しさん:2007/02/26(月) 16:21:40
ない
hoge.allというファイルでまとめてインポートする

351 :デフォルトの名無しさん:2007/02/26(月) 16:49:45
ここで流れをぶった切って質問。
Dって基本的な言語仕様とライブラリ関係のバグは一通り取れてる感じ?
ネイティブでモダンな言語として、C/C++の代わりにできれば使いたいんだけど。
(スレを一通り読んだ感じでは非常に心配なんだが・・・・)

352 :デフォルトの名無しさん:2007/02/26(月) 16:52:21
D言語はいつまでもunstable精神で躍進して参ります

353 :デフォルトの名無しさん:2007/02/26(月) 17:34:55
基本的な所の仕様が全然駄目だわな。

354 :デフォルトの名無しさん:2007/02/26(月) 17:40:36
Shift-JISとかEUC-JPとかUTF-16を扱いたいなら別の言語を使った方がいい。
UTF-8しか使わないならお勧め。

355 :デフォルトの名無しさん:2007/02/26(月) 17:47:56
QtってGPLでしょ。話にならない。LGPLならいいんだけど。

356 :デフォルトの名無しさん:2007/02/26(月) 20:17:49
>>351
本当にC/C++に疲れてるんだったら触れてみるのも良いかも。
まぁ大規模な仕様変更は無いにしても、機能追加やバグフィックスはまだあるだろうけどね。

357 :デフォルトの名無しさん:2007/02/26(月) 20:20:50
すまん。書いてる途中でエンター押しちまった・・・
後、他のやつが言うようにエンコードあたりはダメだけど、その辺はtangoとか使えば良いかもしれん。

358 :デフォルトの名無しさん:2007/02/26(月) 21:48:23
>>355
金払えばソース公開しなくていいよ

359 :デフォルトの名無しさん:2007/02/26(月) 22:34:12
GPLをそこまで毛嫌いする意味がわからない。
やっぱり売り物作ってると邪魔なのかなぁ。

360 :デフォルトの名無しさん:2007/02/26(月) 23:00:32
>>359
キモイGPL信者にGPLのソフトをしつこく薦められたことがあるから。

361 :デフォルトの名無しさん:2007/02/26(月) 23:02:21
感染力強すぎるからなあ
他に使いたいライブラリとぶつかってしまう場合もしばしばある

362 :デフォルトの名無しさん:2007/02/26(月) 23:07:57
>>360
なるほど。
なんにせよ押し付けはよろしくないよね。
俺も気を付ける。

>>361
まぁ感染力強すぎるのはあるよね。

363 :デフォルトの名無しさん:2007/02/27(火) 00:01:49
>>362
>なんにせよ押し付けはよろしくないよね。
>俺も気を付ける。

頼むからそうしてくれ。
オープンソース系のソフトで、よさそうなのがあっても
自分が他人からキモイ信者達と同じ人種に見られるのが
恥ずかしくて採用を見送ることがよくある。

364 :351:2007/02/27(火) 00:04:03
遅れたけど、みなさん情報感謝。
とにかく使い始めてみる。

365 :デフォルトの名無しさん:2007/02/27(火) 18:54:51
const char[][] x = ["a","b"];
static assert(x[0] == "a");
これってできないの?

366 :デフォルトの名無しさん:2007/02/27(火) 19:21:59
>>365
static assert(x[0] == "a"); → static assert(x[0] == 'a');
じゃないか?

367 :デフォルトの名無しさん:2007/02/27(火) 19:28:18
>>365
現状では無理。もしそれをできるようにするならdmdの配列リテラルの設計を文字リテラルと同じようにしないといけない。

368 :365:2007/02/27(火) 19:44:13
あぁ、むりなんだ。なんか直感的じゃないね。
特別な理由でもあるんかな

369 :デフォルトの名無しさん:2007/02/27(火) 19:46:59
Walterタソが配列リテラルの実装を手抜きしただけな予感。

370 :デフォルトの名無しさん:2007/02/27(火) 22:41:12
constが型修飾子じゃないから、
配列xがconstなだけでxの要素(である配列)はconstじゃないよ、
とかそういう理由かな。

371 :デフォルトの名無しさん:2007/02/27(火) 23:10:47
>>370
違うとおも。文字列リテラルだと宣言された型をスルーして値型(静的配列)として内部で扱ってたはずだけど、配列リテラルでは宣言時点でオブジェクトに書き込むようになってたはず。

372 :デフォルトの名無しさん:2007/02/28(水) 00:43:33
なるほど
仕様バグという話じゃないなら、今後の改善に期待か

373 :デフォルトの名無しさん:2007/02/28(水) 06:50:58
非常に亀レスなんだけども
lazyをdelegateに変換する時にこういうのはどうだろう

int delegate() dg;
void hoge( int delegate()[] d... ) {
dg = d[0];
}
int n = 12;
hoge(n);

374 :デフォルトの名無しさん:2007/02/28(水) 15:14:23
>>373
どこにlazyが

91 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)