kubo39's blog

ただの雑記です。

Prologを使ってD言語のtraitsを表現してみる

D言語traitsのうちいくつか簡単に実装できそうなものを表現してみた。 といっても非常に不完全な状態であるが。

SWI-Prologを使ったが、他の実装でもおそらく問題ない。

$ swipl --version
SWI-Prolog version 7.6.4 for amd64

ソースコードは以下のような感じになっている。isScalarとかも実装したかったのだけれど、なかなか綺麗な感じにならなかった。

%  If the arguments are all either types that are arithmetic types.
traits(isArithmetic, Type1, Type2) :-
    traits(isArithmetic, Type1), traits(isArithmetic, Type2).

traits(isArithmetic, Type) :-
    traits(isIntegral, Type);
    traits(isFloating, Type).

%  Works like isArithmetic, except it's for integral types.
traits(isIntegral, byte).
traits(isIntegral, short).
traits(isIntegral, int).
traits(isIntegral, long).
traits(isIntegral, cent).
traits(isIntegral, ptrdiff_t).
traits(isIntegral, Type) :- traits(isUnsigned, Type).

%  Works like isArithmetic, except it's for floating types.
traits(isFloating, float).
traits(isFloating, cfloat).
traits(isFloating, ifloat).
traits(isFloating, double).
traits(isFloating, cduble).
traits(isFloating, idouble).
traits(isFloating, real).
traits(isFloating, creal).
traits(isFloating, ireal).

%  Works like isArithmetic, except it's for unsigned types.
traits(isUnsigned, bool).
traits(isUnsigned, char).
traits(isUnsigned, wchar).
traits(isUnsigned, dchar).
traits(isUnsigned, ubyte).
traits(isUnsigned, ushort).
traits(isUnsigned, uint).
traits(isUnsigned, ulong).
traits(isUnsigned, ucent).
traits(isUnsigned, size_t).

%  If the type's default initializer is all zero.
traits(isZeroInit, void).
traits(isZeroInit, byte).
traits(isZeroInit, short).
traits(isZeroInit, int).
traits(isZeroInit, long).
traits(isZeroInit, cent).
traits(isZeroInit, ptrdiff_t).
traits(isZeroInit, bool).
traits(isZeroInit, ubyte).
traits(isZeroInit, ushort).
traits(isZeroInit, uint).
traits(isZeroInit, ulong).
traits(isZeroInit, ucent).
traits(isZeroInit, size_t).

REPLで問い合わせてみる。

$ swipl traits.pl 
(...)
?- traits(isArithmetic, int).
true .

?- traits(isArithmetic, int, float).
true .

?- traits(isUnsigned, short).
false.

今の段階ではとくにできることがおもいつかないが、もうちょっと別のtraitsの表現も試してなんかおもしろいことができないか試していきたい。