18

私は TCL/TK を使用してきましたが、最近、自動化アプリケーションで TCL/TK を使い始めました。知識に飢えています。

隠し機能に関する質問の長い行を続けるために、TCL/TK の隠し機能や便利な機能、またはいくつかの大きな操作を実現する簡単な方法を知りたいです。

4

11 に答える 11

18

私のお気に入りの「隠し機能または便利な機能」は、Tcl での引用の仕組みです。私は「引用はツールであって、ルールではない」という言葉をよく使います。また、「中括弧が必要な場合は中括弧のみが必要です」と言うのも好きです。

ほとんどの言語には、特定のものにブロック区切り文字を使用する必要がある規則がありますが (たとえば、C では、ブロックを指定するには {} を使用する必要があります)、Tcl はそれほど厳密ではありません。

Tcl では、必要な効果が得られる引用文字を選択できます。確かにベスト プラクティスはありますが、最終的には、仕事をやり遂げるのに最適な引用文字を選択することになります。

つまり、たとえば、次のようなさまざまな方法でプロシージャを定義できます。

proc foo {args} {
    .... body here ....
}

proc foo "args" "
    .... body here ....
"

proc foo args [some code that returns the body]

... 等々。条件文、ループ、その他すべてについても同様です。(初心者向けに説明すると、中括弧はシェルの一重引用符とほぼ同等であり、二重引用符はシェルの二重引用符のようであり、角括弧はシェルのバッククォートのようなものです)。

さて、多くの人がそれを見て、WTF? と言います。しかし、それは本当にプログラマーに多くの力を与えます. comp.lang.tcl で、「'this {and $that}' を実行した場合、$that を展開するにはどうすればよいですか?」という質問をよく受けます。答えは、古いジョーク「患者: 医者、私がこの医者をすると痛い: そんなことはしないでください」に従います。つまり、ある区切り文字のセットで得られる動作が気に入らない場合は、別の区切り文字を選択してください。通常、if ステートメントは中かっこで構成されているからといって、中かっこで構成する必要があるわけではありません。

これは、私のお気に入りの Tcl の「隠れた」機能です。それは隠されているわけではありません - それは素晴らしく完全でありながら簡潔な Tcl(n) の man ページにあります。

于 2009-06-22T13:59:56.173 に答える
14

Sun のマーケティング担当者が Tcl は「エンタープライズ対応」であると宣言したとき、開発者は次の機能を追加しました。

$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2
于 2009-06-22T11:20:36.773 に答える
12

もう1つの非自明な機能は、認識されないコマンドが「不明」と呼ばれるハンドラーにフォールスルーし、再定義できることです。例えば。未知のコマンドを評価する式として扱うには:

$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]} 
% 2+2
4

その他の例は、根本的な言語の変更に関するwikiページにあります。

于 2009-06-22T16:33:30.180 に答える
12

Tcl の [trace] コマンドを使用すると、任意の変数への読み取りと書き込みを傍受できます。これにより、任意の変数にオブザーバーを実装し、任意の複雑さの自動範囲チェックを任意の変数に追加できます (あたかもセッター/ゲッターを介して変数にアクセスしているかのように)。この手法を使用して、自動インクリメント変数を作成することもできます。

proc varlimit_re {re var key op} {
  upvar $var v
  if { [regexp -- $re $v] <= 0 } {
    error "$var out of range"
  }
}

trace add variable ::myvar {write} [list varlimit_re {^[A-H]\d{3}-[0-9a-f]+$}]`

'myvar' を正規表現に一致しないものに設定しようとすると、実行時エラーが発生します。

于 2009-06-23T10:31:22.140 に答える
8

Tclの「キーワード」はすべて、[for]、[foreach]、[while]などの制御構造を含む通常のTclコマンドです。これは、純粋なTclコードで新しい制御構造を記述して言語を拡張できることを意味します。

たとえば、try / on / trap構造は、Tclコードのみを使用してTcl8.6aに実装されています。同様に、tcllibにはcontrol :: do、do/while制御構造が含まれています。

これの多くは、[upvar]および[uplevel]コマンドによって可能になります。これらのコマンドを使用すると、変数にアクセスしたり、別のスタックフレームでコードを実行したりできます。

于 2009-06-23T09:27:30.100 に答える
8

隠されていないが他の言語から来た人にはわかりにくい便利な機能は、独自の制御構造を定義できることです(または、危険な状態で生活したい場合は、既存の制御構造を再定義することもできます)。TclWikiに例があります

于 2009-06-22T13:17:12.810 に答える
7

私見 Tcl の最大の隠れた機能は、そのC API です。 これを使用すると、コア C プログラムまたはサブシステムをラップし、Tcl で GUI やその他の機能を記述するのが非常に簡単になります。この機能は Tcl に固有のものではありませんが、Tcl はゼロからこれを行うように設計されており、C API は特に操作が簡単です。

2 番目に大きな隠れた機能は、すべてのジオメトリ マネージャーの祖父であるpackerです。これにより、GUI は驚くほど少量のコードで大きなウィンドウを持つことができます。Tcl/Tk には、.net が登場する少なくとも 10 年前からジオメトリ管理があったことに注意することが重要です。

Tcl の 3 番目に大きな機能は、C API または Tcl で定義されたコマンドを使用して言語を拡張できることです。完全な LISP マクロではありませんが、それでも非常に柔軟です。 Expectは、basse Tcl 言語を拡張してドメイン固有のスクリプト言語を作成することを中心に構築されたアプリケーションの非常に良い例です。

編集:まあ、私を悩ませてください、Xtには本当にジオメトリマネージャーがありましたが、パックよりもやや面倒であるという点で Nat に同意します;-}

于 2009-06-22T16:34:44.987 に答える
7

Tcl は非常にシンプルでオープンな言語であり、隠された機能はほとんどありません。プログラマーが拡張および適応できるように、すべてが公開されています。

于 2009-06-22T17:00:45.473 に答える
6
  1. [array names]は、配列を反復処理する方法について、初心者が最初に尋ねる質問の 1 つです。
  2. また、できるという事実foreach {key1 key2} {$list1 $list2} {...}-リストのサイズが異なっていても
  3. switch ケース間でコメントを使用しないでください (これはクールな機能ではありませんが、ほとんどの開発者が理解していない問題です)
  4. コマンドは、rename任意の関数/プロシージャの名前を変更できます
于 2009-07-28T21:08:58.540 に答える
2

十分に文書化されたCAPIにより、Perlへの統合も容易になりました。私のTcl/Tkの経験は1995年にさかのぼりますが、2000年頃に、Perl / Tkを発見し、振り返ることはありませんでした。

そして最近、TclおよびTkx Perlパッケージは、モダンな外観のGUIを提供します。また、前述の2つのモジュールは、些細なことではありませんが、言語の境界を越えて何ができるかを考えると、コードは比較的少なくて済みます。そして、それは優れたAPI(そして明らかにPerlの力)に直接起因している可能性があります。

于 2009-06-26T12:37:29.027 に答える