こんにちは、高木です。

今回もTcl_Obj型について見ていきます。前回はTcl_Obj型のオブジェクトに文字列を格納する話題でしたが、今回は数値を格納していきます。

Tclが扱える数値には次のものがあります。

  • int型
  • long型
  • WideInt型
  • Boolean型
  • Bignum型
  • double型

それぞれの型についてTcl_Obj型のオブジェクトを生成や値を取得するAPIが用意されています。詳しくは公式ドキュメントを参照してください。

ただ、先ほど挙げたすべての型に対応する必要はないと考えています。たとえば、long型は環境によって32ビットの場合と64ビットの場合があり、int型かWideint型のどちらかと同じサイズになります。よって、32ビット整数であるint型と64ビット整数であるWideInt型に対応すれば十分でしょう。

Bignum型というのは、LibTomMathという多倍長整数ライブラリーを使用しているのですが、外部ライブラリーのLibTomMathを要求するのではなく、Tclの中にLibTomMathを取り込んでしまっています。結果として、本来のLibTomMathを使いたい場合にいろいろ面倒が起きますので、文字列として扱うようにした方がよさそうです。

今回は、検討の結果残ったint型、WideInt型、Boolean型、double型についてのみ対応することにします。では、その部分のコードを抜粋してみましょう。

ほとんど同じことの繰り返しになっています。こういうコードは、本来であればPHPで前処理して自動生成したいところですね。

int型とWideInt型には、C++のコードではstd::int_least32_t型とstd::int_least64_t型を使うようにしました。その方が意図が明確になりますので。また、get_*メンバー関数内ではroot_interpというTcl_Interp*型のグローバル変数を参照しています。Tcl_Obj型から数値を取り出すためにはどうしても必要になるからです。いまいちなのですが、インタープリターについてはまだラッパークラスを用意していませんので、今のところはとりあえずこれで進めます。

これで一通りTcl_Obj型と数値の相互変換ができるようになりました。まだ少しだけTcl_Obj型のラッパークラスであるobjクラスについては触れておかないといけないことがありますので、次回はその話題を取り上げることにします。