Dateien
set datei [file join [pwd] "tcl-demo.txt"]
set f [open $datei w]
puts $f "eins"
puts $f "zwei"
puts -nonewline $f "drei"
close $f
set f [open $datei r]
set inhalt [read $f]
close $f
puts [string length $inhalt]
set f [open $datei r]
while {[gets $f zeile] >= 0} { puts "> $zeile" }
close $f
set f [open $datei a]
puts $f "\nvier"
close $f
set f [open $datei]
puts [llength [split [string trim [read $f]] "\n"]]
close $f
puts [file exists $datei]
puts [file size $datei]
puts [file extension $datei]
puts [file tail $datei]
puts [file rootname [file tail $datei]]
file delete $datei
puts [file exists $datei]Ausgabe
14 > eins > zwei > drei 4 1 20 .txt tcl-demo.txt tcl-demo 0
Namespaces
Namespaces kapseln Variablen und Prozeduren:
namespace eval mathe {
variable zaehler 0
proc quadrat {x} { return [expr {$x * $x}] }
proc zaehle {} {
variable zaehler
return [incr zaehler]
}
namespace export quadrat zaehle
}
puts [mathe::quadrat 6]
puts [mathe::zaehle]
puts [mathe::zaehle]
namespace import mathe::quadrat
puts [quadrat 9]
puts [namespace exists mathe]
puts [lsort [info commands mathe::*]]Ausgabe
36 1 2 81 1 ::mathe::quadrat ::mathe::zaehle
Skriptsubstitution mit eval, uplevel und eigene Kontrollstrukturen
Weil alles ein Befehl ist, kann man eigene Kontrollstrukturen schreiben:
proc wiederhole {n rumpf} {
for {set i 0} {$i < $n} {incr i} { uplevel 1 $rumpf }
}
set zaehler 0
wiederhole 3 { incr zaehler; puts "Durchlauf $zaehler" }
proc mit_zeit {rumpf} {
set ergebnis [uplevel 1 $rumpf]
return "Ergebnis: $ergebnis"
}
puts [mit_zeit { expr {6 * 7} }]
set befehl {puts "dynamisch"}
eval $befehl
set op +
puts [expr "3 $op 4"]
puts [{*}{string toupper} abc]
puts [apply {{x y} {expr {$x + $y}}} 3 4]
set f [list string repeat "ab"]
puts [{*}$f 2]Ausgabe
Durchlauf 1 Durchlauf 2 Durchlauf 3 Ergebnis: 42 dynamisch 7 ABC 7 abab
Objekte mit TclOO
oo::class create Tier {
variable name
constructor {n} { set name $n }
method laut {} { return "..." }
method vorstellen {} { return "$name sagt [my laut]" }
}
oo::class create Hund {
superclass Tier
method laut {} { return "Wau" }
method apportiere {} { return "holt Stock" }
}
oo::class create Katze {
superclass Tier
method laut {} { return "Miau" }
}
set tiere [list [Hund new "Rex"] [Katze new "Mimi"]]
foreach t $tiere { puts [$t vorstellen] }
puts [[lindex $tiere 0] apportiere]
puts [info object class [lindex $tiere 1]]
foreach t $tiere { $t destroy }Ausgabe
Rex sagt Wau Mimi sagt Miau holt Stock ::Katze
Merke
- Dateien:
open,gets,read,puts $f,close;filebietet Pfadfunktionen namespace evalkapselt Code;variablegreift auf Namespace-Variablen zuuplevel,evalund{*}machen eigene Kontrollstrukturen möglich- TclOO bringt Klassen, Vererbung und Methoden
Aufgabe
Schreibe eine Klasse Konto mit einzahlen und kontostand.