D言語 Part34©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
仕様書であるTDPLを入門書と間違えて買ったんだろうな Visual D使ってる人に質問です。 Visual Dって標準ライブラリの予測変換でないんですか? どうせ出てほしい時に出なくて 必要ないときに邪魔なポップアップが出るみたいな お粗末なものにしかならないべ 言語設計レベルからそこまで考慮してないと C#はforeach使うとGCが増えるらしいけど Dはどうなの? Dってどこで学んだらいいんだ dlang.orgしかない? https://gist.github.com/repeatedly/2470712 ここ読んで文法身につけて、 標準ライブラリは公式がそこそこわかりやすいからそれで。 (日本語訳はちょっと古いが、参考には十分なる) んで、わからないことはここか、 最近はtwitterで#dlangのハッシュタグつけて質問するのも流行り。 自分も去年一度質問投げたら、一時間で三人から同じ解答来て震えた。 >>164 ありがとうございました。なんか出てきました。 以前にC++とねんごろになれるうpあったとか見た気がしたけど、あれは幻覚だったのかこの流れ見ると namespaceに対応したり、C++側でインスタンス化されたテンプレートがDから使えるようになったんじゃなかったっけ? C++ヘッダを直接import出来るようにするDコンパイラも開発されてるけど結構実用的ぽい https://github.com/Syniurge/Calypso/blob/master/tests/calypso/libstdc++/vector/vector.d >C++ヘッダを直接import出来るようにするDコンパイラも開発されてるけど結構実用的ぽい あ、それいいね。てかそれしないと普及しないでしょ。互換性は大事。 COMとかもそもまま使えるようになるんかね。 ☆ 日本の核武装は絶対に必須ですわ。☆ http://www.soumu.go.jp/senkyo/kokumin_touhyou/index.html ☆ 日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、改憲の参議院議員が 3分の2以上を超えると日本国憲法の改正です。皆様方、必ず投票に自ら足を運んでください。 私たちの日本国憲法を絶対に改正しましょう。☆ dsource.org もいよいよ廃止に向かう模様 使ってる人ほとんどいないだろうけど ちなみに移住先は?最近D使ってないんでよくわからんけど この言語 親クラスのprivate変数に継承先のクラスがアクセスできるじゃん 継承先のクラスが同一ファイル内にないか? 同一ファイル内のメンバは常にpublicだぜ まじかよ酷いな ファイル=モジュールだからファイル分けるの面倒くさい 同一ファイル内にあるものは自動的にfriendだと思えばC++より便利だな D2はまだ使用が固まってないからとうぶんの間は開発にはD1を使うことになるな 1のことは忘れるんだ……。 2も最近は破壊的変更が少ないし、 どうしても仕様が固まってるものを求めてるなら別の言語のほうがいいよ。 少なくともD1を使っていいことは一つもないと思う。 D1かC++かならまじでC++使えばいいと思うよ 雰囲気っていうか、まあ確かにC++使うならここで宣言する必要はないと思うけど 意外なことにrustの方が言語とAPI仕様の安定化に積極的っぽい 明確なゴールもなくフワフワと手を広げるから収束しないんだよ effectivec++読んだ時点でc++を見限らない奴はセンス無い >>186 それここ1ヶ月くらいのことじゃね? まあでもそういう姿勢を公式に明確にするのはいいことだ PCがオワコンになって一般人はスマホやアップルウォッチしかコンピューターを持たない時代が来るのに Dを始めとするPCアプリ専用言語に未来はあるのか >>190 そもそも、一般人はプログラミングしていない。 >>192 Goで泥アプリ開発できるようになったし、PCから移行するにつれいろんな言語が泥とかアフォン とかでも使えるようになる。 という妄想 Tcpを用いたサーバーアプリケーションを作成しています。 一つのSocketを処理するスレッドをspawnで起動しようとしたのですが、 "Aliases to mutable thread-local data not allowed." というエラーが出てしまいます。 Socketをスレッドのコンテキストとして渡す方法はありますか? enumのメンバの中からランダムに1つ取り出すにはどう書いたらいいですか? import std.stdio, std.traits, std.random; enum E { Hard, Normal, Easy, } auto lv = [ EnumMembers!E ]; lv[ uniform(0, 3) ].writeln(); >>197 ありがとうございます。 std.traitsにenumのメンバの配列を作る機能があったんですね。 あ、配列なんだからuniform(0, $)でよかった…。 タプルの配列化?みたいな 他にも関数の引数リストとか、構造体のメンバ変数を タプルでとれたり、std.traitsは結構楽しい メンバにUDAを付加するだけで 文字列化やシリアライズのメソッドが自動or暗黙生成されるような いい感じの小技はないかしら 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" } これいいなあ それにしてもstatic foreachが欲しい… >>190 そんなのは日本だけだぞ 海外ではPCとモバイルを使い分けるのが普通 DmInst ver.0.0を公開しました。 コンパイラーのDMCとDMDを簡単にインストールできるプログラムです。 http://katahiromz.web.fc2.com/dminst/ AliasSeq を Alias Equal と読み間違ってしまうマン >>212 がgithub版でもおきるかなー?と思ったんだけど、github版dmdをコンパイル中にエラーが出た。 内容は、「ソースに\r\nが含まれますよ」というもの。 出してるのは、dmd -run src/checkwhitespace.d の部分。 このツールは 1. \r\n がソースに含まれている場合。 2. インデントに\tを使っている場合。 3. 行末に不要な空白文字がある場合。 にエラーを出すようなんだけど、3はともかく、これで行くことに決まったのかな。 smart-tab派なんだけどなー。 あ、github版でも212は再現しました。 おまいらこれはなんでなんだぜ http://dpaste.dzfl.pl/7fa1a12a8c4a 1. enum をクラスインスタンスで初期化できない→わかる。構造体でラップすると通る→? 2. 1. において、ラップされたクラスが mutable。 This Week in D (英語) http://arsdnet.net/this-week-in-d/ 年初から続いてて筆者はDの入門書出版したりしてる 2.068.2 出てた ちなみに Win32-COFF が隠しオプション(-m32mscoff)で出来るようになってるので OMF/optlink がイケてないと思っていた諸兄は試してみるがよいよいよい int arr[x][y][z]; これと同じメモリレイアウトでヒープに確保するにはどうすればいいですか? new int[x*y*z]でよかった。 問題なのはint[]のメモリへのアクセスをint[x][y][z]と同じようにする方法だった。 自己解決。 [0][0][0],[0][0][1]...[0][1][0],[0][1][1]...の順番で並んでるだけだった。 くっそ! ↓Manifest ConstantsのenumとAAのからみがおかしい。 http://dpaste.dzfl.pl/36ab529d6fc5c ↓CTFEで変数を修飾する方のscope class使うと abnormal termination http://dpaste.dzfl.pl/8ad7e24e5d05 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)" なのがおかしい気がするんだが。 書き込んでから思い出したけど、Rebindableとかできて結構経つしあきらめるしかない気がしてきた。 >>218 optlink死んでまうん? const classとかscope classとかは今もまともに使おうと思えないね 普通のclass内でメンバをconstにするとかじゃないとまともに動く気しない nullではなく、空の連想配列で初期化するにはどうすればよいですか? 空の配列 == null なので無理 ただし空文字列 "" は例外 落とし穴になりがちなので注意 ちょっと良くわかりませんが、D言語は空の配列すら作れないんですか? 不便ですね >>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行で書きたいな。 という話でした。 結局どういうことなんですか? Dでは空の配列を作れないんですか? 必ず何か入っていなければダメなんですか? int[] a; って書けば空の配列になるんじゃないんですか? >>232 int[] a; で空の配列になりますよ。 226のは「連想配列」が俺にはややこしいっていう話です。 >>231 string[string] buf = (a => (a.remove(""), a))(["" : ""]); ところで、コンマ演算子を廃止しようとか言ってたのは自然消滅したのか? >>234 ありがとうございます。ところでもっと基本的な疑問がわいたのですが、 >>231 の後半での、bufとbuf2の中身がずっと同じであるっていうのは、仕様で保証されてるんでしょうか? Windows版dmd2.068.2では、1000個値を追加しても同じでした。 >>231 バグっぽい removeしつくしたら null になってるはずなんだけど それに連想配列の内部実装は最近まで大きく書き換えられてて 動作の微妙な違いとかあるのでトリッキーなことは避けるべき >>236-237 そうなんですね。書き換えます。ありがとうございます。 リンクエラー。2.067.1では通ってた。 http://dpaste.dzfl.pl/255495e7489a 1. -m64 で 2. CTFEで実行されるラムダ内で定義されている 3. 配列をメンバに持つ構造体の 4. 配列のconcatを行う ↓CTFEでtoHash/opEqualsが効いてない。 http://dpaste.dzfl.pl/ec40b544f45d CTFEはまだまだなかなかナヤマシイな! >>237 がらみかしらん。 D言語って、Javaみたいにソースファイル名とクラス名を同じにしてしまうと、 他のソースでクラス名のつもりで記述したものがパッケージ名扱いになってしまうため Hoge.Hoge のように同じ名前を2回書かないとクラス名と解釈してくれないと思うのですが、 これを1回だけの記述で済ましたい場合、皆さんはどのように解決されているんでしょうか? ソースファイル名を変えるのもmodule文で別名にするのも、何か違うように感じてしまいます。 モジュール名とファイル名は小文字 クラス名は大文字始まり それでもカブるようなケースはパッケージを作るからまず困らない >>241 D言語の命名規則に則れば >>242 の言うとおり。 ただ、どうしてもと言うならこんなんはいかがか。 http://dpaste.dzfl.pl/dce8977dacc7 えーと。やっぱ242で。 >>242 なるほと確かにD言語の命名規則からするとモジュール名は小文字でしたね。 でも、どうしても大きなクラスは同名の一ソースにしたいのです‥すみません。 ところでパッケージで気付かせてもらったのですが、この問題って、 クラスのソースらをルート階層に置いているからこそ起きる問題なのですね。 というわけでディレクトリを一つ掘ってパッケージ下に配置することで一応解決しました! ただ、パッケージ下にあるソースって module パッケージ名.モジュール名 の記述は必ず必要なのでしょうか? module文の記述が無いとルートパッケージ下として格納されてしまうようで、 module文を普段省略していた身からするとちょっと面倒に感じています。 この辺りの挙動はjavaのpackage文の踏襲かなと思うのですが、 D言語ではパッケージはディレクトリに対応すると書かれているようなので、 module文を省略しても適切なパッケージに配置してくれて良いような? >>243 おぉ‥改名選択importというやつでしょうか。確かにこれで通りました。 import _Hoge = Hoge : Hoge; という風に変換されるんですね。 import文までコンパイル時生成できるとは、D言語きm‥素晴らしいです。 ただこの書き方ではモジュール名変更リファクタリングの際にIDEが解析しにくい気がするので (そもそもそこまでお世話してくれるIDEは現存しないようですけれど‥)、 取り敢えずは先のパッケージへの配置法でがんばってみます。 凄いものをありがとうございました。今後の困難の際に参考にします。 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に無名関数を渡したらエラーが出ました。無名関数も使えないのでしょうか? 静的配列に対して popFront() が呼べない(初めて知った!) だからレンジ系操作に対しては全滅に近い ソートの方はそれだけじゃ分からんね 無名関数は使い方間違えた時にわかりづらい 静的配列は要素数が変更できないからですか。 Rangeの要件を満たしてないとなると結構不便ですね。 sortはエラーメッセージがこの1行しか出ないんですよね。 シンプルな例でテストしたらコンパイルは通ったんですけど、他のコードが影響してるのかなぁ。 固定長配列の全体のスライスを取って動的配列に見せかければ ある程度のRange操作だったら固定長配列にもかけられるのでちょっと便利です delegateのcovariane/contravarianceはなくなったんですかね 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 真のD言語erはそんなに書いて(書かせて)もらえることに感謝する デバッグ用に関数名を出力したいんですけど、関数名を取得する方法はあるでしょうか? __FILE__や__LINE__みたいな感じのが欲しいです。 標準入出力をフラッシュするにはどうすればいいですか? 基本的には、DではCの標準ライブラリと同等の関数をほぼそのまま薄いラッパで提供しています dout.flush()ということですか。 writeln()に対応するものはないんでしょうか? >>254 __FUNCTION__ も使える 日本語訳サイトは古すぎるから 英語サイトも必ず併用すべき ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる