[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 15:01 / Filesize : 201 KB / Number-of Response : 898
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

D言語 Part12



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

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

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

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

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

7 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 14:28:08 ]



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

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



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

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

13 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 03:03:53 ]
しまった。opApply じゃなくて onApply になってた・・・。

15 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 06:36:50 ]
DMD1.005なら、こうもできるみたいだが d.hatena.ne.jp/shinichiro_h/20070208
"あのmixin"が無いなら、__FILE__を付けるのはどうしようもない希ガス。

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


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

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

19 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 07:21:27 ]
scope(success)



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

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

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

24 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:15:35 ]
>悪名高い

kwsk


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

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

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

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

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



31 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 10:57:56 ]
いや、だから、やろうと思えばやれるけど、
最適化しても遅いからなんだかなあと・・・。

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

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

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


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

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

38 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 12:40:59 ]
普通に
foreach(i; 1..10)
 write(i);
ってかけたらいいんじゃね?

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




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

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

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

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

44 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 17:54:36 ]
ム板でインデントを認識、表示して欲しいなぁとかスレ違い

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

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

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


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



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

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

困るのは Python とかかな


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

54 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 21:05:11 ]
引っ張って悪いんだがインデント対応の2chブラウザってあるのか?
Jane使ってるんだけど実はできたりする?

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

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

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

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

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

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

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



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

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

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

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

64 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:49:39 ]
「制御構造」を関数化(モジュール化)するスマートな方法は、て感じか。

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

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

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

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

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

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

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

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

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

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



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

72 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 03:00:02 ]
forくらい使いこなせよ・・・

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

75 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:24:52 ]
ループの予感。色んな意味で。

77 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:47:52 ]
前者が後者に最適化されればそれで十分。
あとは読みやすさや書きやすさ、学習しやすさや保守しやすさ等の問題。

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

79 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:54:39 ]
配列の生成は超遅いんで、
opApply を持ったオブジェクトを返す実装にした方がいいけど、
それでも for には負ける。



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

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

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

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

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

}


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

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

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

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

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

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

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

ええんか?

88 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:12:46 ]
良いんじゃない?
あえてそのコードを書く必要性もないわけだし

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

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



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

}
とかにしろと

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

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

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

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

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

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

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

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

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

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

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








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<201KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef