Domanda

Ho lavorato con TCL / TK, recentemente ho iniziato a utilizzare TCL / TK con le mie applicazioni di automazione e ho fame di conoscenza.

Per continuare con la lunga serie di domande sulle funzioni nascoste, vorrei conoscere qualsiasi funzionalità nascosta o utile di TCL / TK o qualsiasi metodo semplice per realizzare alcune grandi operazioni

È stato utile?

Soluzione

Quando un ragazzo del marketing di Sun dichiarò che Tcl era "Enterprise Ready", gli sviluppatori aggiunsero la seguente funzione:

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

Altri suggerimenti

La mia funzione preferita " nascosta o pratica " è come funziona la quotazione in Tcl. Mi piace usare la frase " quoting è uno strumento, non una regola " ;. Mi piace anche dire " hai bisogno di parentesi graffe solo quando hai bisogno di parentesi graffe "

Sebbene la maggior parte delle lingue abbia regole per le quali i delimitatori di blocco devono essere utilizzati per determinate cose (ad esempio, in C è necessario utilizzare {} per designare un blocco), Tcl non è così rigoroso.

Con Tcl, puoi scegliere qualunque carattere di citazione ti dia l'effetto di cui hai bisogno. Esistono sicuramente le migliori pratiche, ma alla fine puoi scegliere il carattere di citazione che ti consente di completare il lavoro.

Ciò significa, ad esempio, che puoi definire una procedura in molti modi, tra cui:

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

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

proc foo args [some code that returns the body]

... e così via. Lo stesso vale per le istruzioni condizionali, i loop e tutto il resto. (per le parentesi graffe non iniziate sono all'incirca equivalenti alla virgoletta singola della shell, le virgolette doppie sono come la virgoletta doppia della shell e le parentesi quadre sono come il backtick della shell.).

Ora, molte persone lo guardano e dicono WTF? ma dà davvero molta potenza al programmatore. Spesso riceviamo domande in comp.lang.tcl seguendo le linee di " se faccio "this {e $ that}", come ottengo $ che si espanda? & Quot ;. La risposta segue la vecchia battuta "paziente: dottore, fa male quando faccio questo dottore: non farlo". Cioè, se non ti piace il comportamento che si ottiene con un set di delimitatori, scegliere un altro delimitatore. Solo perché un'istruzione if è normalmente costruita con parentesi graffe non significa che deve essere costruita con parentesi graffe.

Questo è il mio preferito " nascosto " caratteristica di Tcl. Non è nascosto - è proprio sulla pagina man Tcl (n) meravigliosamente completa ma concisa, ma le ramificazioni non sono chiare fino a quando non si capisce come funziona Tcl.

Un'altra caratteristica non ovvia è che i comandi non riconosciuti cadono in un gestore chiamato "sconosciuto". che puoi ridefinire. Per esempio. avere comandi sconosciuti trattati come espressioni da valutare:

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

Altri esempi sono disponibili nella pagina wiki su Modifica del linguaggio radicale

Il comando [trace] di Tcl consente di intercettare letture e scritture su qualsiasi variabile. Ciò consente di implementare un osservatore su qualsiasi variabile e di aggiungere il controllo automatico dell'intervallo di complessità arbitraria a qualsiasi variabile (come se si stesse accedendo alla variabile tramite un setter / getter). Puoi anche creare variabili a incremento automatico usando questa tecnica.

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

Se provi a impostare "myvar" su qualcosa che non corrisponde all'espressione regolare, otterrai un errore di runtime.

Una caratteristica utile che non è nascosta ma tende a non essere ovvia per le persone che provengono da altre lingue è che puoi definire le tue strutture di controllo (o anche ridefinire quelle esistenti se vuoi vivere pericolosamente). Ci sono esempi nel Tcl Wiki

Tcl è un linguaggio così semplice e aperto, ci sono pochissime funzioni nascoste. È tutto esposto perché il programmatore si estenda e si adatti.

Tutte le "parole chiave" di Tcl " sono comandi Tcl regolari, comprese le strutture di controllo come [for], [foreach], [while], ecc. Ciò significa che è possibile estendere il linguaggio scrivendo nuove strutture di controllo in puro codice Tcl.

Ad esempio, la struttura try / on / trap è stato implementato in Tcl 8.6a usando solo il codice Tcl. Allo stesso modo tcllib contiene control :: do, una struttura di controllo do / while.

Molto di tutto ciò è reso possibile attraverso i comandi [upvar] e [uplevel], che consentono di accedere alle variabili o eseguire il codice in un frame stack diverso.

IMHO la più grande caratteristica nascosta di Tcl è la sua API C. Usando questo, è davvero facile avvolgere un programma o sottosistema C principale e scrivere una GUI o altre funzionalità in Tcl. Sebbene questa funzionalità non sia esclusiva di Tcl, Tcl è stato progettato per farlo da zero e l'API C è particolarmente facile da utilizzare.

La seconda caratteristica nascosta più grande è il packer , il nonno di tutti i gestori della geometria. Con questo, una GUI può avere finestre considerevoli con una quantità sorprendentemente piccola di codice. È importante notare che Tcl / Tk aveva una gestione della geometria almeno 10 anni prima dell'uscita di .net.

La terza caratteristica più grande di Tcl è la possibilità di estendere la lingua, tramite l'API C o con i comandi definiti in Tcl. Non abbastanza macro LISP, ma abbastanza flessibile. Expect è un ottimo esempio di un'applicazione sviluppata per estendere il linguaggio Tcl basse per creare uno script specifico del dominio lingua.

MODIFICA: bene, inculami, Xt aveva davvero un gestore della geometria , anche se concordo con Nat in quanto è un po 'più doloroso del pacchetto; -}

  1. [nomi di array] è una delle prime domande che i principianti pongono su come iterare su un array
  2. inoltre, il fatto che puoi foreach {key1 key2} {$ list1 $ list2} {...} - anche se le liste hanno dimensioni diverse
  3. non dovresti usare i commenti tra i casi di switch (questa non è una funzionalità interessante ma un problema che la maggior parte degli sviluppatori non capisce
  4. il comando rinomina può rinominare qualsiasi funzione / proc

Penso che il comando time sia meraviglioso. Non è esattamente nascosto ma ciò non impedisce alle persone di chiedere "quale funzione è più veloce" di tanto in tanto in comp.lang.tcl.

Ogni volta che vuoi sapere " quanto tempo impiega? " o " quale metodo è più veloce? " lo chiami semplicemente tramite il " time " comando. Nessuna creazione di oggetti, nessuna matematica, nessun sovraccarico, eccezionalmente semplice. Altre lingue hanno una funzione simile, sebbene alcune siano un po 'meno eleganti.

L'API C ben documentata ha anche permesso una facile integrazione in Perl. La mia esperienza con Tcl / Tk risale al 1995, ma nel 2000 circa ho scoperto Perl / Tk e non ho mai guardato indietro.

E ultimamente, i pacchetti Tcl e Tkx Perl ci offrono una GUI dall'aspetto moderno. E i due moduli sopra menzionati, sebbene non banali, coinvolgono relativamente poco codice, considerando ciò che consentono di fare oltre i confini del linguaggio. E questo può essere direttamente attribuibile all'eccellente API (e alla potenza di Perl, ovviamente).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top