>>1-2 テンプレ変更点
- "C/C++に疲れた人のD言語"のURL更新
- 関連スレ更新
一乙
980越えたから落ちたか。
Dython -- 仕様のかたまらない、ただひとつのインプリメンテーション
D言語の標準ライブラリって充実していますか?
C++の標準、boost並に充実しているなら乗り換えようかと思っているんですが。
わかっててきいてるだろw
10月ぐらいまでにはなんとかなる予定
>>11 すみませんガチで知りませんでした。
もう少ししたら良い環境ですね。
どうもありがとうございました。
本出る頃にはSTLレベルまではいってるだろうな。たぶん。
だといいなあ
標準が2つもあるという意味では充実してるw
STLやBoost並に充実してたとしてもGUIライブラリは・・・
最近バージョンアップしないね
月のものが遅れてますね><
何かが生まれるという認識でよろしいでしょうか
TLSと同種のメモリ周りの修正じゃないの
何かどこかで、こっちはまでできてないけど、みたいな記事を読んだぞ
うぉるたんはscope変数が書き換え可能なのをいい加減直すべき
getMembersはいつになったら…
allMembersじゃだめなの?
…というやりとりを以前にもここでしたような
コンパイルタイムリフレクションとラインタイムリフレクションは全く違うものだろう
関数1つレベルでコミットしたいんだが
bugzillaに送ってもなかなか反映してくれないなあ
パッチはっつけたら?
ほとんど反応ない
D2.0使ってるんだけど、
myObject[key] = value;
ってやった時に
myObject.opIndexAssign(value, key) よりも
myObject.opIndex(key).opAssign(value) が優先されるのはなんなの?
いつの間にか-safeつけるとコンパイルできない
一つ前のdmd使ってもコンパイルできない
俺は死んだ
何度でも蘇るさ!
ユニットテストなんて入ってるが、ソースの直ぐ下にそのまま書ける形式は、
テストに失敗してもその場でさっと修正しちゃえて良くない気がするな・・・。
番犬みたいのはある程度独立していないと懐柔されやすいというか。
しばらく考えたけど
テスト自体を修正しちゃえるからよくないって言ってる?
ユニットテストっていうか実験用コードっていう感じなんだよね。
まぁ、D的には仕様を守るための硬いテストみたいなものは、
そもそも邪悪なものなのかもしれんが・・・。
それは、真面目にその場にテストをみっちり書くとソースの可読性が著しく落ちるからだろうから、
mixinなりincludeなりでコードを分離するのがいいんじゃね?
なるほど。分離するならversionみたいにunittestも何か指定できたら
便利かなぁと思ったけど、version(MY_TEST)でいいか・・・。
だよね
version(unittest) {}
>>36 35の1行目は-unittest=STRICT / unittest (STRICT) { }みたいなことが
したいってことでちょっと違うかな。
>>39 「Dならそれくらい出来るだろwww」という気分で試して絶望しそうなイメージ
debugでいいやん
>>39 それやる意味って何かあるの?単体テストは全て通らなければ意味がない気がするのだけど…
それよりは、実行ファイルを作らない限りunittestが実行できないって方が問題のような気がする
最初はコンパイルする時にやってくれるものと思ってた俺
>>42 さすがに全部通るか通らないかしかないとちょっと息苦しい
普段は時間がかかるテストはスキップするとかできてもいいんじゃないか
>>39 それってunittest内でversion分岐させた方が分かり易くないか?
47 :
デフォルトの名無しさん:2009/06/28(日) 23:20:25
>>42-43 rdmd -unittest hoge.d → エントリポイントを自動で追加 → 実行。
っていうふうにできてたらなあ。
>>47 っ
version(unittest) void main() { }
49 :
デフォルトの名無しさん:2009/06/29(月) 01:25:33
>>48 でも、それだとファイルが複数になった時(どこにmain()書いたか?とか)ややこしくならない?
むしろユニットテストしか実行しないexe作るオプションください
assert(typeid(void function(int)) == typeid(void function(long)));
おいィ?
は?
ttp://shoo.s20.xrea.com/shoo/programing/chirno_quality/0002.html ここの講座見てDFL使おうとしたら、コンパイルエラー。
dfl\internal\com.d(218): Error: no property 'seek' for type 'tango.io.model.IConduit.IConduit.Seek'
dfl\internal\com.d(218): Error: no property 'Anchor' for type 'tango.io.model.IConduit.IConduit.Seek'
dfl\internal\com.d(218): Error: no property 'Begin' for type 'int'
dfl\internal\com.d(218): Error: function expected before (), not 1 of type int
〜〜〜以下省略〜〜〜
入れたのは
tango-0.99.8-bin-win32-dmd.1.041
dsss-0.78-x86-windows
dmc.zipのlibの中身
DFL 0.9.8 zip archive
import\dfl\internal\dlib.d の464行目を
alias tango.io.model.IConduit.IConduit.Seek DSeekStream;
から
alias tango.io.model.IConduit.IOStream DSeekStream;
に書き換えたら、なんとかコンパイル通ったよ。
D言語初心者にハードルたけーよ、DFL。(;´Д`)
試したけど、同じだった。Snapshotsのページに、
Note: Tango is not yet supported in this snapshot, please use the release version and be sure to use the compatible version of DMD.
と書いてあるし、まだみたい。
>D言語初心者にハードルたけーよ、DFL。(;´Д`)
tango使っておいて初心者はないw
phobosならいけね?
この前2.030環境に入れたけど色々トラブル出た気がする
D1ならイけるんじゃね?
dmd 1.043/dmd 2.030
---
int a = 5;
assert (a.init == 0); // success
assert (a.init == 5); // fail
なん…だと…?
mac osxで開発してる人いる?
ここにいますよ
DFLつかうならTango 0.99.7とDFL0.98の組み合わせにしておけばシアワセ
>>56 逆。右も左もわからないから普通のライブラリのノリで入れちゃうんだよ
まさか標準ライブラリを置き換えてしかも互換性がないものとは思わない
>>58 結構昔にそういう仕様になったよ
それのせいで昔のソースをビルドした時大変だった
>>51 関数の型比較は引数の型だけで判断されるんじゃね?
TypeInfo_Function にも TypeInfo_Delegate にも
引数の情報を格納する場所はないし
>>63 マジですか
和訳はともかく本家のドキュメント直ってないってなんなの
うぉるたんはTangoの事どう思ってんの?
>>66 TangoとPhobosは仲良くなれるように努力している。
将来的にはTangoとPhobosの両方のいいところを選択的に使えるようにする。
TangoはライセンスがPhobosと違うので気軽に取り込めなくて残念。
…てかんじのコメントだったと思うよ。
>>68 俺はD言語の何も理解していなかったようだ
って気分になる
>>65 ChangeLogとかドキュメントで読んだ気がする……んだけど、どこにも書いてないな……
俺はどこで知ったんだろう……
> Version D 2.001 Jun 27, 2007
> * The .init property for a variable is now based on its type, not its initializer.
2年前だぞw
>>71 この書き方だと今はそうなってるけど元に戻すつもりがあるってことなんだろうか
どっちにしろもう戻らないだろうけど
>>73 "〜 is now 〜"は昔と違って今は〜だってニュアンスじゃなかったっけ?
>>68 >ではDの場合はどうでしょう? もう聞いたことがあるかもしれません - 名前のダジャレがやり過ぎな言語。
>他の言語の専用ニュースグループでときどき話題になり、オフトピックな話題に厳しい人達が怒って止めさせるまで鬱陶しい。
>友人に熱狂的なファンがいる。
>あるいは単に、暇潰しに「この広いインターネットには、Dという名前の言語を作った馬鹿がいるに違いない」
>と検索してみた結果、「ああ、やっぱりいた!」
噴いたwwwww
>>68 ところどころわかりにくいんだけど面白えw
アレキサンドレスクD好きすぎる。訳の人gjです。
alias Variant dynamic;
ところでメソッドからdelegateを取ったときにref返値の情報が消えちゃって左辺にできないんだけどどうすればいいの?
ほんとだな。
int x;
class C {
static ref int f() { return x; }
ref int g() { return x; }
}
void main() {
(&C.f)() = 0; // ok
(&(new C).g)() = 0; // error
}
return書くの秋田
C#のアロー記法みたいなのほしいよなあ。
int delegate(int) dg = x \ x * 2; // == (int x){return x*2;}
int k = dg(1);
assert(k == 2);
こうなる予定だったよね?
>>83 うまく英語で説明できないから誰か報告してみてちょー
>>86 それなんかきもいな。
バックスラッシュはλの代わりだから前に書きたい。
> auto square = \x => x * 2;
>
> auto i = square(2); // typeof(i) == int
> auto d = square(2.5); // typeof(d) == double
強い静的型付き言語だけど、ソースコード上に型を書かなくていいような言語が使いたい。
円マークがすごく悲しい構文です
>>88 OCaml
型推論で80%の型名を書かなくていいネイティブ吐ける関数型言語
Dは全然知らないのですが
アセンブラレベルでの呼び出し規約は
デフォルトで何を使ってるんですか?
ちょっと興味があったもので
>>88 本質的じゃないが、それsquareじゃないだろ
93 :
デフォルトの名無しさん:2009/07/03(金) 16:51:13
デリゲートのジェネリック化はできてほしいねえ
>>93 ありがとう
完全に独自なのか
型情報をマングリングしたり
関数側でスタックを処理するのに
可変引数がサポートされたりしてて面白い
class A {
const(A) a;
}
うわ途中投稿したorz
class A {
const(B) b;
void setB(in B b) {
this.b = b; // 駄目
}
}
constな型とconstな変数が区別されてないのってなんでだろ?
このsetAみたいな事やろうとして八方塞りになった
98 :
97:2009/07/04(土) 13:52:28
○setB
×setA
慌てすぎで死んだ
Rebindable
>>97 クラス型が参照型(要するにポインタ)であることを考えれば、別に何もおかしいことではないと思う。
struct S { }
class A {
const(S*) b;
void setB(const S* b) {
this.b = b; // 駄目
}
}
これに対する解決法は
>>99だけど、言語のほうで何とかしてほしいのはたしか。
それと、これはまだ実装されてないけど、inはscopeを含むので、
in引数の内容をスコープ外にコピーすることはできない。
>>97 最近同じポイントではまりました。
>>99 >>100 AとRebindable!(A)はisによる同一性比較が出来ないのが欠点。
なんでDはC++みたいに参照と値を分離しなかったのか…
>>99-100 あーなるほど、なるほどなぁ
とりあえずは解決しそうです。ありがとうございました。
解決はするけど、確かにもうちょっとスマートになってほしいな
Rebindableって参照がnullかどうか調べられないのか
>>103 import std.typecons;
class A{}
void main()
{
Rebindable!(const(A)) a = new A();
// if( !a ){
// if( a is null ){
if( a.opDot is null ){
}
}
Rebindableそのものはstructなので!やis nullで直接調べられない
opDotでconst(A)を取り出さないとダメ
>>104 そうか、opDotを直接呼べばいいのか
getがprivateだどうすんべとか言って悩んでたthx
const関係の話は俺の貧弱な脳には意味不
ウォルたんも混乱してる悪寒
ポインタでさしてたものがガベコレでずれるとか。
Dで実装されたパーサジェネレータってある?
111 :
デフォルトの名無しさん:2009/07/05(日) 13:13:44
export template
>>111 ありがとう。でも、最新版のD2でコンパイル通るものはなかった
114 :
デフォルトの名無しさん:2009/07/05(日) 19:57:03
D2に対応してるライブラリは少ないよ
規模が小さいものに手を入れるといいかと
Tangoのおかげで未だD1にしがみついているのが多いんだよなー
DWT放置プレイいつ終わるの?
さっさとD2.0の仕様が固定されないとTangoも2.0に対応しないだろうよ…
branches/experimental/D2.0は何カ月も前からコンパイルできなかったと思うし
case '1': .. case '9':
___
/ || ̄ ̄|| ∧_∧
|.....||__|| ( ) どうしてこうなった・・・
| ̄ ̄\三⊂/ ̄ ̄ ̄/
| | ( ./ /
___
/ || ̄ ̄|| ∧_∧
|.....||__|| ( ^ω^ ) どうしてこうなった!?
| ̄ ̄\三⊂/ ̄ ̄ ̄/
| | ( ./ /
___ ♪ ∧__,∧.∩
/ || ̄ ̄|| r( ^ω^ )ノ どうしてこうなった!
|.....||__|| └‐、 レ´`ヽ どうしてこうなった!
| ̄ ̄\三 / ̄ ̄ ̄/ノ´` ♪
| | ( ./ /
___ ♪ ∩∧__,∧
/ || ̄ ̄|| _ ヽ( ^ω^ )7 どうしてこうなった!
|.....||__|| /`ヽJ ,‐┘ どうしてこうなった!
| ̄ ̄\三 / ̄ ̄ ̄/ ´`ヽ、_ ノ
| | ( ./ / `) ) ♪
だからa..bをRangeExpressionとしろとあれほど(ry
んで後ろを含む..=とか、前後の上下をはっきりさせた.<や.<=や.>や.>=を導入すれば良かっただろうに
enum!!
えーと。
D 2.031
・ルートを\dmdから\dmd2に
・with文でローカルのシンボルと重複すると隠すのでエラー
・final switch(expr)
・case 1: .. case 5:
・暗黙の整数変換で符号ビットが落ちる変換はエラー
・return exp;がないのは警告じゃなくてエラー
・dmdの吐くエラーはstderrに出すように
・フロントエンド高速化のパッチ
・std.algorithm : swapの高速化、あといくつか追加
・std.array : 関数追加
・std.conv : enum値を表示/解析するコードを追加
・std.ctype : isupperとtolowerをpureに
・std.date : benchmarkの返値をuint[]からulong[]に
・std.demangle : switchとcaseの新文法に対応して変更
・std.random : randomSample追加
・std.string : find系をdeprecatedに。starstWith、endsWithを削除
・std.traits : isSomeChar と isPointer追加
・std.typetuple : indexOfをindexOfTypeに。前の名前はaliasで残してdeprecated
・std.utf : エラーメッセージ改善
124 :
デフォルトの名無しさん:2009/07/06(月) 19:33:14
>>123 final switchは「全条件について書く」、defaultなし、CaseRangeなし、enumを受ける場合enum全条件のcase強制、か。
以前に「gotoの行き先のラベルのアドレスが欲しい」という話があったが、
final switchだとほぼ同等のことができるな。defaultがないからほぼO(1)のルーチンに最適化可能のはず。
case 1 .. 9:
ではいけない理由がわからないんだけど誰か教えて
>>125 それでいいよなあ
何とかしてよドラえもん
>>125 case 1 .. 9:
だとスライスの連想から、1<=x<9のような感じがするが、
case 1: .. case 9:
だと、いかにも9を含みそうな感じがする。
という説明がNGでなされている。
ちなみにこの構文はandreiの発案。まじきもい
ぶっちゃけ、case 1..9: でも、case 1: .. case 9: でも、どうせ使わないからどうでもいいとか言ってみる。
130 :
デフォルトの名無しさん:2009/07/06(月) 22:23:56
>(fainal switchの)The case expressions cannot evaluate to a run time initialized value.
と言うことは、普通の switch 文なら case j: とか…
…できるじゃあないかッ!いつからこんなことが?
andreiか
andreiじゃあしょうがないな
132 :
デフォルトの名無しさん:2009/07/06(月) 22:33:08
昨年の4月から
>>124 ラベルのアドレスならcaseの中から直接次のcaseへジャンプするように
書けるから同等ではないかと。それでもO(1) switchはかなりうれしいけど。
switch-case-break自体がキモいのをどうにかしてほしかった
fallthroughなんかgoto caseがあればいいじゃないか…
>>127 1<=x<=9のような感じを出したいならcase 1..=9:とすりゃいいのに
>>135 C言語だとfall throughは結構使われる…が、確かにD言語だとcaseに複数指定可能でgoto caseがあるから無くした方が良い気もするな。
まぁC言語使いが混乱しないようにfall through禁止の上でbreak必須にするという所が現実的な気がする。
ngでもugly ugly言われててワロタw
もうswitch-caseを捨ててselect-caseを新設しようぜ
fall throughなしでbreakなしにするんだ
select(n){
case 0, 1, 2:
case 3 .. 5: // 3,4
case 5 ... 7: // 5,6,7
default:
}
>>139 case is構文の新設ですね、分かります。
case-whenでもcondでもなんでもいい
a..bでbを含まなくてa...bでbを含むってのはどこの言語がもとだっけ?
rubyは逆で..で含む、...で含まないだからかなり分かりづらい
今から..の意味を変えるのとどっちがわかりにくいかって話だな
...の方がより遠くを指しているように見えるから
a...bでbを含むでいいんじゃね?
別の言語と異なってもいいだろ別に
CaseRangeに賛成意見述べてるのって、アンドレイとウォルたんだけなんだけど。
>>151 テラカワイソスwww
しかし引かぬ媚びぬ
アンドレイ「おまえらはこの構文の美しさがわからんのか。少なくとも俺はuglyとはおもわねえ!」
その他「いや、俺は汚いと思うね」
ウォルター「スライスの..は末尾を含んで、CaseRangeの..は末尾を含まないから、混乱を避けるために全く別の構文にする必要がある」
その他「だから別の演算子導入すればいいって言ってるだろ!」
こういう応酬が延々と繰り広げられてるんだが…
さすがにコレは嫌すぎるなあ…w
なので英語圏の皆さんには頑張っていただきたい
case '0':
..
case '9':
と複数行にすれば案外いけるかもしれん
それよりそろそろ見慣れてきた俺ガイル
一行に単独で..が現れたときは上下の行で異なっているところを変化させながら反復するマクロにしようぜ!
f!(0);
..
f!(9);
mixin("int a;");
..
mixin("int z;");
かっけええええwwwwwwwwww
>>158 それなら、mixinとか使わなくて、
int a;
..
int z;
でいいだろ…
for文いらねー
writeln(1);
..
writeln(100000);
writeln(i+0);
..
writeln(i+100000);
goto caseなんかあったのか
DMD2系+Eclipse+Descentで使おうと思っています。
googleで調べながら一通りインストールしてサンプルをビルドしようとしたら
「'DMDの起動'に問題が発生しました。Variable references empty selection: ${project_loc}」
というエラーが出てしまいます。
作業ディレクトリーが${project_loc}
引数が${resource_loc} -g
という設定にしているんですが、どうもここがまずそうです。
どういう設定にすればいいのでしょうか?
エディター部分にフォーカスが無いとか?
wcのサンプルってだいぶ古くないか・・・?
更新のたびにいちいち修正されてるのか?それならすごいけど・・・
>>167 samplesディレクトリのは更新されてない。たぶんコンパイルとおらんだろう。
ドキュメントに書いてあるのは修正されてる。
それはともかく
>>166のは
サンプルがD2なのにstringの中身を変更してるだけかな?
そこ直したらコンパイルは出来た
bufにstringはない罠
サンプルは一度刷新されたはずだが、何年前だったかな。って世界。
お薦めのIDEってなんですか?
is(typeof(...)) ってのに新しいキーワード割り当てて欲しいなあ
いやーそのままでいいんじゃ
is_typo
一瞬Code::Blocks使おうとしてみたけどキーワード登録が面倒になってやめた
サクラたんかわいいよサクラたん
前スレみる限りエディタ+makeが主流という悲しい現実。
180 :
デフォルトの名無しさん:2009/07/10(金) 03:35:23
DWTで誰か作ってくれるっていう話があったような
omake便利っすよ
D.om書かないとダメだけど
>>180 むしろDWTって今誰か開発続けてるの?
Poseidonは、DWT使ってるよね。
むしろPoseidonって今誰か開発続けてるの?
emacs
秀丸+ビルド用秀丸マクロ(やねうらおさんのがベース)+bud
ポセイドン使ってみたんですがビルドしようとしたら
コンパイラ見つからないと出るのですが
プロジェクト生成時にパスは設定してます
標準にシリアライズを支援する物はないですか?
C++のboost::serializationみたいなやつ。
そういう便利な物はない。
秀丸
シリアライズ面倒だから全部XMLにしたわ
ポセイドンで書いてコマンドでコンパイル・・
>>190と同じくコンパイルができない。
秀丸のファイルタイプ別の設定ファイル探すか書いてみるか
phobosにシリアライズみたいなのなかったっけ?
198 :
デフォルトの名無しさん:2009/07/13(月) 23:39:19
Ver1.030から1.046にかけてdmdディレクトリの構成変わってるのなんでですか?
OSごとにバイナリとか分けたかった時期か?
>>198 macとかfreebsdとかサポートするため。
>>201 std.outbufferは割と便利
テキスト形式で書き出すならstd.file.slurp()が読み込みに使えそう
シリアライズってバイナリ限定だっけ?
Dって依存関係吐いてくれるオプションないの?gcc -MMみたいな
-v
うおおありがとう
64ビットの実装はいつ出るのかねぇ?
待ちきれなくてgdcに2.031移植しようとしたが挫折したorz
シリアライズはstd.outbufferがあるのに、デシリアライズはなんで何もないんですか?
昔はstd.inbufferがあった気がするんだけど思い違い?
import std.typecons;
interface It {}
class A {
Rebindable!(const(It)) ireb; // ItがObjectじゃないためNG
Rebindable!(const(A)) reb;
const const(A) get() {
return reb.opDot; // RebindableのopDotがconstじゃないためNG
}
Rebindable!(const(A))[string] assoc;
void put(const(A) a) {
// opAssignが呼ばれてしまい実行時エラー
assoc["test"] = a;
}
}
('A`) ウボァー
最近のDはだらしねえな
昔からphobosはこんな感じだよ
Rebindableにgetなる無意味なaliasがあるんだけど
たぶんこれpublicにしたかったんだな
std.outbufferとstd.inbufferを足してstd.serializeってのを作ったらどうだ
215 :
デフォルトの名無しさん:2009/07/15(水) 07:45:33
2になった途端1時代のソースがことごとくコンパイルできない
この互換のなさ酷すぎ。。。
それは、
> C#になったとたんC時代のソースがことごとくコンパイルできない
>
> この互換のなさ酷すぎ。。。
といっているようなもの。
コンパイル通らないと喜んじゃうMばかりのスレ。
っていうか互換性重視して切り捨てられない部分が出てくるよりよっぽどいいよ。
別の言語かよ
>>218 流石にあの例はちょっと
>>217 C++とは別の方向性を持った言語の行く末を見守るスレでもあります
インターネット上のファイルをダウンロードするにはどうすればいいですか?
まずTCP接続をします
そして生のHTTPでやりとりします
>>221-222 std.socketを使うことになるんですかね?
難しそうですね。
Cで書いて、それを呼び出す方が楽かなぁ。
Cで書くならDで書いても一緒だろ…
>>224 Cでいうところのwininet.hがDにはなくないですか?
CのヘッダファイルをDに変換するんですよ…
D1でTangoのtango.net.http.HttpGetつかったら?
2行でできるよ
>>226 wininet.hだけでも3900行もあるし、Cで必要な部分だけラッパを書いた方が楽かなぁと。
>>227 なるほど。D1のTangoにはあるんですね。
待てばPhobosにもHTTP関連は入るはず
たいていのWin32APIのヘッダはすでに変換された物があるから、それを拾ってくればいいよ。
>>233 おお、まさに求めていたものが・・・。
ありがとうございました。
なんかネタねえの?
dmdじゃなくGCD使うメリットって何かあるんですか?
最新版で1年前に書いたコードがコンパイルできるとか?
C++のvectorのreserve(1000)は、Dの動的配列に置き換えると、
auto len = arr.length;
arr.length = 1000;
arr.length = len;
これでおk?
dmd使ったことないんで知らないけど、
cのライブラリを積極的に使うならgdcのほうが楽だと信じてる。
gccで吐いたバイナリそのまま使えるし。
想定通りに動くとして、元のlengthが1000より小さい保証がないな
それ、本家に書いたらstd.arrayにテンプレートとして組み込んでくれるんじゃないか。
配列の疑似プロパティでarr.reserve(1000)で通るようになるかと。
こんな感じか
void reserve(T)(T[] a, size_t reserve_len)
in {
assert(a.length<len);
}
body {
auto len = arr.length;
arr.length = reserve_len;
arr.length = len;
}
assertで止まられても・・・
>>242 たしかにチェックしないとだめだった。
英語できないのでどなたかお願いしますorz
Dでは配列のopCatは常にコピーを作るから、配列をreserveすることに何も意味がない
大きい配列を割り当てて、それのスライスを使えばいいだけ
>237
gdbでデバッグできる
>>246 大きい配列のサイズを1000として、それのスライスのサイズが1000を超えた時、
配列が2つアロケートされたままになるのが気持ち悪くない?
ガベコレがある言語では気にする意味なし?
vectorみたいなものを作ったけど、vector!(int)とか書くのが不便で
自分でも全然使ってない。ユーザー定義リテラルキボンヌ
ユーザー定義リテラルはやめといたほうが
ユーザー定義リテラルはコンパイルが遅くなる原因だからな
vector!intで通らない?
std::vector<int>と変わらないだろ
autoもあるんだし
vectorは組み込み配列で概ね代替可能だから、あとはdequeとlistとsetがほしい…
DTLってThe Case For Dをみてると最大限Dを活かすための、ぼくのかんがえたさいきょうのコンテナライブラリを構想してる段階な感じなのかな?
Dって速い?
速いよ、ビルドが
実行速度はC++よりちょい遅いくらい
関数の引数につけるin,out,refってクラスにつけても意味ないですか?
あとconstはC++の感覚で、つけられるところは全てつけていくべきですかね?
>>257 クラス型でもinをつければconstと同じ意味があるし、outやrefは参照変数になる。
constやimmutableは積極的につけるべき。
in, out, refは意味論としてそうあるべき引数にそう付ければいい
ほとんどinになるけど。
推移的constなのでモリモリとconstを書く必要はないが、逆にそれが嫌という例もある
むしろpure, nothrowの方が重要
>>258-259 レスthx
C++でconst参照で受け取ってた部分は、Dではinにすればいいんですね。
pureとnothrowも意識してみます。
const参照はconst ref
Rangeを表す構造体やクラスに対する foreach
ってあるけどさ、これってそのうちpopFrontとかfrontってのに書き変わるのかな?
現状Phobosの中のRangeのそれと食い違ってて混乱の元になる気がするのだけど。
>>262 それはドキュメントが更新されてないだけ。
実装はfront/popFront/emptyになってる。
>>261 Dのクラスは常に参照だからinでconst参照と思ったんですが、違いがあるんですか?
構造体の場合に違うのかな。
C++から移行したものにはガベコレが難しい。
inだと参照の値渡し。refだと参照の参照渡しになる。
参照型の参照と参照渡しの参照は若干意味が違う。
>>266 なるほど、const refとすると推移的constによって、クラスの非constメンバにアクセスできなくなるって事ですね。
でも、in MyClassで全て間に合う気がしてしまいます。
const ref MyClassとする事によって役に立つケースはどんなものがありますか?
Dの標準ライブラリにほかのプロセスを起動したりパイプで繋いで入出力するものありますか?
>>267 ref引数にはlvalueの参照を渡すわけだから、変数を書き換えられるようになるわけですよ
いつの間にcore.sync.*が追加された…?
でもまだドキュメント化されてない…?
そう簡単にドキュメント化されるものか
ドキュメントはあるのにどこにもリンクが無いstd.perfさんの立場も考えろよ
std.perfはstd.date.benchmarkのせいで要らない子扱いになってた気が
benchmarkは流れの中にある一部の処理を測りたい時とかに不便な気が
というかなんでstd.dateの中にあんの?
>>271 正直スマンかった…
まぁ、core.sync.*はTangoのそれと同じみたいだからそれ見ればいい話か…
tangoとの統合の一環なのな
でstd.inbufferどこいったのよ・・・
>>276 俺も気になってた。
1.0系、2.0系どっちの更新履歴にも名前すら出てこない。
>>277 古いのを何個か落として確認してみたけど、なかったよ。
OutBufferのドキュメントにInBufferの名前があるだけ。
不変条件があるとrefメンバ関数使えない?
class A{
int a;
invariant(){}
ref int fn(){
return a;
}
}
バグ
invariant()の中でメソッド呼び出すと無限再帰になるの何とかしてほしい
参照カウンタ方式のクラスが欲しい
システムプログラミング言語だったら、プログラマの意図したときに解放させたいと思うときがあるはず
構造体のctor/dtor/postblit使えば簡単にかける
書けることは書けるんだが、
sharedRef!(A) a = sharedRef!(A)(new A);
とかやんないといけないからメンドイのです
auto a = sref(new A);
とかまでならできるんじゃないか?ヘルプ関数使えば。
Dに慣れてautoから離れられない体になってしまいました
287 :
デフォルトの名無しさん:2009/07/19(日) 16:09:19
近代C系文法はみんな備えるようになってないか?autoは。
aliasで短縮するだけでもだいぶ違う。
っていうかscopeをクラスメンバで使わせてほしい
なんでref変数ないの?
嫌がらせ?
焦らしプレイです
FiberいつのまにPhobosにきたの!!!!!!??!?
>>293 嬉しいよねー。パフォーマンスどうなんだろう。
わからない…Fiberのよさがわからない…
だれかFiberの旨味を教えてくれ…
弾幕作るときにあると楽
状態遷移が楽に書けるんだよね。遷移のトリガのチェックにループ使えるし。
オブジェクトに状態の変数持たせなくてもローカル変数で済むし。
Stateパターンいちいち使うのもめんどいからなあ。
ゲーム作るときにちょっと便利かも
使ったことないけど、yieldのときに値を返したり受けたりできないのは不便な気がする。
リファレンスカウンタ方式のGCみたいなもんだ
Dで書かれた代表的なアプリケーションは
>>302 ABAさんのゲーム
poeny
芝が生えるゲーム
2ch viewer
Poseidon
final switch使って-wつけてコンパイルしたらめっちゃ怒られて死んだ
range caseどうなったん?
>>302 後は研究や仕事のデータ処理に使ってる人がいるくらいで
公開されたアプリケーションはあんまりないよね
自分しか使わないツール作るのはすごい楽。
>>309 現状言語自体が不安定すぎだしコンパイラの検証・バグ取りも済んでいないので、
放棄不可でメンテナンスが必要なものには使えないというのが実情かな。
言語自体の素性は良いので自分専用のツールを作るにはもってこいだが。
便利なCとして使うには癖が強すぎるからじゃないかな
Scalaみたいな言語の登場を考えるに、言語開発速度が遅すぎて時代遅れの感。
今後はJVMかLLVMの上で動く言語を考えるべきじゃなかろうか。
いやこれはsystems programming languageなので
システム言語として生きるなら、GC周りは決着すべきことが多いかなという気がするがなあ。
現状は、最新世代レベルの記述力を持ってバイナリをゲロる言語という感じだが。
GCを取り除いたバージョンのDも触ってみたいね
DWTでアプリ作ってるんだけどDWT諸共死にそうで恐い
Dで書かれた(書こうとしている)OSってあったっけ?
MonaOS?
今はないかと
OSにGCが採用されたら実行可能ファイルのファイルプロパティに
GCアルゴリズムが選択出来るようになってるんだろうか。
公式的にはQtDがおすすめのような雰囲気を感じる
ユーザー増やすのに重要なのは言語じゃなくてライブラリだからなぁ。
極端な話ライブラリさえあればH○Pみたいな言語仕様でもアプリを書いてもらえるのに、
言語だけどんどん改訂していくものだからいつまで経っても良いサイクルに入らない。
JVMはスループット重視か最悪値最小化重視かを選択できる。
ビルド時にオプション指定できる程度で十分だろうけど。
>>322 いや、少なくともDに関しては
「仕様が固まってないから」という理由が大きい。
だって、せっかく作ったものでも、
ちょっとバージョンが変わるだけでコンパイルさえ通らなくなるようじゃ
怖くて大規模なものには手を出せない。
バージョンアップを楽しめる一部の人を除いて。
eclipse3.5にdescent入れようとしたらエラーが出ました。
3.4には入ったんですが、3.5には対応してないってことなんですかね?
そんなことはない
329 :
327:2009/07/25(土) 06:49:54
all in oneを入れなおしたら入りました。
>>330 向こうのレスにある
> テンプレートとプリプロセッサの黒魔術で無理矢理DSLを作ってどうにかする
だよ。
auto result = linq!q{
from n in numbers
where n % 2 == 0
select n
};
0x風の書き方にするとauto result = linq<"from ... n">というような式で、
linq = テンプレート関数か何かを指すシンボル。
! = テンプレートの明示的インスタンス化。テンプレートパラメタ(cppで言う<>の中身)を続けて書くと括弧が省略できる。
q{ .. } Dで有効なトークンのみを記述することが出来る文字列リテラル(これがテンプレートパラメタ)
linqの中身をコンパイル時または実行時パーサにすると、そういう構文が書けるというお話。
しばらく前にお遊びで作られた黒魔術の一つ。
実用に供すことも可能だが、やった人は知らん。
っつか0xスレでもDはGCが邪魔という話になってたのか
向こうを久方ぶりに見たが、まったく同じ内容のレスがあるとは
>>330 面白そうだから書いてみた(適当だけど)。ASTマクロが実装されてからが本番だな。
//Public Domain
string[] lexLinq(string code){
string[] r = [""];
foreach(c; code){
if(c == ' ' || c == '\r' || c == '\n' || c == '\t'){
if(r[r.length-1] != "") r ~= "";
continue;
}
r[r.length-1] ~= c;
}
return r;
}
string translateLinq(string code){
string aggregate, variable, condition, item, cur;
foreach(i, a; lexLinq(code)){
if (a == "from" || a == "in" || a == "where" || a == "select"){
cur = a;
continue;
}
if (cur == "from" ) variable ~= " " ~ a;
if (cur == "in" ) aggregate ~= " " ~ a; // 複数の時はstd.rangeに落とすべき
if (cur == "where" ) condition ~= " " ~ a;
if (cur == "select") item ~= " " ~ a;
}
return "
alias typeof({
mixin(\"foreach(index, "~variable~"; "~aggregate~")return "~item~";\");
assert(0);
}())[] ResultType; // イテレータかレンジで返すべき
ResultType r;
foreach(index, "~variable~"; "~aggregate~"){
if ("~condition~") r ~= "~item~";
}
";
}
auto linq(string code, T)(T numbers){ // ASTマクロが実装されたら関数の引数は無くせる。
mixin(translateLinq(code));
return r;
}
import std.stdio;
void main(){
auto numbers = [1,2,3,4][];
auto result = linq!q{
from n in numbers
where n % 2 == 0
select n
}(numbers);
writefln(result);
}
違いはGCと文法と実装のしやすさとコンパイル速度ってかんじか?
GCない方がいいってのはなんでだ?GCあったってリソースの管理くらいできるのに。
2ch内ではD言語をゲーム目的くらいにしか使わないからじゃね?
GC使っていい環境なら素直にJavaやC#使ってるよ
そうじゃないからこそ敢えてC++使ってることが多い
なるほど、環境によっては確かにGC使えない環境もあるかも。
ところで、GC使えなくてC++使える環境ってたとえば何があるかな?
マイコンとかだとC++すら使えなかったりしないか?
バイナリが200KBも大きくなるのが我慢ならないとか
>>341 うーん
そういう人は何があっても新しいものに移行しない希ガスるので放っておくしか
struct shared_ptr{} 作ってください
実際たいしたコード書いてない奴ほどGCに言及する傾向
httpdやsshdのライブラリってある?
60FPSで回すとGCの挙動が気になるのは当たり前
スレッド毎にコレクトするならいいんだけどなぁ
スレッドローカル仕様になったし、そうなることに期待
ああ,TLSになったら依存関係の木構造が小規模になるから
スレッドごとにコレクトしやすくなるのか
>>346 どのトピックか忘れたけどSeanが「スレッド毎にGCを動作させるようにする」みたいなこと言ってた気がする
コンカレントGCってのに憧れてるんですけどD言語にそういう機能とか予定とかありませんか?
Cの文字列をchar*型で渡されたとします。
これをchar[]型にコピーする最も簡単な方法は何ですか?
>>348 それ、ロックレスなアルゴリズムと相性悪そうだな。
>>349 むしろPauseless GCが欲しい。ページフォルトをトラップすればいけるはず?
>>350 import std.conv
to!string(cstring).dup
クラスって常に参照型で扱われますよね。
参照の先がnewによって生成された物じゃない場合ってどうなってるんですか?
参照カウント方式で寿命が管理されているわけではない?
>>354 mallocとかつかってメモリを割り当てて.__ctor()とか使ってコンストラクタを読んでクラスを作った場合、
GCにGC.addRange()でそのことを伝えておけばGCに回収されないで済む。
解放するときは.__dtor()とかfree()とか使って自力で解放する。
ただし、デストラクタでそれをやろうとすると危険かもしれない。
>>355 なるほど。
一応GC使わない書き方もできるわけですね。
でも、さすがに手間がかかりすぎるなぁ。
D言語ってかなり関数型プログラミングに向いてるよな
クロージャあるしクロージャリテラルあるしモジュールもあるし多態関数もあるしGCもあるし
でもリソースの管理はできないんだよな
しかしグローバル変数のデフォルトTLS化ってうれしいのかな。知らなきゃ絶対はまるよね。
逆に、楽にTLS化する予約語を用意した方がいいんじゃないかと思う。
359 :
デフォルトの名無しさん:2009/07/27(月) 19:54:58
>>357 >リソース管理
RAIIとかいう話じゃなくて?
友達がD言語って騒いでいたんだけど
D言語ってLinuxで動くわけ?
>>361 それが自分で調べられない人には敷居の高い言語だと思う
>>362 別に勉強しようと思っているわけじゃないんだけどな
調べると真っ先に出てくる情報に触れる前にこんなスレに来た事が興味深い
文字列のインデックスから日本語文字を得るにはどうしたらいいの?
string j = "あいうえお";
writeln(j[0]); // 'あ' がほしい
wchar配列に変換すればできるんじゃないかな
変換関数はPhobosのどっかにあったな
>>365 writeln(std.utf.toUTF32(j)[0]);
char じゃ無理なのね。ありがと。
j[0..3]で出来るけど筋が悪すぎるよな
to!(wstring)じゃだめなの?
371 :
デフォルトの名無しさん:2009/07/27(月) 23:16:02
>>370 いける。toはできる子だからなんでもおまかせ。
浮動小数点数を小数点以下n桁までを文字列にしたいと思っています。
doFormatでやれそうなんですが、「出力は一文字ずつdelegateへ」っていうのがめんどくさいです。
もっと簡単な方法はないですか?
ちょっと前に出てたchar*との変化にはビビった
toだけでどれほど邪悪な変換が出来る事やら
>>372 所望の関数はなぜかstd.stringにある
format("%0.3lf", f);
√2の小数点以下100桁を求めるとしたら?
>>373 ポインタを使うということは、邪悪な変換とは何か知っているということさ。覚悟して使ってくれたまえよ。
何?なぜそんな邪悪を許すかって?それがeclectic languageというものさ。HAHAHA
一瞬electricに見えた
16進数文字列をlongに変換したいんですがPhobosだけでできますか?
std.convには無いようです
そんくらい自分でつくれ
5分いらん
381 :
デフォルトの名無しさん:2009/07/28(火) 03:58:48
昆布<オレにだって……できないことぐらい…ある…
>>379 前にここで教えてもらったので
long hexToDecimal(char hex)
{
return hexToDecimal([hex]);
}
long hexToDecimal(const(char)[] hex)
{
long sum;
foreach(char c; hex)
sum = sum*16 + ((c|0x20)-'0')%('W'-'0');
return sum;
}
unittest
{
assert(hexToDecimal('A') == 10);
assert(hexToDecimal("FF") == 255);
}
>>384 昆布w
たしかにtoで対応してくれるとうれしいけども
こうなったらsscanfの機能も取り込んでしまえば…
to!("%x")(str);
toは型の変換用じゃないのw
だしformatでいいでしょ
それはprintf系だが
readfどこいったんだよ
きっとDの機能をフルに使った変態関数を製作中
2.030辺りでformattedReadなるものが追加されたはず…
と思ってドキュメントを見ても無い
なんだ気のせいか
tangoの該当機能がPhobosに取り込まれれば全て解決…
それにつけても
かっぱえびせん
おやつはカールだろ
ちょwwwwwwwwwwwおやつはカールだろwwwwwwwwwwwwwwwwwwwwwwwww
最近おっとっとにはまってる
ジャンク舌な俺はハバネロ派
地味に柿ピーが好き。
std.InBufferは、いつになったら実装されるの?
存在しない物と思っておくべき?
>>405 あなたが作ってポストすればおkって言語ですから。
407 :
405:2009/07/30(木) 21:21:39
しょぼいものしか作れそうにありませんごめんなさい
class C {
const void f() {
auto that = this;
writeln(typeid(typeof(this))); // C
writeln(typeid(typeof(that))); // const(C)
}
}
これ違うの気持ち悪くない?
const関数内なのにthisがconstじゃないのか
気持ち悪いね
>>410 thisがconstじゃないのではなくて、typeof(this)がthisの型に関係なく常にCになる。
ちなみにsharedとかimmutable関数内でもそうなるし、classじゃなくてstructとかunionもそうなるっぽいな
はやくstd.encodingをrangeベースに置き換えてほしい
eclipse+descentでパッケージの中にパッケージを作るにはどうやればいいですか?
普通にfoo.barとかいう名前のパッケージを作ればいいだけ。
>>415 なるほど。
でも、階層にできないと、規模が大きく(モジュールが多く)なってきた時に整理の面で不便なことないんですかね?
>>416 .dをフォルダに入れたらフォルダがパッケージになるけどそういうことじゃない?
できるよ。phobosのソースディレクトリ見ればわかるよ。
>>416 ドット含むモジュール名にしたら普通に階層化されないか?
D言語ってもう
int dbl(int i) { return i*2; }
に対して
int n=10;
assert(n.dbl() == 20);
って実装された?
まだ
>>417-419 さっきやった時はプロジェクト直下のところと、パッケージの中と2箇所に新規パッケージができてしまったんですが、
今もう一度やったらちゃんとパッケージの中だけにできました。
さっきのはなんだったんだろう・・・。
あぁ、あったな、そんなバグ…
D3.0マダー?
D3.0では複雑すぎる機能は削ぎ落としてポインタみたいなのは禁止して
プラットフォーム依存を無くすために仮想マシンを用意してだな…
なにそのJava
immutableオブジェクトのコンストラクタに渡ってきたmutableなthisを、
コンパイラのなんのお咎めもなく外に持ち出せるって話だけど、
これはスタック変数へのポインタを関数外に持ち出せてしまう問題と同じなわけだし、
やっぱり仕方ないんじゃないかなあ。
scope変数に対する静的解析を実装すれば解決できるんだろうけど。
>>427のって
>>409のおはなし?
typeof(this)ってのがそのクラス固有の関数を呼ぶために特別扱いされてるとかそういう関係で
型がおかしくなってるっていうバグかと思ってたんだけど、違うの?
>>429 いあ、それとは関係ない。
誰かがどこかでつぶやいてた話。
>>430 そっか。・・・こういうこと?↓
--------
class C{
int a;
this(ref C c){
a = 10;
c = this;
}
}
void main(){
C x;
auto c = new immutable(C)(x);
writeln(c.a);
x.a = 100;
writeln(c.a);
}
--------
・・・これはキモイね。
module hoge.hoge;
import std.algorithm;
import hoge.fuga;
void hoge() {...}
これをビルドすると、
c:\省略\hoge.d(6): Error: function hoge.hoge.hoge conflicts with import hoge.hoge.hoge at c:\省略\hoge.d(4)
というエラーが出ます。
import hoge.fuga;をコメントアウトすれば、このエラーは出なくなります。
どうもhogeパッケージに入っているモジュールをimportするとエラーが発生するようです。
hogeパッケージhogeモジュールと、同名なのがだめなんでしょうか?
エラーを文字通りに取れば
hoge.hoge.hoge関数と
hoge.hoge.hogeモジュールが競合するようだが
関数があるのは自己申告で確定だから、
hoge.hoge.hogeというディレクトリがあればその競合が原因だな
>>433 うーん、プロジェクトのフォルダの中にhogeフォルダ、そのhogeフォルダの中にフォルダはないです。
435 :
432:2009/08/04(火) 05:55:52
改名importにしたらエラーは消えました。
モジュールhoge.hogeの中でhoge.fugaをimportするとhoge.hoge.hoge.fugaになって、
hoge.hoge.hogeの部分がパッケージ.パッケージ.パッケージなのかパッケージ.パッケージ.関数なのか判別できないっていう事なのかなぁ。
うーん、改名importにしないといけないぐらいなら、パッケージとモジュールに同じ名前をつけるのやめた方がいいか・・・。
>>436 Rangeの作り方が最初よく分からなかったのだが、
たとえば配列をRange化する場合、
.nextは[1..$]というスライス(の参照)を返すって事でいいんだよね?
一応listやdequeくらいは実習代わりにrangeで作ったサンプルが作れるかも?
list(T)はできた。
codepadにでも貼ろうかと思ったがcodepad側の対応バージョンが古いのであきらめる。
罠:
ドキュメントには .empty .next .retreat .head .toe が列挙されているが、
実際には .empty .popFront .popBack .front .back。
思ったこと
st.iteratorとRangeの関係は?frontという名前が競合するんだが。
iteratorなしでlistに挿入って出来るの?
とか
440 :
デフォルトの名無しさん:2009/08/05(水) 07:26:50
endを固定(empty)にして、イテレータのbeginとendをまとめたようなもの
InBuffer作ってみました。
OutBufferをちょっといじった程度の物なので、これでいいならとっくに標準に入ってる気はしますが・・・。
何か指摘があればお願いします。
class InBuffer
{
ubyte data[];
uint offset;
invariant() { assert(offset <= data.length); }
this(in ubyte[] _data) { data = _data; }
void read(ref ubyte[] bytes) { bytes[] = data[offset..offset + bytes.length]; offset += bytes.length; }
void read(ref wchar[] chars) { read(cast(ubyte[]) chars); }
void read(ref dchar[] chars) { read(cast(ubyte[]) chars); }
void read(ref ubyte b) { b = data[offset]; offset += ubyte.sizeof; }
void read(ref byte b) { read(cast(ubyte)b); }
void read(ref char c) { read(cast(ubyte)c); }
void read(ref dchar c) { read(cast(uint)c); }
void read(ref ushort w) { w = *cast(ushort *)&data[offset]; offset += ushort.sizeof; }
void read(ref short s) { read(cast(ushort)s); }
void read(ref wchar c) { c = *cast(wchar *)&data[offset]; offset += wchar.sizeof; }
void read(ref uint w) { w = *cast(uint *)&data[offset]; offset += uint.sizeof; }
void read(ref int i) { read(cast(uint)i); }
void read(ref ulong l) { l = *cast(ulong *)&data[offset]; offset += ulong.sizeof; }
void read(ref long l) { read(cast(ulong)l); }
void read(ref float f) { f = *cast(float *)&data[offset]; offset += float.sizeof; }
void read(ref double f) { f = *cast(double *)&data[offset]; offset += double.sizeof; }
void read(ref real f) { f = *cast(real *)&data[offset] = f; offset += real.sizeof; }
void read(ref char[] s) { read(cast(ubyte[])s); }
}
>>437 popFront は range を返すのではなくて、 range 自体を変更する。
>>439 あるRangeの前や後ろに要素を挿入する操作を定義すればいい。
>>441 castして代入してるけどアラインメントが揃ってないとクラッシュしちゃう
処理系もあるので、memcpyあたりでコピーするようにしたほうがいいかも
445 :
デフォルトの名無しさん:2009/08/05(水) 20:20:30
gccが、decimal128をサポートするみたい。
DPDが良いのか悪いのかは別にして、D言語にあれほど
10進演算器入れてくれって言ったのに・・・・
さよなら、D言語。
そんなもんライブラリのサポートで十分だろうが……
447 :
デフォルトの名無しさん:2009/08/05(水) 22:16:13
>>446 それを言い出すのなら、CやC++で充分って事で。
あれほど言ったのにというが、ちゃんとWalterに伝えたのかな?
decimalより__m128を先にして欲しい
450 :
デフォルトの名無しさん:2009/08/05(水) 23:11:13
D言語でDirectXを使ったゲームって作れますん?
qtd試そうとしたらQtCore4.dllが腐ってて死んだ
IEEE 754のdecimalXXに対応してるプロセッサってあるの?
>>444 なるほど、アラインメントの事は忘れていました。
OutBufferのwrite関数はアラインメントを調節してないように見えるんですけど、
alignSize関数を使ってライブラリ利用者自身が調節してくださいっていう事ですかね。
>>442 popFrontの挙動って配列スライス(=参照)そっくりなんすよ。
Dでlistを実装するとheadとtoeへのポインタを持つ構造体になるが、
配列の場合は配列長と先頭アドレスのポインタを持つ構造体として表現できる。
スライスは実体を動かさずに配列長と先頭アドレスだけ動かした構造体を作るもので、
listのpopFrontもheadへのポインタを動かしただけの構造体を作る実装になる。
真のメモリ回収はGC任せにするようにする。
そうでないとforeach Rangeに突っ込めないので、そういう使い方を想定しているのかと。
なのでlistにも配列と同じように、dupとidup、内容のコピー(STLのassignみたいな)が必要になるはず。
>>443 というモデルでのスライスのpushFront/Backがあれば挿入できるな。確かに。
……と思っていたが、foreach Rangeのために、popFrontした後のheadの前方要素ポインタのnull代入をしないようにしたんだが、
popFrontしたのに永遠にGCに回収されないモデルだということに気づいた。どうすんだこれ。
あー早く言語仕様固まらないかなー
このエターナり具合はゲーム制作板に通ずるものがある。
RangeとIteratorあたりの方針とか実装テクニックをandreiに記事にして欲しい
例の本に載っているのかな
>>456 リストは一つのオブジェクトで,rangeはその上の範囲を指すビューだと考えれば、
リストの一部が参照されている限り、リスト全体が破壊されることはないのは普通じゃないかな。
// ビューに関する操作
empty // 空かどうか
front. back // 現在のビューの先頭、末尾の参照
popFront(), popBack() // ビューを縮める *ビューを破壊
// リストの実体に関する操作
dup() // 現在のビューの範囲だけを取り出して新しいリストを作る(そして,その全体を表すビューを返す)
insertBefore(T), insertAfter(T) // 現在のビューの前後に要素を追加する *実体を破壊
eraseFront(), eraseBack() // 現在のビューの先頭、末尾の要素を削除する *実体を破壊
たぶんプリミティブなオペレーションで必要になるのはこの辺りだと思う。
>>460 そんな感じかね。
Range実装の一番単純な例として、
書いたものを晒してレビューして欲しいんだが、
D言語研究とかにページ作って見てもらってもいいかな?
OutBufferってなんでmemcpyを使わず、アラインメント調節とcastして代入なんだろう?
対になるInBufferが作りにくいなぁ・・・。
>>463 std.streamにそんな物があったとは知らなかったです。
OutBuffer必要ないですねぇ。
キャスト演算子無くしてジェネリック関数にしよう
cast!int(hoge);
>>465 テンプレート関数は仮想関数になれないから駄目。
やっとQtD動いた
・Qt 4.5の2009.3版は避けて2009.2を使う
・Qtのインストール先は"C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0"でないと駄目
・QtCore4.dllがねぇぞゴルァと言われたらbuild_dir/generator/にQtCore4.dllとQtXml4.dllをコピー
fedoraにインストールした時はあんなに素直だったのに…
コンストラクタをconst就職したらどうなるの?
コンパイルできなくなる
> .tupleof プロパティは、 隠しフィールドおよび基底クラスのフィールドを除く、 全てのフィールドからなるタプルを返します。
隠しフィールドって何ですか?privateとは違うんですか?
ぐぐっても答えが出てこないです。
>470
クラスの仕組みを実装するために、処理系がこっそりクラスに追加してるフィールドのこと。
だからソース中には出てこない。
ある型が静的配列であるか判定するにはisStaticArray。
では、動的配列であるか判定するにはどうすればいいですか?
isDynamicArray
怒濤の更新こないかなー
最近trunk覗いてないな
>>474 __traitsの方ばかり見てて、それに気がづかなかった・・・
__traitsとpobosのstd.traitsって同じような物が結構ありますけど、どこが違うんでしょうか?
import std.stdio;
void main(){return write;}
なあこいつをどうおもう?
>>476 __で始まるシンボルはそのうち使えなくなってもおかしくないのでは
ちなみにこうするとdmdが死ぬ
import std.stdio;
auto main(){return write;}
private
{
enum real hoge = 1.001L;
alias hoge fuga;
}
これのfugaがpublicになるのはバグでいいんだよな?
ほかにもtemplate mixinしたのがpublicだったり…
public関連のバグはvoteでも高い値出してるんだからさっさと潰してくれたらいいのに…
>>478 そうだったんですか。
phobosの方を使った方がいいんですね。
public関連は暗黙friendでちょっと確認面倒だからな・・・
>>481 ごめん
こういうことなので使えなくなるは言い過ぎたかも
Q. なぜ __add__ や __div__ といった名前を opAdd, opDiv の代わりに使わなかったのですか?
A. __ を使った予約語は、処理系特有の言語拡張を表すべきで、 言語の基本的な部分に使うものではないと考えています。
python涙目
>>483 うーむ。
しかし処理系に依存しない方法があるならそっちの方がいいですよね。
あれ?phobos自体が処理系に依存?w
やべぇQtD最高だわ
コンパイルできるだけじゃなくリンクまでできる
しかも動く
感動して涙出てきた
via ML
int x = 2^^3;//8
どちらかというと
*^ pow
/^ log
として欲しいな。
max/minは昔のgccの拡張っぽく >? と <? にしてほしい。
abs演算子(単項)は何がいいだろ。
|> n <|
あまり記号に頼るのは勘弁。
たまーにしか使わないようなものはどうせ覚えられないんだから、
検索しやすい名前にしておかないとダメだ。
void foo(in int[] aaa, in int[] bbb)
{
Tuple!(const(int[]), const(int[])) tup(aaa[], bbb[]);
...
}
Error: aaa is used as a type
Error: bbb is used as a type
どうすればいいのでしょうか?
そのスライスいるの?
>>494 Tuple!(const(int[]), const(int[])) tup(aaa, bbb);
にすると
Error: aaa is used as a type
Error: cannot have parameter of type void
Error: bbb is used as a type
Error: cannot have parameter of type void
になります。
下のプログラムの実行結果で&thisと&testの値が変わるのは正しい動き?
(DMD v1.030を使用)
class Test
{
public void print()
{
printf("(this, &this):(%p, %p)\n", this, &this);
}
}
void main()
{
Test test = new Test;
printf("(test, &test):(%p, %p)\n", test, &test);
test.print();
}
497 :
493:2009/08/08(土) 20:02:21
tuple(返り値で作ったTupleを返すやつ)を使って、配列を含むタプルは作れました。
でも、constが含まれるとエラー(tupleのソース見ても明らかにconstは無理)。
const配列を含むタプルはどうやって作ればいいんだろう・・・。
>>496 class Test {
public void print() { writef("(this, &this):(%p, %p)\n", this, &this); }
void isSelf(Test a, Test b) {
writefln("this:a %b this:b %b a:b %b", this is a, this is b, a is b);
writefln("&this: %p &a: %p &b: %p\n", &this, &a, &b);
}
}
void main()
{
Test test = new Test, test2 = new Test;
writef("(test, &test):(%p, %p)\n", test, &test);
test.print();
test.isSelf(test, test2);
writef("(test2, &test2):(%p, %p)\n", test2, &test2);
test2.print();
test2.isSelf(test, test2);
}
499 :
496:2009/08/08(土) 23:44:01
>>498 なるほど
&つけるとヒープ上の実体のアドレスが得られると勘違いしてました。
参照がCのポインタそのものなんですね。
intがsize_tに暗黙に変換されるのって抑制できませんか?
minmaxを記号でやる言語があるのかもしれんが
頻出処理ではないのに貴重な記号を使うのはもったいないのと
複数要素、およびコンテナ、イテレータのことを考えると記号でやる処理にしては複雑すぎるのと
本来数学でさえ記号を使わないのでいらないと思う
absの記号は|n|以外だとむしろわかりにくいのでこれでないならいらないかな
>>500 uintのaliasなのかと思ったら何これ?
alias typeof(int.sizeof) size_t;
typedef uint size_t;
にしたらいいのか?
>>502 sizeofプロパティの型をsize_tとするって意味じゃね。
uint決め打ちじゃなくて。
32bit版と64bit版を書き分けるのマンドクセってことだろう
クラスのメンバである配列について、コンストラクタでnewされ、その後長さは変わらないが、中身は変えるような場合、
うまくconstをつける方法はありますでしょうか
std.typecons.Rebindable
ただし
>>210
書き方が悪くて申し訳ありません。
const オブジェクトへの書き換え可能な参照ではなく、
書き換え可能な配列へのconst参照を作るにはどうしたら良いのかなと……
推移的constで中身も書き換え不可能にならないようにするには、と。
Rebindableの配列を作る
配列自体をやり取りしようとすると一瞬にして破綻するけど
言語仕様やPhobosについて、公式サイトのドキュメントだけじゃ説明不足に感じる事があります。
詳細までキッチリ書いてある仕様書のような物ってないんですかね?
DMDおよびPhobosのソースコード
>>511 Phobosのソースはよくみますが、言語仕様を理解しきれてなくて分からない時があります。
コンパイラのソースも付いていたのは気づきませんでした。
読むの大変そうだ・・・
DMDは実装の一つであって言語仕様そのものではないんじゃないの?
それともDMDの挙動がD言語の仕様に決められてるの?
D2早くstableになれよ
コンパイラのソース嫁はさすがにスパルタすぎじゃね
516 :
511:2009/08/10(月) 14:28:13
>>512,515
コンパイラの方は冗談のつもりでした・・・
私は、実装がどうであれドキュメント化されなければD言語の仕様としては「未定義」であると思っています。
ですので、説明不足に感じるところがあるのであれば、ウォルターたんに直接
「〜〜だからドキュメント化してくれ!」
ってお願いしに行くのが一番いいのではないかと思います。
517 :
512:2009/08/10(月) 16:03:53
コンパイラのソースは興味がないことはないですが、さすがに読む気にはなれませんでした。
ドキュメントが不足してたり、ぐぐっても出てくる物が少ないところがD言語はつらいです。
言語の仕様はいいんだけどなぁ。
仕様が先に決まる言語なんてつまんない物が多いし、
Dは現状で特に説明不足と感じることもないなあ。
まあ自分で処理系を作ろうと思ったら大変なのかも、程度。
ぶっちゃけドキュメントで明記していようが
平気で破壊的更新をするウォルたんなんだから、
気にせず適当に使うのがいいとおもう
いきなりコンパイル通らなくなったらChangeLog見に行くくらいでいいと思う
しばらく見ないうちに全然変わってるのが常だから
仕様なんていちいちチェックしないで適当に書いた方がいい
D言語の仕様は決まってない&書いてない&そのうち変わるの三拍子
ドキュメントにも将来的には〜予定です。とか普通に書いてあるしな。
523 :
512:2009/08/10(月) 19:51:54
たしかに仕様がどんどん変わっていく身軽さはD言語のいいところだと思うので、仕方ないところなんですね。
・標準ライブラリを使った8行なら大丈夫だろうと思っていたら仕様変更によるエラー20件に襲われた
・リリースから1日の時点でプログラマが頭から血を流して倒れていた
・足元がぐにゃりとしたのでドキュメントをめくってみると仕様が未定義だった
・tangoとGUIライブラリを突っ込んで倒れた、というかビルドする前にバグとかを修正する
・constがcastに襲撃され、constも「immutableも」全員編集された
・リリースから翌日までの10時間の間に破壊的変更に襲われた
・Dプログラマの全員がレイプ経験者。しかもD1が安定しているという都市伝説から「初心者ほど危ない」
・「そんな危険なわけがない」といってコーディングしたプログラマが5分後アクセス違反まみれで戻ってきた
・「何も書かなければエラーになるわけがない」と-safeをつけてコンパイルしたコードがphobosのエラーを食らって戻ってきた
・templateから半径200行はエラーにあう確率が150%。dmdのバグに襲われてdsssのバグに襲われる確率が50%の意味
・dmdにおける更新による修正は1月平均120件、うち約20件が破壊的変更
>>524 最後の
それだけの変更はどうせ長続きしないからむしろ歓迎w
うーん・・・constを要素としたTuple(std.typeconsの方)を作ろうとするとエラーが発生する。
C:\dmd\windows\bin\..\..\src\phobos\std\typecons.d(352): Error: can only initialize const member _field_field_0 inside constructor
Tupleのコンストラクタ↓
this(U...)(U values) if (U.length == Types.length)
{
foreach (i, Unused; Types)
{
field[i] = values[i];
}
}
拾ってきたサンプルコード↓
void print_all(T...)(T xs)
{
foreach(x; xs)
writeln( x, " : ", typeid(typeof(x)) );
}
print_allにconstを渡してもエラーが出ないのに、Tupleのコンストラクタでエラーが出る意味がわからないです。
どういうことなのでしょう?
配列の中に値を代入しようとしてるからかな
class A {
const(int[]) aaa;
this() {
aaa.length = 1;
aaa[0] = 1; // これは通らない
aaa = [1]; // これは通る
}
}
>>527 うーん、fieldがconstになる理由が、ソース見てもわからないです。
constを要素にできないのは、Tupleの仕様なんですかね?
最近のMLはDIP含めプロパティに関して活発だったからなぁ
どうなるのか楽しみ
本物のプロパティってC#みたいになるの?
今までの疑似プロパティも継続して使えるのかどうかが気になる
D言語の慣習としては今までのプロパティはなかった事にして、破壊的変更。
D言語ユーザー阿鼻叫喚に期待
すべてはウォルタータンの御心次第。
T2ってなに?
今までのプロパティ好きだったけどな
問題があったのかな
>>534 ターミネーター2。
じゃなくて、話の流れからして、D2用Tangoのことでしょうね。
>>532 行頭で並んでると全角と半角の違いが気になる
今までのだと+=とかできなかったから?
今までのを完全になくしたら、ただの短縮記法的な括弧なしの関数呼び出しとかが
できないようになるじゃん。
D言語ゴルファー涙目だな。
>>535 俺も好きだった。まあ
>>538の問題は気になってたけど。
うれしさ半分さびしさ半分って感じだなあ。
x64をはやくおながいします・・・
if (hoges[0].func(fuga.member)) // これはOK
{}
auto result = count!("a.func(b.member)")(hoges, fuga); // ここでエラー
Error: static assert "Bad binary function q{a.func(b.member)}. You need to use a valid D expression using symbols a of type const(Hoge) and b of type Fuga."
述語にメンバ関数は使えないのでしょうか?
何か方法はないですか?
enforceあるおかげでthrowいらなすぎる・・・
std.contractsがいつの間にかパワーアップしてるな
>>543 auto result = count!("(Hoge x, Fuga y){return a.func(b.member);}(a,b)")(hoges, fuga);
これもやってみたがdmdがクラッシュした
import std.algorithm;
class Hoge{bool func(int){return true;}}
class Fuga{int member(){return 0;}}
void main(){
Hoge[] hoges = [new Hoge];
Fuga fuga = new Fuga;
if (hoges[0].func(fuga.member)) {}// OK
{// NG
//auto result = count!("(Hoge x, Fuga y){return x.func(y.member);}(a,b)")(hoges, fuga);
}{// OK
bool f(Hoge a, Fuga b) {return a.func(b.member);}
auto result = count!(f)(hoges, fuga);
}{// OK
auto result = count!((Hoge a, Fuga b){return a.func(b.member);})(hoges, fuga);
}
}
547 :
546:2009/08/12(水) 17:46:02
最初のはこれの間違い
auto result = count!("(Hoge x, Fuga y){return x.func(y.member);}(a,b)")(hoges, fuga);
>>546 thx
文字列で式渡す方式は何か制限かあるという事でしょうか(あるいはバグ?)。
関数を渡すか、関数ポインタを渡す事にします。
なんというか、バグかそうでないのか判断の難しい問題だな。
ただ、Phobosのソースコードを読むと、開発者は
auto result = count!("a.func(b.member)")(hoges, fuga);
というコードが通るように書いているつもりのような気がする。(std.functional.binaryFunImplのあたり)
列挙体に存在しないはずの値が列挙体値にキャストできちゃうの何とかならないのかな
暗黙キャストでできちゃうなら問題だけど・・・
明示的にキャストしといてそんな
そういやDってcast時例外とか存在しないんだな
castって例外出るもんか?
C++だと参照をdynamic_castで間違ったダウンキャストすると例外投げる
Javaもclassのcast失敗で投げるな
Dのenumともなれば一覧取る機能とか名前取る機能とか当たり前のようにある…
そんな風に考えていた時期が、俺にもありました
>>555 その程度コンパイルタイムリフレクションで余裕です
>>548,549
文字列mixinは、あくまでmixinする箇所にそのコードが書いてあるように振る舞うから、
デリゲートのようにローカル変数を使ったり、mixinしているモジュールでimportしていないモジュールの型を使ったりすることはできない。
pureな標準ライブラリ関数がpure修飾されてないからまともな関数が作れない
というかin節でassert(hoge, std.conv.text(hoge));が通らないのが困る
>>549 バグでないとするなら、どういった事情でこの仕様になったのか疑問な気もします。
>>557 a.funcもb.memberもテンプレートで渡したhogesとfugaのメンバーなので使えないとおかしい気がします。
binaryFunImplの中で出てくるElementType1、ElementType2はどこで宣言されているんでしょう?
>>559 関数の仕様じゃなくてmixinの仕様と言ってるのでは
>>560 mixinの仕様というのは
> 文字列mixinは、あくまでmixinする箇所にそのコードが書いてあるように振る舞うから、
ということですよね?
void f(T)(T t) {
t.func();
}
これは当然OKだから、t.func();がmixinであっても同じ事になるのではないか(むしろならないと不便)と思いました。
>>561 template mixinとtemplateがごっちゃになってない?
下記のコードをdmd a bでコンパイルするとき
fがa.dにあれば動くけど
b.dにあったらbではimport std.stdio;してないのでwritelnがないため動かない
// a.d
import std.stdio;//ここでimportしても無意味
import b;
void main() {
f!(`writeln("hoge");`)();
}
// b.d
void f(string s)(){
mixin(s);
}
同様にaで定義された型をb.funcに与えることもできない
>>562 その例は
>>543の問題とは別物になってるような・・・
// a.d
import b;
struct Hoge { void func() {} }
void main() {
Hoge hoge;
f!("a.func()")(hoge);
}
// b.d
void f(string s, T)(T a){
a.func();// もちろんOK
mixin(s);// ならこれもOKのはず?
}
std.algorithmのcountもソース見るとこの挙動を期待して書いているように思う。
>>653 それf!("a.func();")(hoge);に直したら動くけど
>>564 ああ、ごめん。ミスった。
auto result = count!("a.func(b.member)")(hoges, fuga);が通らないのは
std.functional.binaryFunのバグじゃないかな。
std.path.joinがWindowsバージョンだと第三引数以降が無視されちゃってるの、
いつになったら直るのだろうか
君が直せばすぐにでも。ってか、たぶん気づいてないと思う。
前にもそんな話出てたな
パッチ送ったらしいけど
直ってないところを見ると
うちらが直しても無駄みたいだな
571 :
デフォルトの名無しさん:2009/08/14(金) 11:14:35
spam mail
std.functionalのbinaryFunとunaryFunって
testAsExpressionの部分が変じゃね?
binaryFunの方をunaryFunに揃えたらなんとかなる気がする
>>572 The patch in brief:
enum testAsExpression = "{ ElementType1 "
~parm1Name~"; ElementType2 "
~parm2Name~"; return ("~fun~");}()";
って
>>567に書いてある。
>>571 私の英語力は100点満点中5.3点です
>>570 俺がbugzillaにphobos関連のミスを報告しといたら、andreiが担当責任者を自ら引き受けてたけど
コードは国際共通語!
D言語のライブラリってだいたいCやC++のラッパが多いの?
578 :
デフォルトの名無しさん:2009/08/14(金) 22:14:16
!
関数の単体テストってどうやれば実行されますか?
1つのモジュールに関数とunittest書いて、コンパイル引数に-unittest指定して、
そのモジュール1つだけをコンパイルしたんですが、どうも単体テストが実行されてないようです(明らかにエラーなassert書いても何もなし)。
単体テストが行われるのは実行時だよ
前から思ってたんだけどなんで実行時なんだろ?
>>580 え、そうだったんですか・・・。
コンパイル時に実行してくれると便利なのに。
その話題は過去に何回もあったけど、公式見解とかってあるのかな
多分たいした手間じゃないからこれでいいじゃんって思ってそう
それよりもテストに失敗してもそのまま次のテストを実行してくれないと使い物にならない
っ try catch
例外でテストを書けとな?
>585 ではないがこういうことだと思う
import std.stdio, core.exception;
void assert_test(T, string file=__FILE__, ulong line=__LINE__)(lazy T eval, lazy string msg)
{
try{
assert(eval());
}catch( AssertError e ){
writefln("%s", msg());
}
}
void main()
{
assert_test(1==0, "error!");
writefln("end");
}
出力:
error!
end
assertは結局AssertErrorを投げるので、これを食べる関数を作れば
>584 の意図は達成できる
>587
忘れてた
catch節をこうしておけば組み込みのassertっぽくファイルと行位置も出力できる
writefln("AssertError@%s(%s): %s", file, line, msg());
>>589 のtechtipsは気づいてなかったthx
>>577 さあ? それでそれがどうしたと言わざるを得ない
>579
static assert ってのがあって、これはコンパイル時に実行される。
ErrorとExceptionは兄弟になったのか
いつの間に
更新まーーーーだーーーーー?
2.031がコンパイルエラーになるたびにコア吐いて堕ちる惨状を見るに、修正には時間がかかりそうだと思った
ウォルターはドッグフードをてめーで食ってないんじゃないか?
やっぱりdmdはdmdで作るべきだろ
そうこだわらんでも
CでよりはC++で書いて欲しいけど
new immutable(int)[n];ってどうやって使いこなすの?
次の行で詰むんだけど
書き換え可能配列に書き込んだらidupかassumeUniqueを使う
>>591 そもそもC++はGCとの相性でくるみにくいし、
Cならくるまなくてもそのまま使えるしな
>>595 とりあえず -g -debugを入れて-Oを切ればInternal Compiler Errorでコケることは減る
かといって問題が解決するわけでもないが
テンプレートそのものはaliasできないんすかね
interfaceマジ意義薄れてるな
Tで受け取ればstructの擬似interfaceまでできるし
>>602 ここはどうしても多態という場面があってそこには使える
interfaceじゃないけどstructにコンセプト的なものが欲しくなった
ユーザ側が拡張するときにこれは実装してくれという
Rangeなんかちょうどそんな感じだしな
encodeって書かれてもなにやってんだかわかんない・・・
モジュール指定が絶対必要な関数を作る方法がほしい
static importがあるじゃん?
>>600 何のことかと思ったらこういうことか
int[2] a = [1,2];
immutable(int)[2] b = a.idup;
>>602 どんなコード?
>>603 template isHoge(T) { enum isHoge = is(typeof( { ... } ); } とconcept ifでできたような気がしたがやってみたらできなかった・・・
is(typeof({})) じゃなかったっけ?
>1のDSciTEはもう戻ってこないんだな、テンプレから外すんだろうか
DescentってD2もいけちゃう?
>>610 いける。
でも最新verには対応してなくて、pureやimmutableがキーワードとして認識されない。
int[] data;
uint[] dataIndex;
sort!("data[a] > data[b]")(dataIndex);
こんな風にdataIndexをソートしたいんですが、上記のコードは通りません。
C++なら関数オブジェクトを渡す方法を考えるのですが、Dのsortはデリゲート版がないようです。
どうすればいいのでしょうか?
>>613 どうもです。
そこのサンプルコードをコンパイルするとStack overflowになってしまいます。
なんでだろう?
Windowsのdmd 2.031ではうまくいった。
環境によってできるできないがあるのかもしれない。
>>615 どうもです。
2.031入れたらコンパイルできました。
std.algorithm.equalの引数に静的配列を渡すとエラーになるんですが仕様?
Dの静的配列はなんか異質
>>618 thx
静的配列と動的配列で挙動が違うのかー。分かりづらい。
あーなんとかならないのかな。
algorithmに渡せるRangeは動的配列だけで静的配列は渡せないなんて嫌だw
静的配列の後ろに[]を付けるだけで回避できるはず
ああそうかスライス取れば動的配列として扱えるのか
>>612 import std.algorithm;
int[] data = [ 2, 3, 1, 5, 0 ];
uint[] dataIndex = new uint[data.length];
makeIndex(data, dataIndex);
foreach(i; dataIndex) write(data[i], " ");
>>624 すみませんmakeIndexがどういう操作(なぜdataがいるのか?)でwriteがどういう操作なのかわからないです。
コンパイラに話しかけてるんじゃないんだから関数名にはモジュールまで付けた方が伝わりやすいとおもいます!
きっと std.algorithm.makeIndex と std.stdio.write のこと
>>626 どうもです。
makeIndexは目的にぴったりですね。
マケインです
そろそろ9月です
10月にはD3だっけ
選択importの反対のような事ってできないですかね?
std.stringをimportするとdeprecatedのstd.string.findがimportされて、
std.algorithm.findと衝突するのがめんどくさいです。
import std.string;
import std.algorithm;
alias std.algorithm.find find;
ってすればいいんじゃないかな
>>631-632 ありがとうございます。
とりあえず簡単なaliasでかぶせる方法にします。
std.string.findがdeprecatedになって何が推奨になったの?
indexOfとかじゃなかったかな
indexOfですね。2.031のchangelogより:
std.string: deprecated std.string.find and std.string.find, replaced with std.string.indexOf;
deprecated std.string.rfind and std.string.irfind, replaced with std.string.lastIndexOf;
added flag CaseSensitive for indexOf and lastIndexOf;
removed startsWith and endsWith because std.algorithm defines them;
defined std.string.byDchar.
ありがとう
よく追いかけているねえ
concept-ifのページどこ?見当たらないんだけど><
templateのページのテンプレート制約(Template Constraints)ってとこか?
それです!!ありがとう!!
ChangeLog見てたらconcept-ifのバグをなんたらとか書いてあったんで
concept-ifでサイト内検索かけてみたけど見つからなかったんです><
D1.0でファイルにsjisの文字列を出力する方法ってないでしょうか?
教えていただきたいのですが
WindowsならWideCharToMultiByteつかって、そのほかならsetlocaleした後にwcstombsする
std.windows.charsettoMBSzってのがある
中身は
>>642
一応WindowsでTangoをつかうときの方法を紹介
tango.sys.win32.CodePage.CodePage.intoがある。
引数のdstはUTF-8が日本語3バイトに対してShift_JISは2バイトなため、最低srcのバイト数+1のバッファ(最後に\0の末尾文字が入る)を用意すればいい
----- 以下サンプル ----
import tango.io.device.File;
import tango.sys.win32.CodePage;
void main()
{
scope f = new File("test.txt", File.WriteCreate);
scope (exit) f.close;
// mbs
{
char[] src = "あいうえお";
char[] dst = new char[src.length+1];
dst = CodePage.into(src, dst, 932);
f.write(dst);
}
// ascii
{
char[] src = "abcde";
char[] dst = new char[src.length+1];
dst = CodePage.into(src, dst, 932);
f.write(dst);
}
}
コンストラクタテンプレートがないおかげで汎用のアダプタクラスが作りづらいんですが、なにかいい回避策はないもんでしょうか
>>646 どうだろう
アダプタはどんな機能を持っているの?
>>647 メソッドをbindしたい。
構造としてはこんな感じ。
interface I { void f(int i); }
class C : I { ... }
class Adapter(T:I, int fix) : T
{ this(A...) { super(A); }
void f() { f(fix); }
}
シンボルI, Cはすでにクラスとして使われていて、今からテンプレートにするのが難しい。
同じ目的を果たすのに別の解があればそれでも良いんだが、さてどうしたものかなと。
ちなみにC++ではだいたい目的どおりのコードが書けて、発想が縛られてるのかも。
opCallで書いてみるとか・・・
>>648 Adapterの更に子クラスを作ってそいつをテンプレートにする。
>>649 どうにもうまく親クラスのコンストラクタにたどり着けなかった
親のopCallを呼ぶと親が帰ってくるという罠が……
>>650 同じくsuper.superに届かず
とりあえずあきらめてみる
>>648 それがエラーになるのは、コンパイラが自動生成するthis()と、
ユーザ定義のthis(T...)(T)がコンフリクトしているのが原因。
今のところテンプレートと非テンプレートはオーバーロードできないけど、
MLでウォルたんはこれをできるようにしたいと言っていたから、ちょっと待てばいいと思う。
static opCall(A...)(A args) {
auto _this = GC.malloc(typeof(this).sizeof);
auto ci = typeof(this).classinfo;
_this[0..ci.init.length] = ci.init;
(cast(typeof(super))_this).__ctor(args);
return cast(typeof(this))_this;
}
>>652 std.traits.ParameterTypeTupleあたりに解決法が書かれているかもしれないが、ちょっと分からず。
std.typecons.Uniqueを見てopDot + alias thisを使った委譲に切り替えようかなと思ったのだが、
肝心のUniqueが動かない?中身を見るとコンストラクタテンプレートがコメントアウトしてあってnot work YETと書いてある。
関数の中にテンプレート書けるようにならないかなあ
660 :
デフォルトの名無しさん:2009/08/22(土) 20:38:09
すみません、MSGBOXPARAMS構造体を使いたいのですが・・・
Error 42: Symbol Undefined _D5win327winuser13MSGBOXPARAMSA6__initZ
MSGBOXPARAMS param = void;
ってすると構造体の初期化すっ飛ばせるから、とりあえずそのエラーは消えると思う。
まともにそのエラー消すなら、スタティックリンクライブラリを作ってリンクする。
662 :
デフォルトの名無しさん:2009/08/22(土) 20:54:05
>>661 そのスタティックリンクライブラリを用意できなくて困ってます(。´・ω・)
663 :
デフォルトの名無しさん:2009/08/22(土) 21:03:52
MSのSDKを探してみたところ、unicows.libにありました。
ですが、D言語用に変換できないのです。
664 :
デフォルトの名無しさん:2009/08/22(土) 21:21:34
うーん、とりあえず
MSGBOXPARAMS param = void;
としたらメッセージボックスが表示されましたので、
これで行こうかなと思います。
ありがとうございました^^
そのlibじゃなくて、Win32 bindingsのスタティックリンクライブラリ。
中にmakefileが入ってると思うので、それをgnuのmakeでコンパイルする。
666 :
デフォルトの名無しさん:2009/08/22(土) 23:56:37
>>665 やってみましたが、LIBファイルが生成されてないようですorz
一応、make.exeを実行するとDOS窓にファイル名がずら〜と出てくるのですが。
何かmakefileを弄る必要があるのでしょうか?
ホントだ。最新の2.0系のDMDではコンパイルできないね。
D1.0系だと行けたけど…makefileの修正が必要だね。下手したらソースコードも直さないとだめかも。
>>666 スタティックリンクじゃなくてbudではできないの?
669 :
デフォルトの名無しさん:2009/08/23(日) 01:28:21
budってなんですか?
ttp://www.dsource.org/projects/build budはimport関係にあるモジュールを勝手にimportしていってくれるビルド支援ツール
>>668 はこれじゃダメ?ってこと
> bud main -Ic:\d\dmd2\src\win32port // 例の win32 binding
//main .d
import win32.windows;
void main() {
MSGBOXPARAMS param;
with (param) {
lpszText = "test";
//...
}
MessageBoxIndirect(¶m);
}
671 :
デフォルトの名無しさん:2009/08/23(日) 02:05:47
>>670 できました^^
警告ありですが・・・
lz32.lib
Warning 2: File Not Found lz32.lib
rpcns4.lib
Warning 2: File Not Found rpcns4.lib
これからはD言語のビルドにbudを用いたほうが良いのでしょうか。
用途に合わせるとしか言えないんじゃないかな
何にせよbudやrebuild,あとdsss?などを使うとソースからのビルドは割と簡単になるので検討してみてください
ちなみにそのリンクエラーはお好きなものをどうぞw
1)気にしない
2)空の.dファイルから.libファイルを作ってリンクしてごまかす
bud lz32 -lib && bud main
3)正規のlibをdmd用に変換する
356 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/17(月) 02:38:04
wktk
D言語サポートするかな
357 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 01:39:58
D言語はサポートされないっぽい。
F#言語はサポートされるらしいが。(ベータ版インストールするとDはないがF#はあった)
358 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 05:46:58
D言語なんかいらん
359 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 06:54:46
D.NETとか存在価値無さすぎ
360 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 07:06:18
言語増やすな
日本語実装しろ
「何が」何だよ
伺か
何の話かと思ったらVisual Studio 2010か
…サポートされなくて当たり前じゃね
だよ
Microsoft Visual D#
そのDってM$がこれとは別に作ってるDのことじゃないの?
Sunのアレじゃないの?
…あれ?Sunって会社あったよね?
一応まだあるよ
じきにOracleに吸収されるけど
まあこんな仕様が変わりまくる言語入れたら色々大変だ罠
AddFontResourceExが使いたくて
-version=WindowsXP
としたらコンパイルは通るのですが、リンカエラーが・・・
Error 42: Symbol Undefined _AddFontResourceExA@12
DMDに標準でついてくるgdi32.libの中にあるのに何でだろう?
const int[] hoge()
ってどうなるの?
const(int[]) hoge()なの?
int[] hoge() const;なの?
後者
686 :
683:2009/08/23(日) 18:05:42
gdi32.libを明示的にリンクしてやる必要があったのですね。
解決。
nothrow pure const const(int[]) hoge();とかもう少し何とかならないものかと思う
nothrow pure const public:
void hoge(){}
void fuga(){}
nothrow private:
void piyo(){}
このとき、piyoはpureだったりconstだったりするんだろうか?
そうだったとして(というか挙動的にそうっぽいけど)、それを無効化することはできるんだろうか?
{}で囲むしかないっぽい
やっぱりそうか…
public, private, protected, package以外には使いにくそうだな。
インデント増やさずに使えるから
>>687の解決策にどうかと思ったけど…
クラスメソッドのpure属性って
* 仮引数が全て invariant もしくは invariant に変換可能で
* グローバルの mutable な状態を読み書きしない
だから、自動的に
pure ⊂ const(スコープ外のインスタンス変数に書かないし、読めさえしない)
pure ⊂ staic(スコープ外のインスタンス変数にアクセスしない)
だと思うのだが……
インスタンス内のimmutableなものは読み書きできるということであれば成り立たなくなるのかな?
逆に考えるんだ
インデントしなければいいや
と考えるんだ
例えばライブラリの間違った使い方をしてコンパイルエラーになった時、
エラーメッセージに表示されるソースがimportのimportのimportの・・・と深くなっていると、
どこでライブラリの間違った使い方をしたのか特定しづらいです。
何かうまい方法はないですか?
関数のデフォルト引数を、関数を呼ぶ側のコンパイル時のコンテキストから決める方法はなかろうか
黒魔術でなんとかなりそうな気もするが……
しかし、この「黒魔術」という言葉はどこ生まれなんだろう?
国産という気もするが、英語圏でwizardとかguruとか良く使うからあっちの気もする
白魔術はないのか
digitalmars.com での "black magic" の検索結果 約 176 件
あ,なんだ答え出てたのか失礼
>>693 そうなっているとどうしてわかりにくいの?
どこまでがモジュール名なのかわからないからとか?
ファイル名出ててわかりにくいのはなぜ?
>>700 例えばstd.functional.dのbinaryFunImplでエラーが発生したとメッセージが出るとします。
でも、自分が書いたコードの中で直接binaryFunImplを使ってないし、そもそもstd.functionalをimportすらしていません。
正解はstd.algorithmの中の関数の中でbinaryFunが呼ばれてるからなんですが、
自分が書いたコードのどこが間違っているのか、特定に手間がかかります。
ライブラリを作る段階でこんな感じにすればいいのではないかと。
import std.stdio;
void func2(T, string f=__FILE__, int l=__LINE__)(T a){writeln("func2: ", f, "(", l, "): ", a);}
void func(T, string f=__FILE__, int l=__LINE__)(T a){func2!(T,f,l)(a);}
void main(){func(10);}
テンプレート展開の「スタックトレース」的な機能は必須だよな
template instanciationに失敗したら呼び出し元の関数とかを全部エラー出してくれるだけでもいいやな
しかし今月の更新は遅いな…どんな破壊的変更が待っているのか…
今からなんだかワクワクしてきた…ッ!
string型の文字列をubyteの配列に変換したいんだが…
どうすれば?
ならcast(ubyte[])とかでよくね?
ふ〜む
やってみる
immutable(ubyte)[]にしないと
可能なら const(void)[] などを使うのもよい。
>>703 なるほど、実行時エラーはそれでいけますね。
しかし、全ての関数にそれを仕込むのは手間がかかりそうです。
またPhobosをよく使うので、そこはどうしようもないのがつらいところ。
>>704-705 コンパイル時のエラーメッセージで困るのは、確かにテンプレート絡みですね。
今後に期待?
いつになったら関数がタプル返せるようになるんだよおい
あ…あしたさ…
俺にはdmdを改造して特定の機能をなかったことにする程度の能力しかない!
タプル返す関数があって何がうれしいの?
構造体でいいじゃんと思うのだけど…
毎回作るのめんどいじゃんってのがタプルの起源だったきがする、
無名delegateも似たような理由だし。
複数の戻り値を返すとか?
outな引数使えばいいと思う
>>719 Tuple!(int, int) f(int, int) { /**/ }
f(f(2, 3))
>>721 outは型推論ができないから糞すぎる。
引数にタプル取る関数があって何がうれしいの?
構造体でいいじゃんと思うのだけど…
あれ?いつからenumの型名必須になったんだっけ?
これ全部直すのめんどくせーw
必須ではないよ。今でも無名構造体は存在する
newで作る配列の中身を初期化しない = void的な指定の仕方が思い出せない
>>725 D2ならわりと初期のころから
引数の型が特定のenumなら、その型に当たる部分は型名省略してもいいだろうと以前から話題には上るし、
07のウォルたんの公演でもやりたいと言っていたが、流れ続けて現在に至る
out引数は
extern(C) void hoge(int *n);
を
extern(C) void hoge(out int n);
と書くためにある
DFL更新されました
dmd2.031対応
おお!
見当たらないんだが?
つ trunk
あった
下記のソースはなぜ文字列を出力しないのだろう?
int main()
{
ubyte[] ary;
ubyte[] pico( ubyte[] sage ) { return sage = cast(ubyte[])"sage"; }
void fuga( ubyte[] sage ) { sage = pico( sage ); }
ary.length = 4;
fuga( ary );
writefln( "output: %s", cast(string)ary );
// 入力待ち
readln();
return 0;
}
/* 実行結果
* output:
*/
動かしてないけど、たぶん inout がないからだと思う
736 :
735:2009/08/25(火) 16:27:23
fuga関数の引数部分ね
>>735 fuga関数にinoutを追加したら動きました!
今日一日悩んでたので感謝^^
なんでそんなきもいことしてんの?
>>738 いや〜、セーブデータを作るモジュールを作っていて詰まったのですよ(;^^
andrei曰くDでは void main() {} 推奨とのこと
すこしはconst-correctness意識すべき
待て
inoutじゃなくてrefだ
>> 740
そうなんですか? 知りませんでしたorz
>> 742
ぇ..
inoutは古い仕様なのでrefにして
あと >> とレス番は離さないで
>>744 すみません・・
焦っていたもので(;^^
resに変えておきます。
746 :
745:2009/08/25(火) 17:02:23
また間違えた。。
refですね(;--
関数の引数はデフォルトで in に・・・
ウォルたんなら・・・ウォルたんなら・・・やってくれる(はず)
>>747 あほかw
そんなことしたらinじゃない普通の引数を表すキーワードが必要になるだろうが。
普通のはなくすってことだよ
>>749 その方がいいかも知れんね。それこそ
>>734 みたいな直観的じゃないことがたまにあるし。
void hige( ubyte[] fuke ) { fuke.length = fuke.length + 64; }
こういうのとか。
確かによく考えたら無意味だよなあ
まあswitchがそのまんま残ってるくらいだから無くならないだろうけど
同じ関数名、同じ型の引数で返り値の型のみ違う関数って作れますか?
出来ないはず
たとえばコンパイラが返り値の受け手がいない関数の処理をどうしたらいいか考えてみると分かりやすい
>>752 テンプレート関数でいいなら。
T func(T)(){
static if (is(T==int)){return 0;}else{return 1.0;}
}
interfaceだけ実行時型情報がとれないとかどうなってるんだ
少なくとも、この挙動が正しいならプロパティ名を分けないと分からん
interface I {}
class C : I {}
class D : C {}
void o(in Object obj) { writeln(obj.classinfo.name); }
void i(in I obj) { writeln(obj.classinfo.name); }
void c(in C obj) { writeln(obj.classinfo.name); }
void main() {
auto d = new D;
o(d); // classname D
i(d); // classname I
c(d); // classname D
}
関数の引数にしたが、とりあえずインターフェースの参照ならなんでもこうなるようだ
とりあえずリポートしておいた
void i(in I obj) {writeln((cast(Object)obj).classinfo.name); }
たぶんIUnknownとかCOMなんかの関係があってObjectにcastできないと実行時型情報が取り出せないんじゃないかと予想
標準ライブラリでもたまに
template Te(T) if (is (T : Object)) { ... }
とか見かける
interfaceはいらない子ですか?
正しそうなのにどうしてダメなんでしょうか
import std.stdio;
interface I {
void a() const;
}
class C : I {
override void a(){} const
}
void main()
{
void i(in I obj) {
writeln((cast(Object)obj).classinfo.name);
obj.a();
}
void c(in C obj) {
writeln(obj.classinfo.name);
obj.a();
}
i(new C);
c(new C);
}
main.d(6): Error: function main.C.a of type void() overrides but is not covariant with main.I.a of type const void()
main.d(6): Error: function main.C.a does not override any function
あ ごめん const の場所だね
引数が全部inだとクラスのconst関数しか呼び出せなくて困るからダメなんだな
void a(in C c)
{
}
ごめミス
inが普通の変数宣言のときもconst scopeで有効になったらタイプ数減っていいなあ
オー、ノー!
俺が一番嫌いな言葉はsynchronizedで二番目がimmutableなんだぜー!
ジョセフ乙
inとか見て思ったんだけどいつかは既存の string toString() が
const string toString() に大変身するの?
やったことがなかったがC++と同様にconst メンバと非constメンバをオーバーロードできる
また
>>762 のことにより非const関数も別に必要なので
string toString(); と const string toString(); の両方になるべきだと思う
toStringでインスタンスの中身書き換えられたり、constと非constで挙動が違うってのも困るから、
const string toString() がいいとおもう。
>>762 に関しては ref 使えばいいのでは?
元々参照なのにいちいちref付けるのもどうかと思ったけど
書いてみたらさほど手間でもないかな?
stack overflowになるんですけど・・・
import std.stdio;
class A {
override string toString() {
return "A";
}
override string toString() const
{
return "const(A)";
}
}
void main() {
auto a = new A;
writeln(a.toString());
const ca = new A;
writeln(ca.toString());
}
あれ?じゃなくてobject.Error: Access Violationか
なんでだ
>>771 immutable string toString()はどうする
776 :
770:2009/08/27(木) 03:04:33
>>774 個人的には、少なくともObjectクラスのメンバ関数としてはいらないと思うなぁ
そもそもimmutableメンバ関数ってどういう時に使うと便利なものなの?
>>776 static関数だとimmutableにしたりすることはある。なんらかのIDつけるときとか。
インスタンスでそういうケースもないことはないかなという気はする。
779 :
770:2009/08/27(木) 12:09:38
>>777 一応、mutableなインスタンスでは実行できず、imutableなインスタンスなら実行可能なメンバ関数というものではあるらしい。
auto a = new A;
immutable b = cast(immutable)a;
a.immutableMemberFunction(); //NG
b.immutableMemberFunction(); //OK
つまり、immutableメンバ関数外からは絶対にメンバ変数が変更されないという保証がなされる。
ということは、関数内部でメンバに対してmutexロックなど排他制御をする必要がなくなる…という意味では価値があるかもしれない。
けど、だとしたら逆にいえば普通のメンバ関数とかconstメンバ関数内では、メンバ変数にアクセスする際には
必ず排他制御を行わなきゃいけないということになる。
だけどそれは、パフォーマンス的にあまり現実的とはいえず、普通はやらないので、
やっぱりimmutableメンバ関数の有用性には疑問が残る。
castせずこうしてね
auto a = new immutable(A);
782 :
770:2009/08/27(木) 15:32:30
>>781 import std.stdio;
import std.contracts;
class A {
int i = 0;
immutable void immutableMemberFunction() { writeln("immutableMemberFunction, i=", i); }
}
void main() {
auto a = new A;
a.i = 100;
immutable b = cast(immutable)a;
a = null;
b.immutableMemberFunction();
}
こういう場合があるため、それは不適当と判断しました。
783 :
770:2009/08/27(木) 15:41:53
assumeUniqueを使おうとして import std.contracts; したはいいけど配列しか対応していない
ことに絶望したのは言うまでもない。
………なぜだ…。
>>782 キャストしたらimmutable性を自分で保証しなければならず
なくなったり書き換えられたりしたら未定義動作なのですが
これはそのケースになりませんか?
ttp://www.kmonos.net/alang/d/2.0/const3.html > しかし、だからといって、データを書き換えられるようになるわけではありません:
>*q = 3; // コンパイルは通るが、未定義動作
それはともかくこうするとキャストいらないですよ
import std.stdio;
import std.contracts;
class A {
int i = 0;
immutable void immutableMemberFunction() { writeln("immutableMemberFunction, i=", i); }
this(){}
this(A other) {
i = other.i;
}
}
void main() {
auto a = new A;
a.i = 100;
auto b = new immutable(A)(a);
b.immutableMemberFunction();
}
785 :
770:2009/08/27(木) 16:57:19
>>782 値を変更した後にimmutableにキャストし、a = null;でimmutable性を保証しているため、
その未定義動作には当てはまらないと思いますが…(assumeUniqueの仕様例と実装を見る限り)
そのコードはいいかも、と思ったけど、以下のように継承に対応することができないのでは?
import std.stdio;
class A {
int i = 0;
immutable void immutableMemberFunction() { writeln("A: i=", i); }
this(){}
this(A other) { i = other.i; }
}
class B: A {
int j = 0;
this(){}
override immutable void immutableMemberFunction() { writeln("B: i=", i, ", j=", j); }
}
void main() {
auto a = new B;
a.i = 1; a.j = 2;
immutable A b = cast(immutable)a;
immutable A c = new immutable(A)(a);
a = null;
b.immutableMemberFunction();
c.immutableMemberFunction();
}
>値を変更した後にimmutableにキャストし、a = null;でimmutable性を保証しているため、
あーなるほど確かに
下のコードはぱっと見ではわからないので後で見ます
非immutableメンバ関数内で排他制御をしなきゃならん、じゃなくて、
メンバ関数を呼び出す側が排他制御をする必要があるかどうか判断できる、
ということのような気がする。
読みました
immutable A b = cast(immutable)a;//これはcast(immutable(B))aです
immutable A c = new immutable(A)(a);//こっちはスライスされます
こうしましょう
immutable A c = new immutable(B)(a);
>>787 確かにその通りですね。ただ、それはimmutableなインスタンスの有用性であって、
immutableメンバ関数の有用性ではない気がするのですが…
(immutableなインスタンスであれば排他制御なしにconstメンバ関数も呼び出すことができる。
ではimmutableメンバ関数が有用なのはどんな時?)
>>788 もはや自分が何を言いたかったのか忘れてきたけど、何かそれは元も子もない何かを感じる
immutableなインスタンスを作る時にいつもそれができるとは限らないし…
790 :
788:2009/08/27(木) 18:36:31
>>789 僕はキャストを使わなくてすむ方法があるのだから
そっちの方がいいなーということくらいしかないですw
>>789 > (immutableなインスタンスであれば排他制御なしにconstメンバ関数も呼び出すことができる。
> ではimmutableメンバ関数が有用なのはどんな時?)
>782のような場合にimmutableにキャストし忘れた場合にはエラーになるけれど、
関数をimmutableと修飾しておかない場合、エラーにできなくなるような気がする。
792 :
770:2009/08/27(木) 19:23:21
>>791 もう値が変更されなくなった後でないと使うことが許されないメンバ関数…ってことか?
終了処理後でなければ実行することができないと明示するための宣言として利用できるということかな?
Hash計算クラスの、終了処理後でないと計算結果が出せない…みたいな。
immutableがゲシュタルト崩壊してきた
なんでimmutableなんてものを作った
マルチスレッドで他の言語を圧倒しようという目論見
796 :
デフォルトの名無しさん:2009/08/28(金) 00:42:50
std.xml の1947行目あたりで空要素タグの属性が消えちゃうっぽいんだけど、
これってxmlの仕様だっけ?(dmd2.031)
XHTMLにおけるimgタグのsrc属性が不正ではないかという質問と同義。愚問だな。
つまり仕様的には問題なくて、単にライブラリのバグってこと?わかりにくい物言いするね。
それより日本語が入ってるとstd.xml.checkがエラーになる問題をだなぁ
DMD2.0系に対応したSDLのポーティングって存在しないのかな。
>>798 ごめん、愚問だなって言ってみたかっただけでした、すみません。バグだと思います。
auto doc = new Document(`
<html><head></head><body><img src="aaa"/></body></html>`);
assert(doc.elements[1].elements[0].tag.attr["src"] == "aaa");// Range violation
こういうことだよね?
SDL1.3まだー
SDLにIMサポートさえ入ればGUIライブラリを捨てられる
805 :
796:2009/08/28(金) 23:27:39
>>797 >>798 やっぱバグですよね。すっきりした。
>> 801
そうです。
1947: Tag startTag = new Tag(tag_.name);
1948: startTag.attr = tag_.attr; // <- 追加
とりあえずこれで回避しました。ありがとう!
動的配列のバッファ作ってCのライブラリに渡すのって.ptrで大丈夫?
こんな感じで問題ないんだろうか
DWORD[] buffer = new DWORD[size*3];
LibFunc(buffer.ptr);
GCに回収されたらヤバそうだけど
そこ気をつけたら大丈夫じゃね?
DLLを作りたいんですが、コンパイラ引数は何を渡せばいいですか?
>>810 -ofXXXX.dll
だけでいいんじゃなかったっけ。
D3までの音沙汰があまりなくて寂しい
以前のスレにもちらほらあったけど実行ファイルのサイズはもう少しくらい控えめに出来ないのかな。
特に文字列mixinしたら実行時には使われるはずの無い文字列が大量にEXE(-release)の中にあるけど、
不要な関数/文字列まで非デバッグのEXEに入れる必要ってあるの?
教えてエロイ人。
exportしないのなら不要じゃないかな
確かにtemplate/mixinを多用するとその辺の肥大化が著しい
mixin使わないから知らないんだけど
最適化オプションじゃ消えないの?
確かめてないけど、immutableではなくてenumにしても残るの?
DFLなんだけど同じ-release -Oであってもdfl.exeを使った場合が一番小さい
budで-Xにdfl.libとかphobos.libとかを付けたり消したりすることによってもサイズが違うし
dmdを使ってもまたサイズが違う
なんででしょう
謎の
pure a = 1;
nothrow b = 1;
について何かご存じの方はいませんか?
pureとnothrowって記憶域クラスとして利用可能なんだな。
……ところで、記憶域クラスって何なの?
autoとかimmutableとかstaticとかならまだ理解できるけど、
pureとかnothrowとかになるとよくわからなくなってくる…
821 :
788:2009/09/02(水) 19:41:28
pureもnothrowも記憶域クラスの構文に載せた方が実装の都合が良かったから
とりあえずそうなってるだけじゃない?
仕様では詳しく言及してないみたいだし
2.032もうちょっとかな
std.date.Dateって何のためにあるんだろう
てっきりこれを使って「現在時刻から1秒後を取る」みたいなことが
できるもんだと思ってたから10分くらい悩んだ
D 2.032 きてた
>CTFE error messages now explain why the function could not be interpreted at compile time
キタ━━━━━━━━(゚∀゚)━━━━━━━━━!!!
>synchronized member functions now implicitly typed as shared.
これはどういうこっちゃ?
CTFE系うごかねぇwwww
Nested functions can now be used in CTFE
これは動くね
>>828 class A{
synchronized void f(){}
}
A x = new A;
x.f(); // error
auto y = new shared(A);
y.f(); // ok
832 :
796:2009/09/03(木) 22:42:38
>2.032
なおったー!
toで死んだwwwたすけてwww
コードは
version(Windows) std.path.joinのバグ直してくれたよ
次の更新か最新のtrunkで
簡単なバグは今「直してちょ」と伝えるチャンス
特にphobos
なんかあったらissue numberください
toで死ぬとか・・・俺には恐ろしすぎて触れない
昆布に毒でも入ったのか?
import std.conv;
void main() {
int number_normal = 10;
auto a = to!(string)(number_normal);
const number_const = 10;
auto b = to!(string)(number_const); // だめ
immutable number_immutable = 10;
auto c = to!(string)(number_immutable); // だめ
}
----------------------------------------
C:\dmd\dmd\src\phobos\std\conv.d(2580): Error: variable std.conv.to!(immutable(char)[],const(int)).to.u cannot modify const
C:\dmd\dmd\src\phobos\std\conv.d(8): Error: template instance std.conv.to!(immutable(char)[],const(int)) error instantiating
使い方が悪いんだろうか?
>>839 2.031ではいけているからtoに変更があったのかな
ところでconst/immutable storage classって使い分け難しいよね
それほどでもない。
>>836 「ソースコードのどこそこが悪い」と書くとすぐに直してもらえるな。
phobosなら自分でデバッグできるし。
>>840 toというよりコンパイル時の評価順にに変更があるみたい
循環参照があるソースコード全滅 orz
>>842 評価順に依存してるコードに問題があるのか?
dsssでビルドすると破綻するくらい入り組んだ使い方してる俺の出番だな
>>843 ごめん。std.conv.toは中身が書き換わってた
以前2.031の段階でroundToにimmutable/constなものが通らないのでstd.traits使って書き直しとけとITSにレポートしておいたのだが、
Andreiがついでにいろいろ書き直した結果こうなったっぽい
ちなみにエラーの原因はstd.convの所定の行を含む関数見れば分かるので、
自分でデバッグしてITSにレポートするといいかと
仕様安定したら一緒に遊んでみようと思ってるんだが
Dは相変わらず仕様コロコロリンっぽいな
1.0系列があるじゃない
いや、半年くらい前に1回破壊的変更があってTangoすら使えなくなることがあったし、
ついこの前の更新でも余裕で言語仕様に追加があった。
D1系が安定というのは迷信。バージョンごと固定しなきゃダメだ。
そしてバージョン固有のバグに引っかかってにっちもさっちも行かなくなる
>>842 > 循環参照があるソースコード全滅
これは致命的だなぁ…D1系ですらDFL死んでるし。
ああやっぱりDFLが死んだのはそのせいか
importしてるはずのシンボルが未定義になってる
Error 42: Symbol Undefined _D15TypeInfo_Struct6__vtblZ
Error 42: Symbol Undefined __d_array_bounds
リンクエラーの原因がわかりません。
どうすればいいのでしょうか?
Error 42: Symbol Undefined __d_assert_msg
Error 42: Symbol Undefined __tls_array
Error 42: Symbol Undefined _D11TypeInfo_Aa6__initZ
Error 42: Symbol Undefined __d_arrayappendT
Error 42: Symbol Undefined __adEq2
Error 42: Symbol Undefined _D3std9algorithm12__ModuleInfoZ
Error 42: Symbol Undefined _D10ModuleInfo6__vtblZ
857 :
856:2009/09/05(土) 20:07:34
すみません。エラーメッセージに割り込んで書いてしまいました。
たぶんそれ正しいランタイムライブラリ(たぶんphobos.lib)がリンクされてないか、
今のコンパイラのバージョンのランタイムライブラリで一般のライブラリをコンパイルしてないかじゃないかな
とりあえず環境を一から構築してみるといいかも。
>>858 あー情報後だしになって申し訳ないですが、DLLを作ろうとしていて、そこで問題があったっぽいです。
試しにDllMainを普通のmainにしたら、意味のわからないリンクエラーはなくなりました。
ありがとうございました。
>>855 まあ多分この問題はすぐに解消されるだろ
と信じていよう
-200年後-
フラグたてんなw
Dに#ifndefの代替手段って何かあったっけ?
ありそうでなかったような気がしてきたんだが…
static if (!(HOGE)) { ... }
version (HOGE) {}
else { ... }
/(^o^)\
#ifndefは邪道
ifにifnとかないし
ってことで納得しといて
perlにはunlessってのがあるけどな。
それプリプロセッサディレクティブじゃないし
待て待て
あれは static unless が欲しいという話だ
いやまて、perlにunlessとかあろうが、D言語にその予約語は不要だと思うぞ…
でも、 version(!HOGE) みたいなことができたら嬉しいのは、確かに思うこともある。
別にstatic unlessが必要だ!とは俺も思ってないがな
version(Hoge){}else{
...
}
でも別に困りはしないが不格好ではある
構文もversion(!HOGE)しか思いつかないが ! の意味としっくりこないのが悔やまれる
import std.stdio;
template FC() {
void fieldCount() {writeln(this.tupleof.length);}
}
void main() {
class Test1 { mixin FC; int a, b, c; }
class Test2 { int a, b, c; mixin FC; }
class Test3 { int a; mixin FC; int b, c; }
(new Test1).fieldCount;
(new Test2).fieldCount;
(new Test3).fieldCount;
}
出力結果
0
3
1
なん…だと…?
直接書けば大丈夫だけど、テンプレートmixinしたときには
その場所までに定義された分だけ見た値が返ってくるのか。
関数名をthis.tupleof.lengthに依存するようにしたら、同じクラス中で何度もmixinできるな。
コンパイル時のクラス定義時にはそのへんのプロパティは参照できず、
このfieldCountのような場合はちゃんとまともな値を返す、ってのが正しい動作かな?
void f(const string s){}
ってsの型どうなんの?
>>873 const(string) == const(immutable(char)[])
import std.stdio;
template W(T, T U) { string W = U.stringof; }
enum En { A }
void main() {
writeln(W!(int, 123)); // "U"と出力
writeln(W!(string, "str")); // "U"と出力
writeln(W!(En, En.A)); // "En"と出力
}
この3番目が"En"になるのは何でなんだぜ?
なにそれきもい
>>875 テンプレイト以前にそもそも、En.A.stringof が En.A になるはずなのに
En になっちゃってるね。バグだと思う。報告よろ。
よし、英語勉強してくる
import core.thread;
class C { double d; }
void main() {
while (1) {
scope t = new C; // クラスインスタンスならスタックに割り当てられて
//scope t = new double; // プリミティブ型がスタックに割り当てられないのは納得が行かん
Thread.sleep(10000);
}
}
ふつうに構築しろよww
>>879 仕様によれば、scope変数の初期化にnew式を使う場合は、
クラスに限らずスタックに割り当てることになってるからバグだな。
報告しといてちょ
連想配列リテラルってなんで性的に使えないんだろ…
16進数の文字列を整数に変換する関数ありますか?
C++のboostのようにinclude(import)するだけで使えるライブラリを作りたいと思っています。
ライブラリ用のプロジェクトを作ってそこにソースを置いて、sc.iniのDFLAGSにパスを通したのですが、コンパイルはできてもリンクエラーが出てしまいます。
どうやればいいのでしょうか?
>>885 そんなもんparse!int("0xffff")とかで…
できないね。変態度が足りん
>>886 importはincludeと違ってそのまんまコピーしてくるわけじゃないからなあ
dmd a.d library.d
みたいにいちいち一緒にコンパイルするか、自動的に依存するファイルを探してくれるbudみたいなツールを使うか、
ライブラリを作ってDFLAGSでリンクするように設定するか
となるとimportするだけで使えるライブラリって無理か
>>886 #includeするだけで使えるライブラリ?
これの出番かw
mixin(import(filename.d"));
>>886 ありとあらゆる関数をテンプレートにすればいいよ.
とりあえず簡単なテンプレート関数だけのモジュールならimportだけで使えた。
なんかリンクする必要があるなら、ちゃっかりライブラリ側でpragma(lib,"foo.lib");とかやっちゃえばいい気がする。
T func(T : string)()
{
return "Hello,world!";
}
T func(T : int)()
{
return -1;
}
void main()
{
string str = func();
writeln(str);//Hello,world!
}
これが動いたらやりたいことが色々できるんだけど無理かなぁ
auto t = func();
とかの時だけ特別にエラーでいいからやってほしいよな
あー、ついこの前欲しいと思ってたやつだ
autoを例外にすればやってやれないことはないと思うんだけどな
自作したstaticライブラリにリンクしたら
Error: no object files to link
というエラーが出たんですが、これはどういう意味なのでしょうか?
>>894 左辺値から右辺値を推論って最近話題だよね
>>889 parse!int("0xff")に統合して欲しいところだが
N進数文字列から数値への変換関数とどちらがいいか・・・?
toは数値からN進数文字列への変換関数としても使えるようだ
baseを指定しなかった場合はプレフィックスから自動判別、
baseを指定した場合はプレフィックスでエラー
がいいと思う。
904 :
デフォルトの名無しさん:2009/09/11(金) 17:15:45
(´・ω・`)D言語ってOpenGLを使えますのん?ん?ん?
どうして使えないと思ったのか
DxLibなら使えるよ!!
glfwなんか、公式でバインダ付属だったな。
もっとも、そのままじゃD2で動かんが。
D言語の画像処理はDxLibが必須だよ!!
ならば今すぐ*nixどもすべてにDirectXを与えてみせろ!
Dで実行ファイルがあるディレクトリを簡単に取得する方法教えてください
>>911 void main(string[] args) {
string dir = std.path.dirname(args[0]);
}
これmain以外の所から取れるんだろうか?
>>912 Windowsではmainのargを初期化するのにGetCommandLineWを使っているから
argv[0]は完全修飾のファイルパスになるけど、
PosixではCランタイムに依存しているので必ずしもディレクトリ部がついているとは限らないし
そこにファイル名が入ってすらないかもしれない。
正確を期すならばGetModuleFileNameを使ったり、Linuxなら/proc/self/exeのリンク先を見たりするのがいいと思う。
OSXやFreeBSDはしらない。
914 :
デフォルトの名無しさん:2009/09/11(金) 22:53:19
dsource.orgのWindows API Bindingsの
WSAAsyncSelect(SOCKET, HWND, u_int, long); は
WSAAsyncSelect(SOCKET, HWND, u_int, int); じゃないかと思うんだが、どうだろう。
0x_
って文法上は認められてるみたいだけどこれいくつになるの
>>915 整数リテラルの説明のBNF?表記だけみればそうかもだけど
>整数の途中に文字 '_' を入れることができます。 この文字は単に無視されます。
て説明されてて、dmdはちゃんとしたエラーだしてるから、
文法上許してない、でいいんじゃね?
eclipse+descentを使っているのですが、
複数のソースをビルドする時、手動でコンパイル引数を入力するしかないのでしょうか?
ctrl+クリックでソースを複数選択した状態でビルドしても、1つのソースしかビルドされていないみたいです。
>>916 0_
はどうかな
文法上は10進数じゃなくて8進数になるはずだけど
0x_がエラーならこれもエラーなのかな
でも0_がエラーで1_はOKってのもなんか変だよな
あと _._ は浮動小数点数になるのかな
_1._2は浮動小数点数1.2なのか_1オブジェクトの_2メンバなのか
よく読むとこの辺の文法ツッコみ所満載だな
>>920 いやいや、そこの文法に忠実に従うとそうなるっていう話なんだけど
Decimalは「0」一文字か、NonZeroDigitから始まる必要があるから
0_ はDecimalではない
一方「_」はOctalDigitなので0_はOctalに適合する
したがって0_ はOctal
一方、DecimalFloatは「DecimalDigits . DecimalDigits」で、
「_」はDecimalDigitなので _._や _1._2 はDecimalFloatに適合する
もっとも _ や _1 がIdentifierに適合するのは確かだけど、
字句解析はmaximal munchルールだから先読みしてやはり _1._2 はDecimalFloatに適合する(
>>919の指摘通りですね)
スペース入れて 「_1 . _2」ならIdentifier2つとドットになるんだろうけど
そんな感じの記述の齟齬は他にもなんかあった気がするな
ひどいのだと
._e+_f
がFloatLiteralに適合してしまう
Dの仕様のBNFはかなり適当だな。
実装を変えたのにドキュメントはそのままの箇所も結構あるし。
925 :
920:2009/09/12(土) 03:54:05
結局、足りてない説明って
・リテラル先頭に'_'はおけない(Identifierになるから)
・DecimalDigits,HexDigits,OctalDigits,BinaryDigits は
'_'以外の該当文字が必要('_'のみで構成されるのは不可)
って感じ?
(BNFでない説明も読めば、あまり勘違いしそうにないような
気もするけど)
._0 とかどうしようもなくないか?
モジュールのスコープ解決演算子 '.' を使ってモジュール全体のスコープから_0というIdentifierを探すのか、
0.0 という意味の double型の浮動小数点数リテラルなのか、
仕様を全部読んでもどっちが正しいのかわからないような。
.0って書けてもさほど嬉しくないから._0はglobal identiferでいいだろ
.1 は数字であって欲しいけど
._1 は数字であって欲しくないなあ
スコープ解決された_1というIdentifierは表現できないってこと?
結論:ドキュメント直してください
Dのソースファイル配布するときってコンパイルしたDMDのバージョンも一緒に載せないと意味ないよね
疑似Dのコードで配布して、使う人が自分のコンパイラに合わせてチューンすればいいよ
疑似コードからバージョン別のDのコードにコンバートする言語作れば解決だな
まず、Pseudo-D言語の策定からだな。
コンパイラのバージョン、標準ライブラリのバージョンごとに書かれたparse関数があって
mixin(parse!(import("mymodule.pd")));
とかしてやるわけか。
とりあえずD2をD1に変換してください
そしてPseudo-Dの仕様が一向に固まらなくて疑似Pseudo-Dのコードで配布しようという所に落ち着く
Pseudo-Pseudo-Dの誕生です。しかし、Pseudo-Pseudo-Dの仕様が固まらず、Pseudo-Pseudo-Pseudo-D以下略
Stack Overflow
doxygenってD言語(DMD2.031)に対応してますか?
version1.6.1を使ってみたところ上手くhtmlを吐いてくれない。。
>>944 -Dすれば?
ソースが複雑だとDMDですら落ちるけど。
>>945 レスthx
オプション知らなかった、試してみます。
既存のライブラリをあるフォルダAに入れて使いたいと思ったとき、
いちいち module や import などで A. って付けないといけないですか?
だとしたらメンドクサイ・・・。
いあいあ
くとぅるふふたぐん
950越えたから保守
俺ケータイなので
誰か次スレ立てておk
Dのデストラクタは予想以上に呼ばれないね
消したら?
そりゃガーベジコレクタが動くまでは呼ばれないから
C++のデストラクタのようなものを期待してれば裏切られる。
Dのクラスオブジェクトのデストラクタは、
Javaや.NETでいうファイナライザに相当するもの。
C++のデストラクタのようなものが欲しいなら.NETでいうDisposeパターンを実装するしかない。
C++/CLIではDisposeメソッドのことをデストラクタと呼んでいるくらいだし。
/^l
,―-y'"'~"゙´ | それ るるいえ うがふなぐる ふたぐん
ヽ ´ ∀ ` ゙':
ミ .,/) 、/) いあ いあ
゙, "' ´''ミ ハ,_,ハ ハ,_,ハ
(( ミ ;:' ,:' ´∀`'; ,:' ´∀`';
'; 彡 :: っ ,っ :: っ ,っ
(/~"゙''´~"U ι''"゙''u ι''"゙''u
うぉるたー!
配列演算が楽しくなってきたところで…
idouble[] arr = [1i, 2i, 3i, 4i];
arr[] += 3;
でエラー吐いた後dmd落ちた。
ちなみにdmd2.032ね
演算後に型が変化しないことを表明する白魔術探すか
test.d
import std.stdio;
void test() {writeln("test");}
void main() {
test!(0, true, "AAAAAAAAA!")();
}
$ dmd -run test.d
test
(゚д゚)
960 :
デフォルトの名無しさん:2009/09/17(木) 22:07:08
複素数はstd.complexに置き換えられるのだろうか?
961 :
デフォルトの名無しさん:2009/09/17(木) 22:45:23
もうZ言語までいこうぜ
>>960 それが実現したらなんていうか、言葉に出来ない気持ちだよね
libcurlのバインディングで使い物になるやつ知りません?
systemでcurlを起動してる俺に言われても
char*からstringへの変換をstd.convのtoを使って書いたのですが、実行時に例外ConvErrorが投げられます。
原因を特定するために、convのソースを見てみたのですが、2979行のreturn to!T(cast(size_t) value, 16u);が分かりません。
この先は何行目を見ればいいのでしょうか?
noopのscopeいいな。Dにも入れて欲しい
どういう機能?
968 :
デフォルトの名無しさん:2009/09/18(金) 20:52:25
import std.stdio;
void main()
{
write("Say hello : ");
string line = readln();
if (line == "hello")
writeln("Hi.");
else
writeln("Bye...");
}
これ何入力しても偽になるんだがヘルプミー
Ubuntuです
D
typedef型をtoで文字列にしたり戻したりできないのな
というかtypedefの元の型を取る方法ってあるんだろうか
>>968 つstd.string.chop(readln());
>>972 static if(is(T X == typedef))
>>976 あなるほど再定義すればいいのか
Thx
>>976 is 式ほどわけわからんもんもないなあw
C言語でDLLを作ることによって拡張できるアプリケーションがあります。
これに対してD言語で作ったDLL(extern (C) export)で、下記の4つを試しました。
1、空の関数を呼び出す→何もおきない
2、例外を投げてキャッチしない→「不正な処理〜」とメッセージが出て落ちる
3、例外を投げて、投げた型でキャッチする→上と同じ
4、例外を投げて、Object型でキャッチする→何もメッセージが出ずに落ちる
3と4が謎です。
テストコードのexeを作って、そのまま実行なら落ちないんですが、
DLLにすること事によって例外の挙動が変わるのはどういうことなのでしょうか?
例外はDLLを越えちゃいかんのでは?
DLLのインターフェースにする関数はnothrowな関数であるべきだと思う。extern(C)なら特に。
>>982 DLL内の関数で投げて、その関数内でキャッチしてます。
3はキャッチできてなさそうだし、4はキャッチできてるならDLLの外には影響しないはず?と思うのですが謎です。
キャッチ出来てない例外があるとは思わないのか
>>984 の言うように取れてない例外があるか…
Objectをキャッチしても落ちると言うなら、何かしらのアクセス違反があるのかもしれない。
>>981 丁度try-catchで止められない例外が出たわ
自分のは単にアクセス違反だったよ
デバッガで追うと意味不明なところで止まるから、
そこで使ってるグローバル変数を__gsharedでマークしたらとりあえず動いた
extern(C) exportの中はTLSにアクセスすることすら許されないんだろうか…
>>984-986 class Exception {};
try{
throw new Exception;
}
/*catch (Exception e) {}*/
catch (Object o) {}
関数の中身は簡単なテストコードです。
うーん、分からない。
GC初期化されてなくてnewで死んでるとかはないか?
>>988 どうやらそれっぽいです。
throw new Exception;
を
Exception x = new Exception;
に変えても同じ症状になりました。
どうもでした。