...ing logging 4.0

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

Composite pattern

入れ物と中身を同一視するパターン.

import std.stdio;
interface Element {
	uint countChilds();
	void append(Element c);
}
class Folder : Element {
	private Element[] elems;
	override uint countChilds() {
		uint sum;
		foreach (c; elems) {
			sum += 1 + c.countChilds();
		}
		return sum;
	}
	override void append(Element c) { elems ~= c; }
}
class File : Element {
	override uint countChilds() { return 0; }
	override void append(Element c) { throw new Exception("Append error."); }
}
void main() {
	Element w = new Folder; // 集合体
	Element x = new Folder; // 集合体
	Element y = new File;   // 要素
	Element z = new File;   // 要素
	w.append(x);
	x.append(y);
	x.append(z);
	writeNumChilds(w);
	writeNumChilds(x);
	writeNumChilds(y);
	writeNumChilds(z);
}
void writeNumChilds(Element c) { writeln(c, " ", c.countChilds()); }

a.Folder 3
a.Folder 2
a.File 0
a.File 0

scopeがなくなるらしいので

色々お話しましたがもう自分用にこれでいいやと思った.

import std.stdio;

struct AutoDeleted(T)
{
	private T t;
	
	public this(Args...)(Args args)
	{
		t = new T(args);
	}
	
	public ~this()
	{
		delete t;
		t = null;
	}
	
	private @disable this(this){}
	
	public alias t this;
}

class A
{
	int v;
	this(int i)
	{
		v = i;
	}
	~this()
	{
		writeln("dest");
	}
	int get() { return v; }
}

void f(A a)
{
	writeln(a.get());
}

void main()
{
	{
		auto a = AutoDeleted!A(1);
		f(a);
		writeln("inner scope");
	}
	writeln("outer scope");
	
	// copy is disabled.
	//auto b = a;
}
1
inner scope
dest
outer scope

class Aを引数なしのコンストラクタで作れませんね.

std.concurrency.receiveってそういうもんじゃねえし

というわけで,頑張った割りに意味なかったらしいorz
receiveに複数のdelegateを与えたら分岐するんだね.
via. http://www.curoles.com/j/dstdconcur.html

import std.stdio;
import std.concurrency;

struct A
{
	int v;
}

void test()
{
	for(bool fun = true; fun; )
	{
		receive(
			(int i) { writeln(i); },
			(char c){ writeln(c); },
			(A a){ writeln(a.v); },
			(bool b){ writeln("terminate"); fun = b; });
	}
}

void main()
{
	Tid tid = spawn(&test);
	send(tid, 100);
	send(tid, 'c');
	send(tid, A(99));
	send(tid, false);
	foreach (i; 0..1000) write("_"); // スレッドの動作確認のためしばらく実行しておく
}
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________100
_c
_99
_terminate
______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

とある学生の仮想端末《ジョークコード》

とある高校にて


誰かがコンピュータ室にある1台のPCに,あるBASICプログラムを置いておいた.


しばらく経ち,ひとりの学生がそのプログラムの存在に気づき,
何気なく実行してみた.


すると,こともあろうに,FDDのアクセス音と,FDDのすべてのファイルを削除したことを示すメッセージが表示された!


びっくりした学生はファイル一覧を出そうとFILESと入力しエンターを叩いた.


しかし無情にもその結果は何もファイルがないというものだった.


なん・・・だと・・・と思いつつも,何気なく癖になっているbreakキーを押すと,何かのプログラムが終了された.
ここで学生は気づいた.


こ,このプログラムを作った奴は,実行した奴が不安になってファイルの存在を確認することまで読んでやがったのか!


その学生は完全にはめられた悔しさのあまり


その仮想環境を実現するプログラムから脱出する唯一の方法である「breakキーの押下」を無効にし,


十数回のエンターキーの押下の後に表示されるヒントから導かれるキーワードを入力しなければ絶対に終了しないようにして


そのプログラムをそっと元のプログラムに上書き保存して,置いておいたとさ.


めでたし,めでたし.

続きを読む

dmd r627とdfl r97でdmdがクラッシュ

nextがnullになっていてアクセス違反で落ちてる.
何が原因だろう.
std.socket.dが怪しい?

type *TypeFunction::toCtype()
{   type *t;

    if (ctype)
        return ctype;

    if (1)
    {
        param_t *paramtypes;
        tym_t tyf;
        type *tp;

        paramtypes = NULL;
        size_t nparams = Parameter::dim(parameters);
        for (size_t i = 0; i < nparams; i++)
        {   Parameter *arg = Parameter::getNth(parameters, i);
            tp = arg->type->toCtype();
            if (arg->storageClass & (STCout | STCref))
            {   // C doesn't have reference types, so it's really a pointer
                // to the parameter type
                tp = type_allocn(TYref, tp);
            }
            param_append_type(&paramtypes,tp);
        }
        tyf = totym();
        t = type_alloc(tyf);
        t->Tflags |= TFprototype;
        if (varargs != 1)
            t->Tflags |= TFfixed;
        ctype = t;
        t->Tnext = next->toCtype(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< next == null
        t->Tnext->Tcount++;
        t->Tparamtypes = paramtypes;
    }
    ctype = t;
    return t;
}
+		next	0x00000000 {ty=??? mod=??? deco=??? ...}	Type *
+		this	0x05f92628 {parameters=??? varargs=??? isnothrow=??? ...}	TypeFunction *
>	dmd.exe!TypeFunction::toCtype()()  行 254 + 0x3 バイト	C++
 	dmd.exe!FuncDeclaration::toSymbol()()  行 359 + 0xe バイト	C++
 	dmd.exe!ClassDeclaration::toObjFile(int )()  行 793 + 0xb バイト	C++
 	dmd.exe!AttribDeclaration::toObjFile(int )()  行 242	C++
 	dmd.exe!Module::genobjfile(int )()  行 280	C++
 	dmd.exe!main()  行 1292	C++
 	dmd.exe!_mainCRTStartup()  + 0xa9 バイト	
 	kernel32.dll!7c817077() 	
 	[下のフレームは間違っているか、または見つかりません。kernel32.dll に対して読み込まれたシンボルはありません。]