1

そのため、私はTCLプログラミングの方法に非常に慣れておらず、経験がありません。最初に出力ファイルを削除して、他の誰かが作成したプロシージャを呼び出すスクリプトを作成しました。次に、私が書いた追加のロジックを実行します。

ロジックを 2 番目の proc に移動すると、すぐにそのロジックの一部 (つまり rm コマンド) が壊れました。

私が知る限り、中央実行内の行の最初のプログラム (proc 定義に続くテキスト) は、「exec」コマンドなしで正常に実行されます。ただし、proc 内に移動する場合は、「exec」コマンドが必要になります。

TCLがこのように動作する理由を誰かに説明できますか?

例えば

proc helloworld {} {
  puts "hi"
}
#works
rm my_file 
helloworld

..

proc helloworld {} {
  #doesn't work
  rm my_file 
  puts "hi"
}
helloworld

..

proc helloworld {} {
  #works
  eval rm my_file 
  puts "hi"
}
helloworld

..

proc helloworld {} {
  #works
  file delete my_file 
  puts "hi"
}
helloworld

*この奇妙な動作は、スクリプトを vmd にフィードしているプログラムに固有のものである可能性があることに注意してください。これには、独自の TCL 動作が組み込まれています。おそらく、あなたの回答で、これが他の通訳者にとっても標準であるかどうかを示すことができますか?

4

2 に答える 2

5

インタラクティブなtclshセッションはexec、不明なコマンド ( などrm) を試行します。非対話的なスクリプトの実行や、お気づきのように、procs では、この動作を当てにすることはできません。

これがtclshのマニュアル ページに記載されているかどうかはわかりませんが、未知のマニュアル ページには記載されています。Tcl wikiのtclshページも参照してください。unknownインタラクティブな tclsh セッションでは、次のように入力して何が行われるかを確認できます。

info body unknown

[アップデート]

「Tcl および Tk での実用的なプログラミング」からの引用:

このunknownコマンドには、他にも便利な機能がいくつかあります。これらは、コマンドを直接入力する場合にのみ使用されます。実行がプロシージャに入ると、または Tcl シェルが対話的に使用されていない場合、それらは無効になります。便利な機能は、プログラムの自動実行、コマンド履歴、およびコマンド省略です。コマンドの実装をスクリプト ライブラリからロードできない場合は、これらのオプションが順番に試行されます。

于 2010-10-14T12:51:33.873 に答える
2

これは、変数tcl_interactiveを介してプログラムでもテストできることに注意してください。これは、Tcl が対話型シェルを介して実行されている場合は「1」、そうでない場合は「0」です。変数も設定可能であるため、対話型シェルを開始してから[set tcl_interactive 0]を実行して続行できます。この時点で、次のような機能が失われます。

  • %コマンドプロンプト
  • proc 名 / コマンド名の補完 (つまり、[pu "xyz"]と入力できず、対話型シェルのように[puts "xyz"]と入力した効果が得られません)
  • 外部コマンドにリクエストを完了させるための自動「シェルアウト」(この元の質問の「rm」など)
  • そしておそらく他の...

  • 于 2010-12-19T04:24:35.000 に答える