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の表現も試してなんかおもしろいことができないか試していきたい。