...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

std.traits.isCovariantWith

import std.traits;

interface I { I clone(); }
class C : I
{
    override C clone()   // I.clone() の共変オーバーライド
    {
        return new C;
    }
}

void main()
{
	{
		static assert(isCovariantWith!(typeof(C.clone), typeof(I.clone)));
	}{
		C function() derived;
		I function() base;
//		static assert(is(typeof(derived) == function));
//		static assert(is(typeof(base) == function));
		
		base = derived;
		static assert(isCovariantWith!(typeof(derived), typeof(base)));
	}{
		C delegate() derived;
		I delegate() base;
//		static assert(is(typeof(derived) == function));
//		static assert(is(typeof(base) == function));

		base = derived;
		static assert(isCovariantWith!(typeof(derived), typeof(base)));
	}
}

dmd 2.056から関数とデリゲートのcovarianceが考慮されるようになったので,たまたま見つけたisCovariantWithでも判定できるかと思ってやってみたら動かなかった.
isCovariantWith(F,G)のconstraintを消したら動いたけど,あれって必要なのかな?
そもそも,static assert(is(main == function);がfalseなんだけどis(... == function)ってどういうものだったっけ・・・.

typeof(main) == functionだった.

template isCovariantWith(F, G)
    if (is(F == function) && is(G == function) ||
        is(F == delegate) && is(G == delegate) || isFunctionPointer!F && isFunctionPointer!G)

こうかな.

import std.traits;

interface I { I clone(); }
class C : I
{
    override C clone()   // I.clone() の共変オーバーライド
    {
        return new C;
    }
}

void main()
{
	{
		static assert(isCovariantWith!(typeof(C.clone), typeof(I.clone)));
	}{
		C function() derived;
		I function() base;
		base = derived;
		static assert(isCovariantWith!(typeof(*derived), typeof(*base)));
		static assert(isCovariantWith!(typeof(derived), typeof(base)));
		//static assert(isCovariantWith!(typeof(derived), typeof(*base)));
		//static assert(isCovariantWith!(typeof(*derived), typeof(base)));
	}{
		C delegate() derived;
		I delegate() base;
		base = derived;
		static assert(isCovariantWith!(typeof(derived), typeof(base)));
	}{
		C function() derived;
		I delegate() base;
		//base = derived;
		//static assert(isCovariantWith!(typeof(derived), typeof(base)));
		//static assert(isCovariantWith!(typeof(*derived), typeof(base)));
	}
}

std.concurrency メモ

import std.stdio;
import std.concurrency;

void f()
{
	writeln("start");
	for (bool f; !f; receive(
		(int i)    { f = true; },
		(string s) { writeln(s); },
	)) {}
	writeln("end");
}

void main()
{
	auto tid = spawn(&f);
	send(tid, "a");
	write(readln());
	send(tid, "b");
	send(tid, 0);
}

デリゲートと関数ポインタで共変の戻り値(covariance)

import std.stdio;

class Base  {}
class Derived : Base {}

void main()
{
    // Covariance
    {
        Base delegate() f = delegate Derived() { return new Derived; };
        writefln("delegate convariance is <%s>", f().toString() == "a.Derived" ? "OK" : "NG");
    }{
        static Derived fp() { return new Derived; }
        Base function() f = &fp;
        writefln("function pointer covariance is <%s>", f().toString() == "a.Derived" ? "OK" : "NG");
    }
    
    // Contravariance
    {
        auto c = new class { void foo(Base){} };
        
        // GOOD
        void delegate(Base) f = &c.foo;
        f(new Base);
        f(new Derived);
        
        // BAD
        //void delegate(Derived) g = &c.foo;
        //g(new Derived);
    }
}
delegate convariance is <OK>
function pointer covariance is <OK>


反変の方はまだダメみたい.

a.d(33): Error: cannot implicitly convert expression (&c.foo) of type void delegate(Base) to void delegate(Derived)

鉄道業界のインテグレータが必要とされている

中国で事故が起こりましたけれども、こういう電車を使って時速500kmで走るというのは、実は技術的には極めて簡単なんですけれども、それを日本はあえてやらない。今まで数十年間、一度も事故を起こしていない日本の新幹線というのは、ハードウェアだけじゃなくて、そのオペレーションシステム、全てが合わさって初めて実は世界で非常にまれな価値を持つ新幹線というものになります。英語にもなっている「Shinkansen」という全体のシステムに価値があるんです。ところがおかしいのは、後でお見せするアメリカの高速鉄道とか、ブラジルとか中国に売りに行く時に、日本人が一番その価値を分かってなくて、ハードウェアを売り込みに行こうとする。そうすると「うちの機械は時速320km出ますよ」と言っても「悪いけど中国の人は時速400km出てるって言ってるよ」とか。ハードとハードのプレゼンテーションをしてしまうわけです。ところがこれはカリフォルニアの政府の関係者から後で聞いたんですけれども、日本人が電車の売り込みに来てプレゼンテーションしていると、ちょうど……ちょっと危ない発言ですけど、北朝鮮がミサイル売りに来たみたいなもんだと。ハードの話をして性能の話ばかりするけれど、「僕らが求めているのはそんなところじゃない。僕らが求めているのは、これまで日本人が築き上げてきたシステムである。何で一緒に売り込みに来ないの」と。「いや、それはあちらはJRという製造メーカーですから」と言うと「そんなの関係ないだろ」と。「お客さんにとってハードウェアメーカーも、ソフトウェアメーカーも、それが合わさってひとつのシステムなんだから、それをバラバラに分けるのは業界側が勝手でしょ」と。「俺たちにバラバラにプレゼンテーションに来られたって、俺、何言ったらいいんだ。それがあなたたちのエゴだ」と罵倒されました。全くその通りだと思いました。システム全体で初めて意味合いを持つ、それが今ありとあらゆるさっきお見せしたようなものの全てに通じる価値なんだなと思った象徴が、このひとつの新幹線です。

いつ来るか分からない15分のために常に準備をしているのがプロ、デザイナー奥山清行による「ムーンショット」デザイン幸福論 - GIGAZINE

この間,国交省の人も鉄道業界のインテグレータが必要だと言ってたな.

学習の最初のフェーズにおいて

この時期に典型的なことは「水ぶくれのフジツボみたいだ。一貫したコーディング規則がなきゃだめだ」みたいなことを言って、次の日をチームのためのコーディング規則を書くために使い、そのあと6日間で「唯一正しい括弧付けのスタイル」について議論し、そのあとの3週間を古いコードが「唯一正しい括弧付けのスタイル」に合うよう書き直すのに費やすが、それに気付いたマネージャから全然お金にならないことに時間を使っていることで怒鳴りつけられ、それでソースに手を入れる必要が出た時ついでにフォーマットを直すのでも別に悪くないと思い直し、半分だけ「正しい括弧付けスタイル」という状態になってしまうが、そんなことはすぐに忘れ、そしてすぐまた別な何か、1つの文字列クラスを別な文字列クラスで置き換えるというような、お金になることとは無関係なことに心を奪われるのだ。

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project