こんにちは、高木です。
前回まではTcl_Obj型のラッパークラスについて考えてきました。まだやり残したことも多いのですが、いきなり細部を作り込むよりざっくり考えて、あとから細部を作り込んでいくようにしましょう。
今回からTcl言語処理系の根幹をなすインタープリターを扱うことにします。インタープリターにはTcl_Interp型を使います。今回はこのTcl_Interp型のラッパークラスを作っていきます。
本来であれば、Tcl_Interp型のオブジェクトを構築したり解体したりするところから入るのでしょうが、今回はそうしません。
ライブラリーからTcl_Interp型のポインターを受け取ってそれを使うことが一番多いので、まずはそこから始めることにします。
つまり、Tcl_Interp型のポインターからの変換コンストラクターと内部で保持しているTcl_Interp型のポインターを返すgetメンバー関数が基本となります。
それではコードを見ていきましょう。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | namespace tcl {   class interpreter   {   public:     interpreter(Tcl_Interp* interp = nullptr) : interp_(interp)     {     }     void preserve()     {       Tcl_Preserve(this->interp_);     }     void release()     {       Tcl_Release(this->interp_);     }     Tcl_Interp* get() const     {       return this->interp_;     }   private:     Tcl_Interp* interp_;   }; } | 
先ほども書いたように、変換コンストラクターとgetメンバー関数を用意しました。変換コンストラクターには省略時実引数としてnullptrを渡していますので、引数無しでも使えるようにしています。
今回、preserveとreleaseメンバー関数も用意しておきました。これはちょっと扱いが難しいのですが、インタープリターの生存期間を管理するための仕組みです。
インタープリターを構築したときには必ずpreserveを呼び出し、解体するときには必ずreleaseを呼び出す必要があります。また、データ構造からインタープリターを取り出したときもpreserveを呼び出し、使い終わったときにreleaseを呼び出す必要があります。
preserveとreleaseについては、とりあえずそんな感じで理解しておいてください。コンストラクターでpreserveしてデストラクターでreleaseするようなクラスを作ってもいいのですが、とりあえず後回しにしようと思います。
次回は、インタープリターの構築と解体を行うためのメンバー関数を追加していきたいと思います。Tcl特有の概念を説明する必要がありますので、それだけで1回使うことになると思います。






