2009-06-21 7 views
13

Ich habe mit TCL/TK gearbeitet, vor kurzem begonnen, TCL/TK mit meinen Automatisierungsanwendungen zu verwenden, und ich bin hungrig nach Wissen.Versteckte Funktionen von TCL/TK

mit der langen Reihe der versteckten Feature Fragen fortzusetzen, würde Ich mag keine versteckten oder praktische Funktionen von TCL/TK oder jeder einfachen Methode wissen, einige großen Operationen

+3

Community Wiki bitte. –

+1

Ich zweite diese Anfrage. – Geo

+0

Sorry jeder .. Ich muss eine der Antworten für Stack over Fow akzeptieren. Hier ist alles eine gute Antwort nur .. Ich akzeptiere nur die Antwort wie auf der Grundlage von Abstimmungen – joe

Antwort

14

Wenn ein Marketing-Mann bei Sun erreichen erklärte, Tcl „Enterprise Ready“ war, fügten die Entwickler die folgende Funktion:

$ tclsh 
% clock format [clock seconds] -format %Q 
Stardate 63473.2 
+0

Tolles Feature, obwohl sie sich dafür zu schämen scheinen: http://www.tcl.tk/man/tcl8.5/TclCmd/clock.htm#M58 "% Q Diese Formatgruppe ist für den internen Gebrauch innerhalb des Tcl reserviert Bibliothek." – phihag

+19

Das Sternzeitformat hatte nichts mit Sonne zu tun. Ich habe es zu Tcl hinzugefügt, während ich bei Scriptics als Osterei für die bevorstehende Tcl2K-Konferenz gearbeitet habe. Eines der Konferenz-Events war ein Wettbewerb, um ein Standard-zu-Sternwarte-Konvertierungs-Dienstprogramm zu implementieren, das eine arkane Formel verwendet. Nur ein Typ hat die Veranstaltung betreten. Er verbrachte ein paar Stunden damit, sich über die Implementierung zu quälen (da er auf der Suche nach einem Job bei Scriptics war, er wollte unbedingt beeindrucken), nur um dann das Osterei offenbaren zu lassen. Natürlich hat er den Wettbewerb trotzdem gewonnen. Und er hat auch den Job bekommen. –

+4

Hier ist das CVS-Protokoll für den Zusatz: http://tcl.cvs.sourceforge.net/viewvc/tcl/tcl/unix/tclUnixTime.c?view=log#rev1.7 Das "Enterprise" -Bit war ein Spiel auf der Thema von Tcl2K, das war, dass Tcl die einzige unternehmensfreundliche Skriptsprache war. Die Manpage ist bewusst vage, weil es natürlich ein Osterei ist. –

6

Eine praktische Funktion, die nicht versteckt wird, neigt dazu, aber nicht offensichtlich aus anderen Sprachen kommen, um Menschen zu sein, ist, dass Sie Ihre eigenen Kontrollstrukturen definieren können (oder definieren Sie sogar die vorhandenen neu, wenn Sie gefährlich leben möchten). Es gibt Beispiele auf der

14

Meine Lieblings "versteckte oder praktische Funktion" ist, wie zitiert in Tcl arbeitet. Ich verwende gerne den Ausdruck "Zitat ist ein Werkzeug, keine Regel". Ich mag auch „nur Sie geschweiften Klammern benötigen, wenn Sie geschweifte Klammern müssen“ sagen

Während die meisten Sprachen haben Regeln für die Blocktrennzeichen müssen (zum Beispiel für bestimmte Dinge verwendet werden, in C müssen Sie verwenden {} zu bezeichnen einen Block), Tcl ist nicht so streng.

Mit Tcl können Sie auswählen, welche Zitierzeichen Ihnen den gewünschten Effekt geben. Es gibt sicherlich Best Practices, aber am Ende müssen Sie den Anführungszeichen auswählen, mit dem Sie die Aufgabe am besten erledigen können.

Das bedeutet zum Beispiel, können Sie ein Verfahren in vielerlei Hinsicht definieren, einschließlich:

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

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

proc foo args [some code that returns the body] 

... und so weiter. Gleiches gilt für bedingte Anweisungen, Schleifen und alles andere. (Für Nichteingeweihte sind geschweifte Klammern in etwa gleichbedeutend mit dem einfachen Anführungszeichen der Shell, doppelte Anführungszeichen sind wie das doppelte Anführungszeichen der Shell und eckige Klammern sind wie der Shell-Backtick.).

Jetzt schauen sich viele Leute das an und sagen WTF? aber es gibt dem Programmierer wirklich viel Kraft. Wir bekommen oft Fragen in comp.lang.tcl nach dem Motto "Wenn ich 'this {und $ that}' mache, wie bekomme ich $, das erweitert werden soll?". Die Antwort folgt dem alten Witz "Patient: Doktor, es tut weh, wenn ich diesen Arzt mache: Tu das nicht". Das heißt, wenn Sie das Verhalten, das Sie mit einem Satz Trennzeichen erhalten, nicht mögen, wählen Sie ein anderes Trennzeichen. Nur weil eine if-Anweisung normalerweise mit geschweiften Klammern konstruiert wird, heißt das nicht, dass sie mit geschweiften Klammern erstellen muss.

Das ist meine Lieblings "versteckte" Funktion von Tcl. Es ist nicht versteckt - es ist direkt auf der wunderbar vollständigen, aber prägnanten Tcl (n) man-Seite, aber die Auswirkungen sind nicht klar, bis Sie vollständig wissen, wie Tcl funktioniert.

+0

Ein definitiver Stolperstein für Anfänger, besonders mit Formen wie 'expr' (oder so, wie ich es beim Lernen gefunden habe). – new123456

11

Ein weiteres nicht offensichtliches Merkmal ist, dass nicht erkannte Befehle an einen Handler mit der Bezeichnung "unbekannt" weitergegeben werden, den Sie neu definieren können. Z.B. behandelt unbekannte Befehle als Ausdrücke haben zu bewerten:

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

Weitere Beispiele auf der Wiki-Seite auf Radical Language Modification

+0

Cool! Dies wäre besser, wenn überprüft wird, ob der Befehlsname ein gültiges "2 + 2" ist. ;-) –

5

IMHO die größte verstecktes Feature von Tcl zu finden sind seine C API. Mit diesem ist, es ist wirklich einfach zu wickeln ein Kern-C-Programm oder -Subsystem und schreibe eine GUI oder andere Funktionalität in Tcl.Obwohl diese Funktion nicht nur für Tcl gilt, wurde Tcl von Grund auf dafür entwickelt und die C API ist besonders einfach zu bedienen.

Das zweitgrößte versteckte Feature ist der packer, der Großvater aller Geometrie-Manager. Damit kann eine GUI große Fenster mit erstaunlich wenig Code haben. Es ist wichtig zu beachten, dass Tcl/Tk Geometrie-Management mindestens 10 Jahre zuvor hatte .net kam heraus.

Das drittgrößte Merkmal von Tcl ist die Möglichkeit, die Sprache entweder über die C-API oder mit in Tcl definierten Befehlen zu erweitern. Nicht ganz LISP-Makros, aber dennoch ziemlich flexibel. Expect ist ein sehr gutes Beispiel für eine Anwendung, die auf der Erweiterung der basse Tcl-Sprache basiert, um eine domänenspezifische Skriptsprache zu erstellen.

EDIT: gut, hau mich, Xt really did have a geometry manager, obwohl ich mit Nat, dass es etwas schmerzhafter als Pack zustimmen; -}

+5

Es ist erstaunlich, dass zwischen Pack- und Grid-Geometrie-Managern mehr als 99% aller Layout-Probleme gelöst werden können, und mit sehr wenigen Codezeilen. Vergleichen Sie dies mit einem Toolkit wie wxWidgets, das mindestens vier Geometrie-Manager für die gleiche Aufgabe benötigt: GridSizer, FlexGridSizer, BoxSizer und StaticBoxSizer. Außerdem sind die Box-Sizers nicht ganz so leistungsstark wie der Packer, so dass Sie normalerweise einen für horizontales Layout und einen für vertikale verwenden müssen, etwas, das der Packer mit Bravour handhabt. –

+0

@Bryan Oakley - abso-f-ing-lutely. Hört hört. Ich hätte es nicht besser sagen können. – ConcernedOfTunbridgeWells

+0

Xt hatte Geometrie-Manager vor Tk, aber Xt war eine schreckliche API, mit der man arbeiten konnte. Tk war ein frischer Wind, nachdem er die Athena und Motif Widget Sets erlebt hatte. – Nat

7

Tcl ist so eine einfache, offene Sprache gibt es sehr wenig versteckten Funktionen . Es ist alles offen für den Programmierer zu erweitern und anzupassen.

+0

Sie machen einen sehr guten Punkt. –

+1

TCL könnte eine einfache Sprache ohne zu viele Befehle sein, aber sie können auf interessante Weise kombiniert werden. –

6

Alle Schlüsselwörter von Tcl sind reguläre Tcl-Befehle, einschließlich Kontrollstrukturen wie [for], [foreach], [while] usw. Dies bedeutet, dass Sie die Sprache durch Schreiben neuer Kontrollstrukturen in reinem Tcl-Code erweitern können . Die try/on/trap Struktur wurde beispielsweise in Tcl 8.6a unter Verwendung von nur Tcl-Code implementiert. Ähnlich enthält tcllib control :: do, eine do/while Kontrollstruktur.

Eine Menge davon wird durch die Befehle [upvar] und [uplevel] ermöglicht, mit denen Sie auf Variablen zugreifen oder Code in einem anderen Stack-Frame ausführen können.

10

Der Tcl-Befehl [trace] ermöglicht das Abfangen von Lese- und Schreibvorgängen für beliebige Variablen. Auf diese Weise können Sie einen Beobachter für jede Variable implementieren und jeder Variablen eine automatische Bereichsüberprüfung beliebiger Komplexität hinzufügen (als ob Sie über einen Setter/Getter auf die Variable zugegriffen hätten). Sie können auch automatisch inkrementierende Variablen mit dieser Technik erstellen.

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]+$}]` 

Wenn Sie versuchen, 'myvar' auf etwas zu setzen, das nicht mit dem regulären Ausdruck übereinstimmt, erhalten Sie einen Laufzeitfehler.

2

Die gut dokumentierte C-API ermöglichte auch eine einfache Integration in Perl. Meine Erfahrung mit Tcl/Tk geht zurück bis 1995, aber im Jahr 2000 entdeckte ich Perl/Tk und schaute nie zurück.

Und in letzter Zeit, die Tcl und Tkx Perl-Pakete geben uns modern aussehende GUI's. Und die beiden oben genannten Module sind zwar nicht trivial, beinhalten aber relativ wenig Code, wenn man berücksichtigt, was man über Sprachgrenzen hinweg tun kann. Und das kann direkt der ausgezeichneten API (und natürlich der Macht von Perl) zugeschrieben werden.

5
  1. [array names] ist eine der ersten Fragen, Neulinge zu fragen, wie
  2. auch über ein Array zu durchlaufen, die Tatsache, dass man foreach {key1 key2} {$list1 $list2} {...} - auch wenn die Listen sind von unterschiedlicher Größe
  3. Sie nicht Kommentare verwenden sollten zwischen Schalter Fällen (dies kein cooles Feature ist aber ein Problem, die meisten Entwickler nicht verstehen
  4. der rename Befehl umbenennen kann eine beliebige Funktion/proc
+1

Der letzte ist Teil von dem, was dem Tcl-Programmierer so viel Flexibilität gibt. In wie vielen anderen Sprachen können Sie "if" oder "return" neu definieren? Und während es sehr, sehr selten jemals eine Zeit gibt, in der Sie Kernbefehle umbenennen müssen, werden Sie das eine Mal, wenn Sie das tun, sehr glücklich sein. –

5

Ich denke, der time Befehl ist wunderbar. Es ist nicht genau versteckt, aber das hindert die Leute nicht, in comp.lang.tcl ab und zu zu fragen, welche Funktion schneller ist.

Wann immer Sie wissen wollen "wie lange dauert das?" oder "welche Methode ist schneller?" Sie rufen es einfach über den Befehl "time" an. Kein Erstellen von Objekten, keine Mathematik, kein Overhead, außergewöhnlich einfach. Andere Sprachen haben eine ähnliche Funktion, obwohl einige etwas weniger elegant sind.