De Tcl syntaxis

ArticleCategory:

Software Development

AuthorImage:

[Foto van de Auteur]

AuthorName:

Brent B. Welch

AboutTheAuthor:

Brent Welch vermaakt zich met het sleutelen aan zijn website www.scriptics.com waarin onder andere een database is te vinden met referenties -voorzien van commentaar- naar Tcl gerelateerde URLs (het: "Tcl Resource Center") en de e-commerce infrastructuur voor het product Tclpro. Hij heeft tevens een aantal grote applicaties gemaakt met behulp van Tcl/Tk, waaronder de webserver TclHttpd, waarop www.scriptics.com draait, de mail gebruikersinterface Exmh en de HTML-editor webtk. Hij is de auteur van "Practical Programming in Tcl and Tk". Welch behaalde een ingenieurstitel in vliegtuigtechniek aan de universiteit van Boulder, Colorado in 1982. Hij werd doctorandus in de computerwetenschappen aan de universiteit van Berkeley, Californië in 1986 en zijn doctoraal in computerwetenschappen haalde hij in 1990, ook aan de universiteit van Berkeley. In het verleden was Welch werkzaam als onderzoeker aan gedistribueerde systemen bij Xerox PARC en later als lid van het Tcl/Tk-team bij Sun Microsystems Laboratories. Hij is lid van ACM en de IEEE Computer Society. Homepage: www.beedub.com

Abstract:

Dit artikel behandelt het basisconcept en de syntaxis van de taal Tcl.

ArticleIllustration:

[Illustratie]

ArticleBody:

De TCL syntaxis, een introductie

In vergelijking met andere script talen heeft Tcl een eenvoudige syntaxis.

cmd arg arg arg
Een commando in Tcl bestaat uit woorden, gescheiden door spaties. Het eerste woord is de naam van het commando. De resterende woorden zijn de argumenten van het commando.
$foo
Het dollarteken ($) substitueert de waarde van een variabele. In dit geval is dat de variabele foo.
[clock seconds]
Vierkante haken voeren een genest commando uit. Dit wordt bijvoorbeeld gebruikt als je het resultaat van een commando wilt gebruiken als argument voor een ander commando. In dit geval is het geneste commando clock seconds, wat de huidige tijd in seconden geeft.
"meerdere woorden"
Dubbele aanhalingstekens groeperen meerdere woorden tot één argument voor een commando. Dollartekens en vierkante haken binnen aanhalingstekens worden wel uitgevoerd.
{meerdere woorden}
Accolades groeperen ook maar nu worden speciale elementen niet uitgevoerd.
\
De backslash (\) wordt gebruikt om speciale tekens (stuurkarakters) te vormen. \n bijvoorbeeld staat voor een nieuwe regel. De backslash wordt ook gebruikt om de betekenis van speciale tekens te "neutraliseren", zoals dollarteken, aanhalingsteken, vierkante haak en accolade.

Een klein voorbeeld

Hieronder een Tcl commando dat de huidige tijd laat zien. Het maakt gebruik van drie Tcl commando's: set, clock en puts. Het set commando wijst waarden toe aan variabelen. Het clock commando kan omgaan met tijdsgegevens en puts kan waardes afdrukken.

set seconden [clock seconds] puts "Het is [clock format $seconden]"

Merk op dat het dollarteken niet wordt gebruikt bij het toekennen aan een variabele. De variabele seconden is niet nodig in dit voorbeeld. Het afdrukken kan met één commando:

puts "Het is [clock format [clock seconds]]"

Groeperen en substitueren

De Tcl syntaxis is erop gericht de parser in drie stappen te laten evalueren: groeperen van argumenten, substitueren van resultaten en commando's aanroepen.

  1. Groeperen van argumenten. Tcl moet de argumenten voor een commando kunne zien. In het meest simpele geval gebeurt de scheiding met spaties. Zoals hierboven omschreven worden aanhalingstekens en accolades gebruikt voor het groeperen van meerdere woorden tot één argument. In het laatste voorbeeld werden dubbele aanhalingstekens gebruikt voor het groeperen tot één argument aan het puts commando.

  2. Substitueren van resultaten. Na het groeperen worden variabelen gesubstitueerd. Oftewel, het substitueert $foo met de waarde van foo en vervangt geneste commando's (binnen de vierkante haken) met het resultaat ervan. Belangrijk is hier dat substituties worden gedaan ná het groeperen. Hierdoor wordt vermeden dat ongebruikelijke waarden de structuur in een commando compliceren.

  3. Commando's aanroepen. Na substitutie gebruikt Tcl het commando als index in een tabel. De bijbehorende C-procedure die staat aangegeven in de tabel wordt dan uitgevoerd. Deze procedure is de implementatie van het commando. In Tcl kun je ook procedures maken. Hiervoor zijn simpele regels met betrekking tot het doorgeven van argumenten en het afhandelen van fouten.

Nog een voorbeeld

Hier nog een ander voorbeeld:

set i 0 while {$i < 10} { puts "$i squared = [expr $i*$i]" incr i }

In dit voorbeeld worden accolades gebruikt voor het groeperen van argumenten zonder dat hierin substitutie plaatsvindt. Het is de implementatie van het while commando die weet dat het eerste argument een expressie is en het tweede nog meer Tcl commando's. De accolades groeperen dus twee argumenten: de logische expressie die de lus stuurt en de commando's binnen de lus.

Verder zien we twee rekenkundige expressies: de vergelijking en de vermenigvuldiging. Het while commando interpreteert het eerste argument automatisch als zijnde een expressie. In andere gevallen moet men de expressie expliciet aangeven middels het expr commando om een rekenkundige evaluatie te forceren.

Commando's aanroepen

Als laatste roept Tcl iets anders aan om het echte werk te verzetten. We hebben nu gezien dat Tcl expr aanroept voor het afhandelen van rekenkundige expressies, puts voor het afhandelen van uitvoerfuncties en set om waarden aan variabelen toe te kennen. Deze Tcl commando's zijn geïmplementeerd door C-functies die zichzelf aanmelden bij Tcl. Deze functies accepteren de argumenten als strings en retourneren een nieuwe string als resultaat. Het is heel eenvoudig om dit soort C functies te maken. De functie kan van alles doen. Van het benaderen van databases tot het creëren van een grafische gebruikersinterface. De taal Tcl weet niet echt wat het commando doet. Het groepeert slechts argumenten, substitueert resultaten en roept commando's aan.

Een laatste voorbeeld

Hier een functie voor het berekenen van faculteiten:
proc fac {x} {
    if {$x < 0} {
        error "Ongeldig argument $x: moet een positief geheel getal zijn"
    } elseif {$x <= 1} {
        return 1
    } else {
        return [expr $x * [fac [expr $x-1]]]
    }
}

Meer informatie:

Referentie voor dit artikel: Scriptics