前の月 / 次の月 / 最新

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2009-10-30 Fri

opEquals はどう書く? [D言語]

オーバーライドするときの引数型はそのクラスではなく、Object にします。

== と != のオーバーロード

BSTR ラッパを書いていて、 opEquals の書き方に迷った。

bool opEquals(Object o){
    return this.toString == (cast(ComString)o).toString;//文字列で比較
}

o が null の場合に対応

bool opEquals(Object o){
    if(o is null){
        return false;
    }
    return this.toString == (cast(ComString)o).toString;//文字列で比較
}

o が ComString でない場合はどう書く?

alias Object.opEquals opEquals; //ComString 以外との比較の場合
bool opEquals(ComString o){
    if(o is null){
        return false;
    }
    return this.toString == o.toString;//文字列で比較
}

こうか?

2009-10-27 Tue

文字列のサイズの拡大に注意する [D言語]

D言語の配列は要素の型の初期値で初期化される。

int[10] a;//各要素はint.initで初期化されている。
writeln(a)//0 0 0 0 0 0 0 0 0 0

動的配列の場合も同様に、
拡大した領域を初期化する。

int[] a = [1,2];
a.length = 10;//[2 .. 10]はint.initで初期化されている。
writeln(a)//1 2 0 0 0 0 0 0 0 0

char wchar dchar の初期値は、
UTF-8 UTF-16 UTF-32 として不正な文字。

import std.utf;

char[] s;
s.length = 10;
s.validate; //Invalid UTF sequence: 255

そのため、文字列の長さを大きくした場合、
この文字列は不正な文字含むことのなる。

2009-10-26 Mon

インターフェース [D言語]

phobosでのCoCreateInstanceの定義

HRESULT CoCreateInstance(const(CLSID) *rclsid, IUnknown UnkOuter,
                    DWORD dwClsContext, const(IID)* riid, void* ppv);

win32.objbase.dでのCoCreateInstanceの定義

HRESULT CoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, PVOID*);

最後の引数の型が違う

phobosでは

IUnknown iu;
CoCreateInstance(... ,&iu);

win32.objbase.dでは

IUnknown iu;
CoCreateInstance(... ,cast(void**)&iu); //キャストして大丈夫?

ABI - プログラミング言語 D 2.0

インターフェイス
インターフェイスは vtbl[] へのポインタです。
vtbl[0] は、object.Interface
クラスの対応するインスタンスへのポインタです。
残りのエントリ vtbl[1..$] は、
そのインターフェイスで実装される仮想関数へのポインタが、
宣言された順番に入ります。
COM インターフェイスは、通常のインターフェイスと異なり、
vtbl[0] に object.Interface は入りません。
vtbl[0..$] のエントリ全てが仮想関数ポインタで、
宣言された順番に格納されます。
これは Windows の COM オブジェクトのレイアウトに合わせています。
C++ インターフェイスは通常のインターフェイスと異なり、
ターゲット環境での C++
の単一継承のクラスレイアウトと同じ形式に合わせた実装になります。

インターフェイスは vtbl[] へのポインタだからvoid** にキャストしても大丈夫なのか。

2009-10-15 Thu

メモを残していて良かった。

google-code-prettify が動かないなぁと思ったら、
以前も同じことをやっていた。
[2008-09-03-1]
メモが役に立った。

2009-10-13 Tue

無駄がある正規表現

無駄がある正規表現を簡単にするツールって在るかな。

こんな感じの正規表現を、

/e[0-9_]+|e\+[0-9_]+|e\-[0-9_]+/ //[0-9_]+ が3回も出現している

こういう風にしたい。

/e[+-]?[0-9_]+/ //[0-9_]+ が1回に減った

因数分解っぽい

google-code-prettifyでD言語をハイライト: [javascript]

google-code-prettifyD言語をハイライトするハンドラー
をかいた。

使い方

<script src="lang-d.js" type="text/javascript"></script>
...
<pre class="prettyprint lang-d">
...

ネストできる字句は未対応
ネストできるブロックコメントとトークン文字列

2009-10-10 Sat

createSimpleLexer を使ってみる [javascript]

google-code-prettify の createSimpleLexer を使うと、
任意の正規表現でハンドラーを生成できる。

たとえば、以下のように書くと、D言語のコメントに対応する。
(ネストできるコメントは手抜き)

PR.registerLangHandler(
    PR.createSimpleLexer(
        /** 特定の文字で判別できる場合ここに書く
          * [style:string, patern:regexp, null, shortcut:string]
          * 例:#で始まるコメント行
          * [PR_COMMENT, /^#[^\r\n]*/, null, '#']
          * shortcut は必須
          */
        [
        ],
        /** 上でマッチしなかった場合に使われる。
          * [style:string, patern:regexp, null, shortcut:string]
          * 例://で始まるコメント行
          * [PR.PR_COMMENT,/^\/\/[^\r\n]*/, null]
          * shortcut は無くても良い
          * 配列の順にテストするので順番に注意する
          */
        [
            [PR.PR_COMMENT,/^\/\/[^\r\n]*/, null],
            [PR.PR_COMMENT,/^\/\*[\s\S]*?(?:\*\/|$)/, null],
            [PR.PR_COMMENT,/^\/\+[\s\S]*?(?:\+\/|$)/, null]
        ]),
    ['d']);

2009-10-06 Tue

10文字ごとに色分けする [javascript]

google-code-prettify で10文字ごとに色分けするハンドラー

function createMyDecorator(){
    /**
      * 10文字ごとにトークンわけする。
      */
    function tokenizer(source){
        var tokens = [];
        for(i=0;i < source.length;i += 10){
            tokens.push(source.substr(i,10));
         }
        return tokens;
    }

    var decorate = function(job){
        var sourceCode = job.source, basePos = job.basePos;
        var decorations = [basePos, PR.PR_PLAIN];
        var tokens = tokenizer(sourceCode);
        var pos = 0;
        for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti){
            var token = tokens[ti];
            var tokenStart = pos;
            pos += token.length;
            style = ti % 2 ? PR.PR_STRING : PR.PR_PLAIN; //交互に色分け
            decorations.push(basePos + tokenStart, style);
        }
        job.decorations = decorations;
    };
    return decorate;
};

PR.registerLangHandler(createMyDecorator(), ['d']);

2009-10-05 Mon

PR.createSimpleLexerを読む [javascript]

google-code-prettifyのPR.createSimpleLexerは、
combinePrefixPatterns で生成した正規表現で、
ソースをトークンに分割している。

過去ログ

2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12