De elva reglerna

This is a translation (to Swedish) of the eleven syntactic rules of Tcl (see Endekalogue for other translations).

Eventuellt kontroversiella översättningar:

anförda tecken
quoted characters
strukturvariabel
array
hake
bracket
vita tecken
white space (ett alternativ vore blanktecken, men med det menas huvudsakligen mellanslag)

Följande regler definierar syntax och semantik för programmeringsspråket Tcl:

(1) Kommandon

Ett Tcl-skript är en (Unicode-)sträng som innehåller ett eller flera kommandon. Semikolon och nyradstecken är kommandoavskiljare såvida de inte är anförda enligt beskrivning nedan. Högerhakar avslutar kommandon under kommandosubstituering (se nedan) såvida de inte är anförda.

(2) Utvärdering

Ett kommando utvärderas i två steg. Först delar Tcl-tolken upp kommandot i ord och utför substituering så som beskrivs nedan. Dessa substitueringar utförs på samma sätt för alla kommandon. Det första ordet används för att finna en kommandoprocedur som ska utföra kommandot, de övriga orden lämnas till kommandoproceduren. Kommandoproceduren har frihet att tolka vart och ett av orden på vilket sätt den önskar, t.ex. som ett heltal, variabelnamn, lista eller Tcl-skript. Olika kommandon tolkar sina ord på olika sätt.

(3) Ord

Orden i ett kommando avskiljs från varandra av vita tecken (med undantag för nyradstecken, som är kommandoavskiljare).

(4) Dubbelcitattecken

Om det första tecknet i ett ord är ett dubbelcitattecken (") så avslutas ordet av nästa dubbelcitattecken. Om semikolon, högerhakar eller vita tecken (inklusive nyradstecken) förekommer mellan citattecknen behandlas de som vanliga tecken och räknas in i ordet. Komandosubstituering, variabelsubstituering och backstreckssubstituering utförs på tecknen mellan citattecknen så som beskrivs nedan. Dubbelcitattecknen ingår inte i själva ordet.

(5) Klamrar

Om det första tecknet i ett ord är en vänsterklammer ({) så avslutas ordet av nästa motsvarande högerklammer (}). Klamrar kan nästlas inom ett ord: för varje ytterligare vänsterklammer måste det finnas ytterligare en högerklammer (men om en vänster- eller högerklammer inom ordet är anförd med ett backstreck räknas den inte i klammerpassningen). Inga substitueringar utförs på tecknen mellan klamrarna med undantag för backstreck-nyradstecken-substitueringar som beskrivs nedan. Inte heller kommer semikolon, nyradstecken, högerhakar eller vita tecken att tolkas som speciella tecken. Ordet kommer att bestå av exakt de tecken som står mellan de yttersta klamrarna; de yttre klamrarna ingår inte i ordet.

(6) Kommandosubstituering

Om ett ord innehåller en vänsterhake ([) så genomför Tcl kommandosubstituering. För detta ändamål startar den Tcl-tolken rekursivt för att bearbeta tecknen som följer efter vänsterhaken som ett Tcl-skript. Skriptet får innehålla ett godtyckligt antal kommandon och måste avslutas med en högerhake (]). Skriptets resultat (dvs. resultatet av dess sista kommando) sätts in i ordet som ersättning för hakarna och alla tecken mellan dem. Ett godtyckligt antal kommandosubstitueringar får förekomma i ett enskilt ord. Kommandosubstituering utförs inte på ord som omsluts av klamrar.

(7) Variabelsubstituering

Om ett ord innehåller ett dollartecken ($) så genomför Tcl variabelsubstituering: dollartecknet och de följande tecknen ersätts i ordet av variabelns värde. Variabelsubstituering förekommer i följande former:

$namn
namn är namnet på en skalärvariabel; namnet är en sekvens av ett eller flera tecken som är en bokstav, siffra, understreck eller namnrymdavskiljare (två eller flera kolon).
$namn(index)
namn är namnet på en strukturvariabel och index är namnet på ett element i denna. Namn får bara bestå av bokstäver, siffror, understreck och namnrymdavskiljare, och får vara en tom sträng. Kommandosubstituering, variabelsubstituering och backstreckssubstituering kommer att utföras på tecknen i index.
${namn}
namn är namnet på en skalärvariabel. Det får innehålla vilka tecken som helst förutom högerklammer. För oss som använder variabelnamn med tecken som å, ä, ö är det här ett nödvändigt skrivsätt.

Ett godtyckligt antal variabelsubstitueringar kan förekomma i ett enskilt ord. Variabelsubstituering utförs inte på ord som omsluts av klamrar.

(8) Backstreckssubstituering

Om ett backstreck (\) förekommer i ett ord så utförs backstreckssubstituering. I alla förekomster utom de som beskrivs nedan utelämnas backstrecket och det följande tecknet hanteras som ett vanligt tecken och får ingå i ordet. Detta tillåter att tecken som dubbelcitattecken, högerklamrar och dollartecken ingår i ord utan att orsaka särskild bearbetning. Följande tabell visar de backstreckssekvenser som hanteras annorlunda, tillsammans med de värden som ersätter varje sekvens.

\a
Ljudsignal (0x7)
\b
Backsteg (0x8)
\f
Sidmatning (0xc)
\n
Nyradstecken (0xa)
\r
Vagnretur (0xd)
\t
Tabulatortecken (0x9)
\v
Vertikal tabulering (0xb)
\<radbyte>vittTecken
Ett mellanslagstecken ersätter backstrecket, radbrytningen och alla mellanslag och tabuleringar efter radbrytningen. Den här backstreckssekvensen är speciell såtillvida att den ersätts i ett särskilt förbearbetningsskede innan kommandot bearbetas på allvar. Det betyder att den kommer att ersättas även om den förekommer inom klamrar, och att det resulterande mellanslaget kommer att hanteras som en ordavskiljare om det inte står inom klamrar eller är anfört.
\\
Backstreck (\)
\ooo
Siffrorna ooo (en, två eller tre stycken) ger ett åttabitars oktalt värde för det Unicode-tecken som sätts in. De övre bitarna i teckenkoden kommer att vara 0.
\xhh
Hexadecimalsiffrorna hh ger ett åttabitars hexadecimalt värde för det Unicode-tecken som sätts in. Ett godtyckligt antal hexadecimala siffror kan förekomma; alla utom de två sista kommer dock att ignoreras (resultatet blir alltid av en bytes storlek). De övre bitarna av Unicode-teckenkoden blir 0.
\uhhhh
Hexadecimalsiffrorna hhhh (en, två, tre, eller fyra stycken) ger ett sextonbitars hexadecimalt värde för det Unicode-tecken som sätts in.

Backstreckssubstitution utförs inte på ord som omsluts av klamrar, med undantag för backstreck-radbrytning, så som beskrivs ovan.

(9) Kommentarer

Om ett brädgårdstecken (#) står på en plats där Tcl förväntar sig det första tecknet av det första ordet i ett kommando, så kommer brädgårdstecknet och de tecken som följer det, till och med nästa nyradstecken, att hanteras som en kommentar och ignoreras. Kommentarstecknet har den här betydelsen enbart när den står i början av ett kommando.

(10) Substitueringsordning

Varje tecken behandlas exakt en gång av Tcl-tolken under proceduren då orden i ett kommando fastställs. Till exempel gäller att om variabelsubstituering inträffar kommer inga ytterligare substitueringar att göras på variabelns värde; detta värde sätts in i ordet som det är. Om kommandosubstituering inträffar så bearbetas det nästlade kommandot helt och hållet av det rekursiva anropet till Tcl-tolken; inga substitueringar utförs innan det rekursiva anropet görs, och inga ytterligare substitueringar utförs på resultatet av det nästlade skriptet.

Substitueringar utförs från vänster till höger, och varje substituering utvärderas helt och hållet innan tolken börjar utvärdera nästa. Därför kommer en sekvens som

 set y [set x 0][incr x][incr x]

alltid att sätta variabeln y till värdet 012.

(11) Substituering och ordgränser

Substitueringar påverkar inte ordgränserna i ett kommando. Vid t.ex. variabelsubstituering kommer hela värdet av variabeln att bli en del av ett enda ord, även om värdet innehåller mellanslag.

Vem är det som jobbar på detta? Hjälper gärna till! - VL 21 maj 2003.

Svensktalande personer är välkomna att lämna förslag, antingen här på sidan eller per e-post. Notera att alla ändringar ovanför horisontalstrecket ovan riskerar att försvinna om jag uppdaterar texten utan att märka att någon annan gjort en ändring.

Skall ta en titt när jag har lite tid över, vore trevligt att få ihop de elva - VL

Speciellt önskar jag att du kunde titta på de ord som jag inte hittat någon bra översättning för. Jag har markerat dem <så här>. "Substituering" trivs jag också dåligt med, men ännu sämre med "ersättning", tror jag.


2003-05-22: Råöversättningen är klar, nu återstår finputsning och översättning av de sista oöversatta fraserna.

VL 2003-06-04: Skriver ut denna och originalet för korrekturläsning, återkommer nästa vecka.