2012-03-25 6 views
1

Tcl 8.4.18で単純なオブジェクト指向のシステムを実装しようとしています。私はItcl、stooops、XOTtclなどを見てきました。特に私が別の簡単なやり方をすることができれば、それらを使いたいかどうかは決めていません。とにかく、私は名前空間Tclインポートされたルーチンからインポータの名前空間を決定する方法

namespace eval Object { 
    namespace export setvar 

    proc setvar { model name value } { 
     set ${model}::${name} $value 
    } 
} 

、その後、私は「2を出力し、私はこの

Model::setvar Model foo 2 
puts $Model::foo 

のように変数を設定することができ

namespace eval Model { 
    namespace import ::Object::* 
    variable foo 0 
} 

別の名前空間であれば、「サブクラス」を持っていると言うことができます"しかし、Object名前空間のルーチン "setvar"が "Model"名前空間から呼び出されていると判断できるように、コードを単純化したいと思います。このような何か:

proc setvar { name value } { 
    set myspace [namespace current] 
    set ${namespace}::${name} $value 
} 

、その後は

Model::setvar foo 2 

のようにそれを呼び出すが、それが原因で、[名前空間の現在]を返す「::オブジェクト」ではなく「::モデル」は動作しません。そのドキュメントによると、インポートによってObject名前空間への参照が戻されるだけなので、

ルーチンsetvarを使用する理由は、変数overrideが実装されていればModelからfooを使用できるようにすることです。それ以外の場合はObjectから取得します。

他にもこれを行う方法はありますか?それとも、私は他のツールの1つを使うべきですか?

おかげ

+0

ああ、いつもの事、最初にあなたがTclの中に独自のOOシステムを書きます; - )。 Tcl 8.4.18のバージョンはかなり古いですが、新しいものはいくつか簡単にするかもしれません(特に8.6ベータにはOOシステムが組み込まれています)。私はあなたがしようとしていることは可能であると確信していますが、おそらく速くないでしょう。最も簡単な方法は、 'namespace import'をオーバーライドして、本当のインポートの代わりにエイリアスを作成させることです。または、名前空間コマンドリゾルバの使用がベストかもしれませんが、8.4では使用できません。 – schlenk

+0

8.6のOOシステムは、8.5の拡張機能としても利用できます。 –

+0

オブジェクトシステムは正しく動作するのが難しいことに注意してください。たくさんのことができますが、大量の作業をする準備ができていない限り、壁に当たってしまいます。 –

答えて

2

あなたが探しているコードはトリッキーですが、行うことが可能(キーがnamespace whichです):

proc setvar { name value } { 
    set cmdnameScript [list namespace which [lindex [info level 0] 0]] 
    set myspace [namespace qualifiers [uplevel 1 $cmdnameScript]]] 
    set ${myspace}::${name} $value 
} 

あなたが(またはそれ以降)8.5を使用している場合は、考えますで、最後set交換:

namespace upvar $myspace $name var 
set var $value 

それは物事が複雑に取得するために開始した後で動作するように多くの方が簡単です。その失敗、(限りのTcl 8.0などのバックポータブルの速さ、で動作するようにほとんどのように簡単ではありません、)upvarを使用して行います。

upvar 0 ${myspace}::$name var 
set var $value 
+0

(FWIW、私はこれを8.4.7でテストしました - ネームスペースupvar部分を除いて - それであなたは本当にうまくいくと思います) –

+0

うわー、私の心が吹っ飛んだと思ってください。私はこれをちょっと理解するためにマニュアルを読む必要がありました。ありがとうございました。まもなくまもなく新しいTclにアップグレードしますが、今は8.4に固執しています。 – Matt

関連する問題