X



D言語 Part34©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
垢版 |
2015/01/25(日) 12:07:29.52ID:gAd5OZDm
プログラミング言語 D (D Programming Language) について語るスレッドです。

■本家
http://dlang.org/ - 公式(英語)
http://www.kmonos.net/alang/d/ - 公式の和訳 (やや古いので注意)
https://issues.dlang.org/ - D言語バグ報告
https://github.com/D-Programming-Language - D言語開発リポジトリ

■Wiki
http://wiki.dlang.org/ - 公式Wiki
http://dusers.dip.jp/ - D言語友の会(日本語フォーラムあり)

■プログラミング言語D (TDPL: The D Programming Language)
Andrei Alexandrescu 日本語版
http://www.shoeisha.co.jp/book/detail/9784798131108

ソース貼付サイト http://dpaste.dzfl.pl/
<$><$> https://www.bountysource.com/trackers/383571-d-programming-language

■前スレ
D言語 Part33
http://toro.2ch.net/test/read.cgi/tech/1396145538/

■過去スレ、関連スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=D%8C%BE%8C%EA&;sf=2&all=on&view=table&shw=5000
0189デフォルトの名無しさん
垢版 |
2015/04/27(月) 19:41:43.14ID:JZyYoAVB
>>186
それここ1ヶ月くらいのことじゃね?
まあでもそういう姿勢を公式に明確にするのはいいことだ
0190デフォルトの名無しさん
垢版 |
2015/04/30(木) 23:13:29.89ID:DC2IuzKP
PCがオワコンになって一般人はスマホやアップルウォッチしかコンピューターを持たない時代が来るのに
Dを始めとするPCアプリ専用言語に未来はあるのか
0192デフォルトの名無しさん
垢版 |
2015/05/01(金) 15:43:57.35ID:VV0Lze55
サーバーサイドでも使われないとか終わってる
0193デフォルトの名無しさん
垢版 |
2015/05/03(日) 12:05:34.37ID:frUd71C/
>>192
Goで泥アプリ開発できるようになったし、PCから移行するにつれいろんな言語が泥とかアフォン
とかでも使えるようになる。

という妄想
0194デフォルトの名無しさん
垢版 |
2015/05/11(月) 22:49:25.75ID:umG0fBs5
Tcpを用いたサーバーアプリケーションを作成しています。
一つのSocketを処理するスレッドをspawnで起動しようとしたのですが、
"Aliases to mutable thread-local data not allowed." というエラーが出てしまいます。

Socketをスレッドのコンテキストとして渡す方法はありますか?
0196デフォルトの名無しさん
垢版 |
2015/05/20(水) 14:35:43.34ID:RjQMrwaX
enumのメンバの中からランダムに1つ取り出すにはどう書いたらいいですか?
0197デフォルトの名無しさん
垢版 |
2015/05/20(水) 17:11:00.71ID:VhPE5aVV
import std.stdio, std.traits, std.random;

enum E { Hard, Normal, Easy, }
auto lv = [ EnumMembers!E ];
lv[ uniform(0, 3) ].writeln();
0199デフォルトの名無しさん
垢版 |
2015/05/20(水) 19:21:10.83ID:VhPE5aVV
あ、配列なんだからuniform(0, $)でよかった…。

タプルの配列化?みたいな

他にも関数の引数リストとか、構造体のメンバ変数を
タプルでとれたり、std.traitsは結構楽しい
0200デフォルトの名無しさん
垢版 |
2015/05/23(土) 09:46:23.34ID:LbQhEyX4
メンバにUDAを付加するだけで
文字列化やシリアライズのメソッドが自動or暗黙生成されるような
いい感じの小技はないかしら
0201デフォルトの名無しさん
垢版 |
2015/05/23(土) 20:05:33.06ID:T/VMnfch
static ifと文字列mixinを駆使すればなんでもできそう
コードはくっそ汚くなるけど…というかいくらなんでも汚すぎるので俺がなにか勘違いしてる

class Cls {
@getset(true, true) private string prop;
mixin Prop!(__traits(allMembers, typeof(this)));
}
struct getset {
bool get, set;
this (bool get, bool set) { this.get = get; this.set = set; }
}
mixin template Prop(Members...) {
static if (Members.length) {
mixin("alias Alias = " ~ Members[0] ~ ";");
static if (is(typeof(__traits(getAttributes, Alias)[0])==getset)) {
static if (__traits(getAttributes, Alias)[0].get) {
mixin("auto get_" ~ Members[0] ~ "() { return " ~ Members[0] ~ "; }");
}
static if (__traits(getAttributes, Alias)[0].set) {
mixin("void set_" ~ Members[0] ~ "(" ~ typeof(Alias).stringof ~ " value) { " ~ Members[0] ~ " = value; }");
}
}
mixin Prop!(Members[1..$]);
}
}
void main() {
import std.stdio;
auto cls = new Cls;
cls.set_prop("getset");
writeln(cls.get_prop()); // write "getset"
}
0204片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/06/17(水) 19:52:38.87ID:/OO8ry8l
Dの簡単インストーラー作るぜ。アイデア募集。
0208デフォルトの名無しさん
垢版 |
2015/08/07(金) 01:19:25.71ID:AOl5d/Q7
vote
0213212
垢版 |
2015/09/13(日) 01:16:43.63ID:6EXYsBmd
>>212 がgithub版でもおきるかなー?と思ったんだけど、github版dmdをコンパイル中にエラーが出た。
内容は、「ソースに\r\nが含まれますよ」というもの。
出してるのは、dmd -run src/checkwhitespace.d の部分。
このツールは
1. \r\n がソースに含まれている場合。
2. インデントに\tを使っている場合。
3. 行末に不要な空白文字がある場合。
にエラーを出すようなんだけど、3はともかく、これで行くことに決まったのかな。
smart-tab派なんだけどなー。
あ、github版でも212は再現しました。
0215デフォルトの名無しさん
垢版 |
2015/09/23(水) 01:15:09.12ID:c39jTuOR
おまいらこれはなんでなんだぜ
http://dpaste.dzfl.pl/7fa1a12a8c4a

1. enum をクラスインスタンスで初期化できない→わかる。構造体でラップすると通る→?
2. 1. において、ラップされたクラスが mutable。
0218デフォルトの名無しさん
垢版 |
2015/09/29(火) 09:14:53.57ID:2BMWd/g5
2.068.2 出てた

ちなみに Win32-COFF が隠しオプション(-m32mscoff)で出来るようになってるので
OMF/optlink がイケてないと思っていた諸兄は試してみるがよいよいよい
0219デフォルトの名無しさん
垢版 |
2015/10/04(日) 20:25:42.92ID:fx9NWY8o
int arr[x][y][z];
これと同じメモリレイアウトでヒープに確保するにはどうすればいいですか?
0220219
垢版 |
2015/10/04(日) 20:56:03.94ID:fx9NWY8o
new int[x*y*z]でよかった。
問題なのはint[]のメモリへのアクセスをint[x][y][z]と同じようにする方法だった。
0221219
垢版 |
2015/10/04(日) 20:59:30.10ID:fx9NWY8o
自己解決。
[0][0][0],[0][0][1]...[0][1][0],[0][1][1]...の順番で並んでるだけだった。
0223デフォルトの名無しさん
垢版 |
2015/10/09(金) 21:58:55.85ID:So4fPMkx
const class A { int a; this(int v) { a = v; } }
このクラスAを値に持つ連想配列を作りたいんだけど、

const(A)[int] hoge = [1: new const A(1)];
hoge[3] = new const A(3); // cannot modify const expression hoge[3]
みたいに、初期化はできても代入ができない。

A[int] hoge = cast(A[int])[1: new const A(1), 2: new const A(2)];
hoge[3] = cast(A)new const A(3);
てなふうにcastしたら回避できたけど、なんか美しくない。
typeof(new const A(1)).stringof == "const(A)" なのがおかしい気がするんだが。
0224223
垢版 |
2015/10/09(金) 23:28:50.19ID:So4fPMkx
書き込んでから思い出したけど、Rebindableとかできて結構経つしあきらめるしかない気がしてきた。

>>218 optlink死んでまうん?
0225デフォルトの名無しさん
垢版 |
2015/10/10(土) 00:27:09.81ID:MYHuAGIQ
const classとかscope classとかは今もまともに使おうと思えないね
普通のclass内でメンバをconstにするとかじゃないとまともに動く気しない
0226デフォルトの名無しさん
垢版 |
2015/10/15(木) 18:54:50.42ID:pJRyZOgY
nullではなく、空の連想配列で初期化するにはどうすればよいですか?
0227デフォルトの名無しさん
垢版 |
2015/10/16(金) 08:36:04.34ID:CAVKRc42
空の配列 == null なので無理

ただし空文字列 "" は例外 落とし穴になりがちなので注意
0228デフォルトの名無しさん
垢版 |
2015/10/16(金) 13:11:04.24ID:TDfNRPC3
ちょっと良くわかりませんが、D言語は空の配列すら作れないんですか?
不便ですね
0230デフォルトの名無しさん
垢版 |
2015/10/16(金) 17:54:55.90ID:MCgyDKhx
a = {};

こんなのを期待してるのかな
0231226
垢版 |
2015/10/16(金) 18:32:37.08ID:+5uWvhRc
>>227-230 レスありがとう。やりたかったのはこういうことです。

string[string] buf;
auto buf2 = buf;
buf2["hello"] = "world";
buf.writeln; // > []

これと↓

string[string] buf = ["": ""];
buf.remove("");
auto buf2 = buf;
buf2["hello"] = "world";
buf.writeln; // > ["hello":"world"]

では結果が違うわけだけど、後半の上2行を初期化1行で書きたいな。
という話でした。
0232デフォルトの名無しさん
垢版 |
2015/10/16(金) 19:36:08.03ID:TDfNRPC3
結局どういうことなんですか?
Dでは空の配列を作れないんですか?
必ず何か入っていなければダメなんですか?
int[] a; って書けば空の配列になるんじゃないんですか?
0233226
垢版 |
2015/10/16(金) 21:04:57.54ID:+5uWvhRc
>>232
int[] a; で空の配列になりますよ。
226のは「連想配列」が俺にはややこしいっていう話です。
0234デフォルトの名無しさん
垢版 |
2015/10/16(金) 21:47:10.30ID:BcAfRt/g
>>231
string[string] buf = (a => (a.remove(""), a))(["" : ""]);

ところで、コンマ演算子を廃止しようとか言ってたのは自然消滅したのか?
0235226
垢版 |
2015/10/16(金) 22:51:07.22ID:GwISFyO6
>>234 ありがとうございます。ところでもっと基本的な疑問がわいたのですが、
>>231 の後半での、bufとbuf2の中身がずっと同じであるっていうのは、仕様で保証されてるんでしょうか?
Windows版dmd2.068.2では、1000個値を追加しても同じでした。
0237デフォルトの名無しさん
垢版 |
2015/10/17(土) 09:08:29.29ID:M7lcZRBS
それに連想配列の内部実装は最近まで大きく書き換えられてて
動作の微妙な違いとかあるのでトリッキーなことは避けるべき
0238226
垢版 |
2015/10/17(土) 22:20:49.79ID:KpZ8gQf0
>>236-237 そうなんですね。書き換えます。ありがとうございます。
0241デフォルトの名無しさん
垢版 |
2015/10/28(水) 16:43:28.27ID:w9dndjrH
D言語って、Javaみたいにソースファイル名とクラス名を同じにしてしまうと、
他のソースでクラス名のつもりで記述したものがパッケージ名扱いになってしまうため
Hoge.Hoge のように同じ名前を2回書かないとクラス名と解釈してくれないと思うのですが、
これを1回だけの記述で済ましたい場合、皆さんはどのように解決されているんでしょうか?
ソースファイル名を変えるのもmodule文で別名にするのも、何か違うように感じてしまいます。
0242デフォルトの名無しさん
垢版 |
2015/10/28(水) 19:24:28.95ID:9zUX3+we
モジュール名とファイル名は小文字
クラス名は大文字始まり
それでもカブるようなケースはパッケージを作るからまず困らない
0244デフォルトの名無しさん
垢版 |
2015/10/29(木) 10:25:47.23ID:xCMI4xlR
>>242
なるほと確かにD言語の命名規則からするとモジュール名は小文字でしたね。
でも、どうしても大きなクラスは同名の一ソースにしたいのです‥すみません。

ところでパッケージで気付かせてもらったのですが、この問題って、
クラスのソースらをルート階層に置いているからこそ起きる問題なのですね。
というわけでディレクトリを一つ掘ってパッケージ下に配置することで一応解決しました!

ただ、パッケージ下にあるソースって module パッケージ名.モジュール名 の記述は必ず必要なのでしょうか?
module文の記述が無いとルートパッケージ下として格納されてしまうようで、
module文を普段省略していた身からするとちょっと面倒に感じています。
この辺りの挙動はjavaのpackage文の踏襲かなと思うのですが、
D言語ではパッケージはディレクトリに対応すると書かれているようなので、
module文を省略しても適切なパッケージに配置してくれて良いような?

>>243
おぉ‥改名選択importというやつでしょうか。確かにこれで通りました。
import _Hoge = Hoge : Hoge; という風に変換されるんですね。
import文までコンパイル時生成できるとは、D言語きm‥素晴らしいです。
ただこの書き方ではモジュール名変更リファクタリングの際にIDEが解析しにくい気がするので
(そもそもそこまでお世話してくれるIDEは現存しないようですけれど‥)、
取り敢えずは先のパッケージへの配置法でがんばってみます。
凄いものをありがとうございました。今後の困難の際に参考にします。
0246デフォルトの名無しさん
垢版 |
2015/11/06(金) 23:00:00.73ID:XSTiM1/K
Error: template std.algorithm.searching.countUntil cannot deduce function from argument types !()(int[11], int), candidates are:
こういうエラーが出たんですけど、countUntilに静的配列は使えないということでしょうか?

Error: template instance sort!((uint a, uint b)
あと、sortに無名関数を渡したらエラーが出ました。無名関数も使えないのでしょうか?
0247デフォルトの名無しさん
垢版 |
2015/11/07(土) 11:16:15.31ID:oYYknJv4
静的配列に対して popFront() が呼べない(初めて知った!)
だからレンジ系操作に対しては全滅に近い

ソートの方はそれだけじゃ分からんね
無名関数は使い方間違えた時にわかりづらい
0248デフォルトの名無しさん
垢版 |
2015/11/07(土) 15:26:06.21ID:k3hAw3NX
静的配列は要素数が変更できないからですか。
Rangeの要件を満たしてないとなると結構不便ですね。

sortはエラーメッセージがこの1行しか出ないんですよね。
シンプルな例でテストしたらコンパイルは通ったんですけど、他のコードが影響してるのかなぁ。
0249デフォルトの名無しさん
垢版 |
2015/11/07(土) 22:04:33.49ID:X4t7LIyp
固定長配列の全体のスライスを取って動的配列に見せかければ
ある程度のRange操作だったら固定長配列にもかけられるのでちょっと便利です
0252デフォルトの名無しさん
垢版 |
2015/11/14(土) 10:33:38.52ID:TuAUCuHQ
SortedRange!(R, ((a, b) => binaryFun!less(unaryFun!transform(a),
unaryFun!transform(b))))
schwartzSort(alias transform, alias less = "a < b",
SwapStrategy ss = SwapStrategy.unstable, R)(R r)
if (isRandomAccessRange!R && hasLength!R)
{ ... }

こんなの見ても揺らがないのが真のD言語er
0253デフォルトの名無しさん
垢版 |
2015/11/14(土) 12:16:16.84ID:AP01jWaC
真のD言語erはそんなに書いて(書かせて)もらえることに感謝する
0254デフォルトの名無しさん
垢版 |
2015/11/14(土) 20:42:57.89ID:uWuWWunU
デバッグ用に関数名を出力したいんですけど、関数名を取得する方法はあるでしょうか?
__FILE__や__LINE__みたいな感じのが欲しいです。
0256デフォルトの名無しさん
垢版 |
2015/11/15(日) 00:49:19.11ID:DVr3HCs9
基本的には、DではCの標準ライブラリと同等の関数をほぼそのまま薄いラッパで提供しています
0261デフォルトの名無しさん
垢版 |
2015/11/15(日) 15:01:11.74ID:4YAQhy/L
自作のプログラムを実行すると毎回同じ場所でobject.Error: Access Violationが発生します。
エラーとは関係なさそうな修正(stderr.writeln()を増やしたり減らしたり)をするとエラー発生の場所が変わったり、
InvalidMemoryOperationErrorに変わったりします。
エラーの原因がさっぱり分からないんですけど、どういうことが考えられるでしょうか?
0263デフォルトの名無しさん
垢版 |
2015/11/15(日) 16:21:30.07ID:4YAQhy/L
GCのある言語でメモリリークとなると、どういうケースがあるのか想像がつかないです。
エラー発生の場所も変わるので謎です。
0265デフォルトの名無しさん
垢版 |
2015/11/15(日) 17:07:38.68ID:lu/bgS1P
こマ?初めて聞いたその結び付け
リーク=解放処理漏れ 以外の認識ないわ
0266デフォルトの名無しさん
垢版 |
2015/11/15(日) 17:19:50.76ID:4YAQhy/L
newする前のクラスのインスタンスの関数を使ってAccess Violationが出たことは過去にありますね。
しかし、今回はちゃんとnewされているし、1回目の呼び出しでエラーが発生してるわけでもないんですよね。
そして>>261で書いたようにstderr.writeln()を追加するだけでエラー発生のタイミングが変わるので難解です。
0267デフォルトの名無しさん
垢版 |
2015/11/15(日) 18:08:15.11ID:PV6fOtMt
初期化してない変数でアクセス
0268デフォルトの名無しさん
垢版 |
2015/11/15(日) 18:39:09.01ID:ndJn5r2D
AVならばぬるぽか RangeErrorか deleteの間違い
-g -debug してないんかいな

InvalidMemoryOperationError 
ならばデストラクタの中で何か変なことしてる疑い

デストラクタの中でdeleteとかしちゃダメダメよ〜
0269デフォルトの名無しさん
垢版 |
2015/11/15(日) 18:44:09.41ID:zgz009B6
似たことなったことあるなあ。なんやったか。
templateとかmixinがらみで依存関係見落としててobjの更新忘れとか。
0270デフォルトの名無しさん
垢版 |
2015/11/15(日) 19:02:33.53ID:4YAQhy/L
すみませんReleaseビルドになってました。
DebugビルドにしたらRangeErrorになりました。
0271デフォルトの名無しさん
垢版 |
2015/11/15(日) 19:09:44.01ID:PV6fOtMt
報告乙
0272デフォルトの名無しさん
垢版 |
2015/11/19(木) 16:51:28.76ID:I2rQS35X
char *hoge[] = new char *[N];
scope(exit) free(hoge.ptr);
とするのと
char **hoge = cast(char **)(new char *[N]);
scope(exit) free(hoge);
とするのとでは同じ動作が期待出来ますか?

あとガベコレを期待するなら
scope(exit) free(hoge.ptr);

scope(exit) free(hoge);
もどちらも不要ですか?
0273デフォルトの名無しさん
垢版 |
2015/11/19(木) 23:48:30.24ID:kWkiLP1L
色々とカオス(感想)
C : malloc/free
C++: new/delete

D : new/[destroy]
GCがあるので解放は不要だが、領域が不要になったことをdestroyで明示してもよい
ただしdestroyで領域が即時解放されるわけでなく、GCが必要に応じてよしなにやる
C++のdeleteと区別するために、destroyになった(想像)
---
auto hoge = new int[][N]; // int型の動的配列をN要素もてる動的配列(二次元配列)
foreach (elem; hoge)
elem = new int[色々]; // ジャグ配列も可能
// 以下は不要(してもよい)
foreach (elem; hoge)
destroy(elem);
destroy(hoge);
---
GCを使わずmalloc/freeすることも一応可能
(今だと、std.experimental.allocatorを使うべき?)
newしたものをfreeすることに保証はないと思う、知らんけど
0275デフォルトの名無しさん
垢版 |
2015/11/20(金) 10:48:03.85ID:LnAg0HCn
ありがとうございます!!
0276デフォルトの名無しさん
垢版 |
2015/11/20(金) 22:50:35.51ID:KMWFgUCm
クラスのstaticメンバ関数で、継承先の型って見られますか?

class Base {

static T[] takusanMake(T)(int n) { //Hogeから呼んでT=Hogeがほしい
T[] ret = new T[n];
foreach (ref e; ret) {
e = new T;
}
// ... Baseのフィールドしかいじらないような設定 ...
return ret;
}

}

class Hoge : Base {
}

void main() {
//Hoge
auto hoge = Hoge.takusanMake(30);
}

内容はともかく、大体こんな感じのことをしたいです
Baseから派生したクラスで定義するとか、ちゃんと!(Hoge)してもいいんですが、
(this T)を見てから何か方法があるような気がしてきて・・・
0277デフォルトの名無しさん
垢版 |
2015/11/21(土) 13:20:00.57ID:1cOWOBSi
staticなメンバ関数からは、thisは見えないので
UFCS前提でいっそ外部に出して
===
import std.stdio;

class Base {}
class Hoge : Base {}
class Other {}

T[] takusanMake(T : Base)(lazy T d, int n) {
auto ret = new T[n];
foreach (ref e; ret) {
e = d();
}
return ret;
}

void main() {
auto hoge = (new Hoge).takusanMake(30);
typeid(hoge).writeln;
// Baseに暗黙変換できない型はNG
//auto other = (new Other).takusanMake(30);
}
===
こういうのはどうだろう
(もっといい方法ありそう。。)
0278デフォルトの名無しさん
垢版 |
2015/11/21(土) 14:42:18.71ID:8z9xCqW5
Hoge という型と Fuga という型があって

Hoge[Fuga] hage;
という連想配列は定義できるみたいなのですが

Any という任意の型があるとして
Any[Any] moge;
みたいな連想配列は作れますか?
0279デフォルトの名無しさん
垢版 |
2015/11/21(土) 14:47:56.80ID:8z9xCqW5
ちなみに
["A": "B", "C": 3, 4: "E"]
みたいなのを作りたいのです
0281デフォルトの名無しさん
垢版 |
2015/11/21(土) 22:31:38.28ID:jpeEJ7vY
import std.variant;
auto moge = [Variant("A"): Variant("B"), Variant("C"): Variant(3), Variant(4): Variant("E")];
とかいうダサい感じのしか思いつかない。
0282デフォルトの名無しさん
垢版 |
2015/11/21(土) 23:35:17.00ID:BXVotCtM
>>277
確かにもう外に出してしまう方がいいかもしれないですね
外に出すことは考えてなかったのでもうちょっと考えてみます
0284デフォルトの名無しさん
垢版 |
2015/11/22(日) 12:42:54.55ID:rXOpUu6m
>281
ダサくてよければ

Variant[Variant] constructor(T...)(T plist){
Variant[Variant] result;
foreach(ref p; plist) result[new Variant(p.keys[0])] = new Variant(p[p.keys[0]]);
return result;
}
Variant[Variant] moge = constructor(["A": "B"], ["C": 3], [4: "E"]);

試してないけど
0286デフォルトの名無しさん
垢版 |
2015/11/22(日) 18:34:22.00ID:uPJ5yBy3
import std.variant;
import std.stdio;

Variant[Variant] makeTable(T...)(T p) {
static assert(T.length%2 == 0);
Variant[Variant] t;
foreach (i, ref v; p) {
static if (i%2 == 0) {
t[Variant(p[i])] = Variant(p[i+1]);
}
}
return t;
}

void main() {
auto t = makeTable(1, 2, "hoge", 123.2);
writeln(t);
}
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況