次のコマンドを理解するのに少し問題があります。
package ifneeded HelloWorld 1.0 [list source [file join $dir helloworld.tcl]]
pkgIndex.tcl では、pkgIndex.tcl が供給されている場合、たとえば require HelloWorld 1.0 をパッケージ化すると、helloworld.tcl が供給されることを理解しています。リストコマンドがわかりません...
次のコマンドを理解するのに少し問題があります。
package ifneeded HelloWorld 1.0 [list source [file join $dir helloworld.tcl]]
pkgIndex.tcl では、pkgIndex.tcl が供給されている場合、たとえば require HelloWorld 1.0 をパッケージ化すると、helloworld.tcl が供給されることを理解しています。リストコマンドがわかりません...
このpackage ifneeded
コマンドは、パッケージを実際に Tcl インタープリターに存在させる方法を登録 (または照会) するために使用されます。これはlist
、例で生成された引数であるスクリプトを評価することによって行われます。分解してみましょう。
パッケージ ifneeded HelloWorld 1.0 [リスト ソース [ファイル ジョイン $dir helloworld.tcl]] ---------------- ========== --- ===================== ======================== コマンド名 パッケージ ver 存在させる方法、 [リスト ...] の名前の結果
ここまでは順調ですね。さて、少し余談ですが、このlist
コマンドはリストを作成するためだけに使用されるのではなく、置換が保証されていないコマンドも作成します。つまり、その結果は、コマンドに入ったときとまったく同じように、コマンドの呼び出しとその引数で構成されるスクリプトですlist
。
これは、 であるスクリプトを作成していることを意味します。source somefilename
ここで、somefilename
は の結果ですfile join
。つまり、以下とほぼ同じ結果が得られます。
package ifneeded HelloWorld 1.0 "source $dir/helloworld.tcl"
ただし/
、ファイル名の区切り記号が (正式には Tcl ではなく OS の機能であり、file join
その違いを認識している)という仮定はなく、たまたまスペースやその他のメタ文字が含まれていても安全です$dir
(あなたよりも一般的です)。望み)。
とは$dir
? pkgIndex.tcl
スクリプトが (通常は)スクリプトdir
を含むディレクトリの絶対名に変数を設定するコンテキストで評価されるのは、スクリプトの特別な機能ですpkgIndex.tcl
。(この時点で、現在のディレクトリについて仮定してはいけません。これは、パッケージの作成者ではなく、メインの Tcl プログラムのユーザーに属します。)これにより、パッケージのすべてのコンポーネントを配置できるため、パッケージの再配置が非常に簡単になります。ファイルを 1 つのスクリプトに関連付けて、全体を 1 つのチャンクに移動するだけです。
パッケージのifneededコマンドには、次の入力が必要です。
package ifneeded package version ?script?
あなたの場合、パッケージは HelloWorld で、バージョンは 1.0 であることがわかります。最後に、スクリプトは [list source [file join $dir helloworld.tcl]] です。リストが使用される理由は、スクリプト パラメーターがリストを想定しているためです。
このpackage ifneeded
コマンドは、最後の引数としてスクリプトを想定しています。スクリプトは (一般的な意味で) 整形式である、つまり Tcl パーサーによって解析可能であることが期待されます。
このかなり標準的な の場合、pkgIndex.tcl
確実にすることは、コードが処理される時点で「dir」変数に何が含まれていてもpkgIndex.tcl
、後で Tcl パーサーがこれは、引数が 1 つだけsource
のコマンドです。空白やファンキーな文字などを含むように展開されているかどうかは関係ありません。$dir
{
コマンドを入力しlist
ます。source
ここでは、文字列 "source" とファイル名を含む文字列 (そのコマンドの唯一の引数として機能する) の 2 つの要素のリストを作成するために使用されます。ここで、そのリストがスクリプト (文字列) として解釈されると、Tcl は文字列表現に空白などに関するあいまいさを取り除くために必要なすべての引用符が含まれていることを確認します。これにより、パーサーが後で構築されたスクリプトを解釈するときに、その中のsource
コマンドがちょうど 1 つの引数。
list
引用の問題を防ぐために使用する方法については、こちらでより詳しく書かれた情報を読むことができます。