Tcl スクリプトでは、複数のユーザー スクリプトを定義できます。ユーザー プロシージャは、ユーザーにより実行される Tcl プロシージャ (コマンド) です。前述のように、すべてのユーザー プロシージャはアプリの名前空間からエクスポートする必要があります。
ユーザー プロシージャに加え、Tcl スクリプトではヘルパー プロシージャも定義できます。ヘルパー プロシージャはユーザー プロシージャでのみ使用され、ユーザーには使用できないようにする必要があるので、名前空間からエクスポートしません。どのプロシージャをユーザーがコマンド ライン インターフェイス (スクリプトまたは Tcl コンソール) から実行できるようにするかをシステムで指定するには、プロシージャを名前空間からエクスポートするのが唯一の方法です。
ユーザー プロシージャがヘルパー プロシージャを使用する場合、アプリの下にサブ名前空間を作成し、ユーザー プロシージャとヘルパー プロシージャをその下に移動することをお勧めします。これにより、アプリ内のヘルパー プロシージャ間で名前の競合が発生するのを防ぐことができます。これは、さらにスクリプトを独自のヘルパー プロシージャと共に追加する場合に特に重要です。
次のコードは、Tcl コードに推奨される構造を示します。ユーザー プロシージャはアプリの名前空間のすぐ下にありますが、これはサブ名前空間 ::tclapp::mycompany::template::my_command1
の下に移動された元のプロシージャを呼び出すために使用されるラッパーです。
namespace eval ::tclapp::mycompany::template {
namespace export my_command1
}
proc ::tclapp::mycompany::template::my_command1 { args } {
# Calling the original code moved under the sub-namespace
uplevel [concat ::tclapp::mycompany::template::my_command1::my_command1 $args]
}
eval [list namespace eval ::tclapp::mycompany::template::my_command1 {
} ]
proc ::tclapp::mycompany::template::::my_command1::my_command1 { args } {
# Here is the code of the original proc
}
proc ::tclapp::mycompany::template::my_command1::helper1 { args } {
# Here is the code of the helper proc
}
注記: サブ名前空間
::tclapp::mycompany::template::my_command1
は、その中にプロシージャを定義する前に作成する必要があります。サブ名前空間を作成する構文は、リンターからのエラー メッセージを回避するため、「eval [list namespace eval ::tclapp::mycompany::template::my_command1 {}]
」とする必要があります。注記: コードを解読しやすくするため、上記のコードにはこのセクションの後の方で説明する必須のメタコメントは含まれていません。