expr 2+2 expr 14.1*6 expr (3 > 4) (6 <= 7) button.b -text "Hello, world!" -command exit pack.b ΕΙΣΑΓΩΓΗ ΣΤΗΝ TCL TK



Σχετικά έγγραφα
Εισαγωγή στην Tcl. Τί είναι η Tcl;

ιαχείριση Πληροφοριών στο ιαδίκτυο

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΠΡΑΞΕΙΣ. Παράδειγμα #1. Πράξεις μεταξύ ακεραίων αριθμών

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

Εισαγωγή στην Αριθμητική Ανάλυση

a = 10; a = k; int a,b,c; a = b = c = 10;

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

επιµέλεια Θοδωρής Πιερράτος

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Υπολογιστές Ι. Άδειες Χρήσης. Τύποι δεδομένων. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Τύποι δεδομένων, μεταβλητές, πράξεις. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός

Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη.

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Τυπικές χρήσεις της Matlab

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

PERL. Δήμος Παύλου Δημήτρης Κουζαπάς

Mεταγλωττιστές. 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex. Θεωρία

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

S, (5, -3, 34, -23, 7) ( *, _

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή

Εισαγωγή στην επιστήμη των υπολογιστών

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ. Δρ. Π. Νικολαΐδου

Δυαδικό Σύστημα Αρίθμησης

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

Κεφάλαιο 10 ο Υποπρογράµµατα

Εισαγωγή στη Matlab Βασικές Συναρτήσεις

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Ρητή μετατροπή αριθμητικής τιμής σε άλλο τύπο. Τι θα τυπωθεί στον παρακάτω κώδικα;

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εισαγωγή στην επιστήµη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ

Θέματα Προγραμματισμού Η/Υ

Εισαγωγή στην γλώσσα προγραμματισμού C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

Shell Scripts: loops / if / test

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

Ηλεκτρονικοί Υπολογιστές

Εργαστήριο Μαθηματικής Ανάλυσης Ι. Εισαγωγή στη Matlab Βασικές Συναρτήσεις-Γραφικές παραστάσεις. Πανεπιστήμιο Θεσσαλίας. Σχολή Θετικών Επιστημών

1 η Εργαστηριακή Άσκηση MATLAB Εισαγωγή

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής.

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΗΥ-150. Προγραμματισμός

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΗΥ-150. Προγραμματισμός

Προγραμματισμός με FORTRAN Συνοπτικός Οδηγός Α. Σπυρόπουλος Α. Μπουντουβής

Λειτουργικά Συστήματα

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

scanf() scanf() stdin scanf() printf() int float double %lf float

Ανάπτυξη και Σχεδίαση Λογισμικού

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Φροντιστήριο 1ο Εισαγωγή στο FLEX. Flex. Regular Expressions (1/4)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Μερικές άλλες χρήσιμες εντολές

Εισαγωγή στον Προγραμματισμό

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

Λογικός τύπος Τελεστές σύγκρισης Λογικοί τελεστές Εντολές επιλογής Εμβέλεια Μαθηματικές συναρτήσεις Μιγαδικός τύπος ΔΕΥΤΕΡΗ ΔΙΑΛΕΞΗ

ΓΛΩΣΣΑ ΑΛΦΑΒΗΤΟ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΣΤΑΘΕΡΕΣ ΜΕΤΑΒΛΗΤΕΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Διαδικασιακός Προγραμματισμός

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Βασικά στοιχεία της Java

Χρονικές σειρές 1 ο μάθημα: Εισαγωγή στη MATLAB

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

Προγραμματισμός Ι (ΗΥ120)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Ανάπτυξη και Σχεδίαση Λογισμικού

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Σχήµα 6.1: Εισαγωγή της εντολής Read From Spreadsheet File στο Block Diagram.

Συναρτήσεις στη Visual Basic 6.0

ΜΑΗΣ ΕΞΕΤΑΣΤΙΚΟ ΔΟΚΙΜΙΟ

Transcript:

ΕΙΣΑΓΩΓΗ ΣΤΗΝ TCL TK Η Tcl είναι µια µικρή γλώσσα προγραµµατισµού µε σκοπό να ενσωµατωθεί σε άλλα προγράµµατα. Το Tk είναι ένα κουτί εργαλείων συστηµάτων Χ windows που παρέχει τις γραφικές εγκαταστάσεις ενδιάµεσων µε τον χρήστη σχετικά µε Tcl. Και οι δύο εφαρµογές αναπτύχθηκαν από τον John Ousterhout στο πανεπιστήµιο της Καλιφόρνιας στο Μπέρκλευ. Για να τρέξετε µια εφαρµογή TCL πρέπει να εγκαταστήσετε το TCL κέλυφος(tcl shell) στο σύστηµά σας. Για παράδειγµα αν δώσετε την εντολή : expr 2+2 η TCL δίνει το αποτέλεσµα 4. Η παραπάνω εφαρµογή είναι µια από τις πιο απλές εφαρµογές στην TCL. Η πρώτη λέξη σε µια εντολή TCL είναι το όνοµά της εντολής και ακολουθούν τα διάφορα ορίσµατα. Η λέξη expr που χρησιµοποιήσαµε είναι µια από τις εντολές πυρήνα της TCL. Κάθε εντολή TCL επιστρέφει ένα αποτέλεσµα. Στο παραπάνω παράδειγµα την τιµή της έκφρασης. Συνήθως σε κάθε γραµµή γράφουµε µια εντολή αλλά έχουµε τη δυνατότητα σε µια γραµµή να έχουµε περισσότερες από µια εντολές αν τις χωρίσουµε µε " ; ". Εκτός από τις βασικές πράξεις µε την expr έχουµε και άλλες δυνατότητες όπως φαίνεται στα παρακάτω παραδείγµατα : expr 14.1*6 expr (3 > 4) (6 <= 7) Για να φύγετε από το TCL κέλυφος πληκτρολογήστε την εντολή : exit Παρόλο που η TCL παρέχει ένα πλήρες σύνολο από προγραµµατιστικά χαρακτηριστικά όπως µεταβλητές, loops και συναρτήσεις, έχει σκοπό να χρησιµοποιηθεί ως µέρος εφαρµογών και όχι ως µοναδικό προγραµµατιστικό περιβάλλον Το Tk παρέχει ένα ιδιαίτερα ενδιαφέρον σύνολο εντολών που χρησιµοποιούνται µαζί µε τα προγραµµατιστικά εργαλεία της TCL. Για την δηµιουργία Tk εφαρµογών χρησιµοποιούµε µια εφαρµογή που ονοµάζεται wish, η οποία είναι παρόµοια µε το κέλυφος της TCL αλλά περιέχει επιπλέον και τις εντολές που ορίστηκαν για το Tk button.b -text "Hello, world!" -command exit pack.b Για παράδειγµα αν πληκτρολογήσουµε τις παραπάνω εντολές θα δηµιουργηθεί ένα κουµπί (button) το οποίο γράφει "Hello, world!" και όταν το πατήσουµε ενεργοποιείται η εντολή exit και φεύγουµε από την εφαρµογή. Οι λέξεις button, pack είναι εντολές Tk. Οι εντολές TCL και Tk έχουν ακριβώς την ίδια δοµή. Η εντολή pack είναι υπεύθυνη για την εµφάνιση του button µε το όνοµα.b σε αυτή την περίπτωση.

ΣΥΝΤΑΞΗ ΤΗΣ ΓΛΩΣΣΑΣ TCL Η σύνταξη της Tcl αποτελείται περίπου από µερικούς κανόνες που καθορίζουν πώς αναλύονται οι εντολές. Η σύνταξη της Tcl είναι η ίδια για κάθε εντολή. Ένα πρόγραµµα Tcl αποτελείται από µια ή περισσότερες εντολές. Οι εντολές χωρίζονται από τις αλλαγές γραµµής ή τα ελληνικά ερωτηµατικά. Παραδείγµατος χάριν ο παρακάτω κώδικας : set a 24 set b 15 είναι ένα πρόγραµµα µε δύο εντολές που χωρίζονται από έναν χαρακτήρα αλλαγής γραµµής. Το ίδιο πρόγραµµα θα µπορούσε να γραφτεί σε µια γραµµή χρησιµοποιώντας για διαχωριστή το ελληνικό ερωτηµατικό set a 24; set b 15 Κάθε εντολή αποτελείται από µια ή περισσότερες λέξεις, όπου η πρώτη λέξη είναι το όνοµα µιας εντολής και οι πρόσθετες λέξεις είναι ορίσµατα της εντολής. Οι λέξεις χωρίζονται από τα κενά διαστήµατα. Κάθε µία από τις εντολές στα παραπάνω παραδείγµατα έχει τρεις λέξεις. Μπορεί να υπάρχει οποιοσδήποτε αριθµός λέξεων σε µια εντολή. ΜΕΤΑΒΛΗΤΕΣ Η TCL επιτρέπει την αποθήκευση τιµών σε µεταβλητές και τη χρήση τους στις διάφορες εντολές. Για παράδειγµα η εντολή: set a 44 δίνει στην µεταβλητή a την τιµή 44 και µε τη βοήθεια της expr δίνοντας την εντολή: expr $a*4 παίρνουµε το αποτέλεσµα 176 Παρατηρούµε ότι για να αποδοθεί στη µεταβλητή a η τιµή της κατά τον υπολογισµό µιας έκφρασης που την περιέχει χρησιµοποιούµε µπροστά από αυτην το σύµβολο $. H TCL επίσης επιτρέπει σε µια µεταβλητή να πάρει την τιµή µιας έκφρασης όπως φαίνεται στο παρακάτω παράδειγµα. set a 44 set b [expr $a*4] Η µεταβλητή b παίρνει την τιµή της έκφρασης expr $a*4 και ισούται µε 176. Μια απλή µεταβλητή της Tcl αποτελείται από δύο µέρη: ένα όνοµα και µια τιµή. Τόσο το όνοµα όσο και η τιµή µπορούν να είναι αυθαίρετα string. Παραδείγµατος χάριν, είναι δυνατό να ονοµαστεί µια µεταβλητή xyz!#22.στην πράξη τα ονόµατα µεταβλητών αρχίζουν συνήθως µε ένα γράµµα και αποτελούνται από έναν συνδυασµό γραµµάτων, ψηφίων, και χαρακτήρων. Οι µεταβλητές µπορούν να δηµιουργηθούν, να διαβαστούν, και να τροποποιηθούν µε καθορισµένη εντολή, η οποία παίρνει ένα ή δύο ορίσµατα. Το πρώτο όρισµα είναι το όνοµα της µεταβλητής και το δεύτερο, εάν υπάρχει, είναι µια νέα τιµή για τη µεταβλητή: set a {Eggs: $2.18/dozen Eggs: $2.18/dozen set a 44 44 Η πρώτη εντολή δηµιουργεί µια νέα µεταβλητή a και την θέτει ίση µε Eggs: $2.18/dozen. Το αποτέλεσµα της εντολής είναι η τιµή της µεταβλητής. Η δεύτερη εντολή έχει ένα όρισµα a. Με αυτήν την µορφή επιστρέφει απλά την τρέχουσα τιµή της µεταβλητής. Η τρίτη εντολή αλλάζει την τιµή του a σε 44 και επιστρέφει την νέα τιµή. Οι µεταβλητές της Tcl

µπορούν να χρησιµοποιηθούν για να αντιπροσωπεύσουν πολλά πράγµατα, όπως ακέραιους αριθµούς, αριθµούς κινητής υποδιαστολής, ονόµατα,κατάλογους, τα οποία αποθηκεύονται πάντα ως string. Αυτή η χρήση µιας ενιαίας αντιπροσώπευσης για όλες τις τιµές επιτρέπει στις διαφορετικές τιµές να χειρίζονται µε τον ίδιο τρόπο και να επικοινωνούν εύκολα. Οι µεταβλητές της Tcl δηµιουργούνται αυτόµατα όταν ορίζονται οι τιµές τους. εν υπάρχουν τύποι µεταβλητών οπότε δε χρειάζεται να ορίζονται πρώτα όπως συµβαίνει σε άλλες διαδικαστικές γλώσσες. Η εντολή UNSET Η εντολή unset καταστρέφει τις µεταβλητές. Παίρνει οποιοδήποτε αριθµό ορισµάτων, κάθε ένα από τα οποία είναι µια µεταβλητή, και έχει ως αποτέλεσµα να αφαιρούνται όλες οι µεταβλητές που ακολουθούν την εντολή unset. Οποιαδήποτε προσπάθεια διαβάσµατος κάποιας από τις κατεστραµένες µεταβλητές θα είναι αποτυχηµένη. Τα ορίσµατα της unset µπορούν να είναι είτε απλές µεταβλητές, είτε στοιχεία πίνακα, είτε ολόκληροι πίνακες, όπως στο ακόλουθο παράδειγµα: unset a earnings(january) b Σε αυτήν την περίπτωση οι µεταβλητές a και b αφαιρούνται εξ ολοκλήρου όπως και το στοιχείο January του πίνακα earnings. Ο πίνακας earnings συνεχίζει να υπάρχει µετά από την εντολή unset. Εάν τα a ή b είναι ένας πίνακας όλα τα στοιχεία του πίνακα αφαιρούνται και φυσικά και ο πίνακας. Η εντολή RENAME Με την εντολή rename µπορούµε να αλλαξουµε το όνοµα µια µεταβλητης,όπως φαίνεται στο παρακάτω παράδειγµα: set x 44 44 rename x a Έτσι µετονοµάζουµε τη µεταβλητή x σε a. Αν στην εντολή rename δεν δώσουµε δεύτερο όρισµα τότε διαγράφουµε τη µεταβλητή που είναι ως πρώτο όρισµα. rename x Έτσι διαγράφεται η µεταβλητή x. ΑΝΤΙΚΑΤΑΣΤΑΣΗ Η Tcl παρέχει τρεις µορφές αντικατάστασης: αντικατάσταση µεταβλητής, αντικατάσταση εντολής και backslash αντικατάσταση. Κάθε αντικατάσταση αναγκάζει µερικούς από τους αρχικούς χαρακτήρες µιας λέξης να αντικατασταθούν µε κάποια άλλη τιµή. Οι αντικαταστάσεις µπορούν να εµφανιστούν σε οποιαδήποτε λέξη µιας εντολής, συµπεριλαµβανοµένου του ονόµατος εντολής και µπορεί να υπάρξει οποιοσδήποτε αριθµός αντικαταστάσεων µέσα σε µια µεµονωµένη λέξη. Η πρώτη µορφή αντικατάστασης είναι η αντικατάσταση µεταβλητής. Προκαλείται από έναν χαρακτήρα δολάριο $ και δίνει τη δυνατότητα σε µια µεταβλητή να χρησιµοποιηθεί σε µια παράσταση. Παραδείγµατος χάριν, εξετάστε τις ακόλουθες εντολές : set kgrams 20

expr $kgrams*2.2046 Η πρώτη εντολή θέτει την αξία των µεταβλητών kgrams σε 20. Η δεύτερη εντολή υπολογίζει το αντίστοιχο βάρος σε λίµπρες µε τον πολλαπλασιασµό της αξίας των kgrams µε 2.2046. Αυτό γίνεται χρησιµοποιώντας την αντικατάσταση µεταβλητής. Η έκφραση $kgrams αντικαθίσταται µε την τιµή της µεταβλητής kgrams, έτσι ώστε το λαµβανόµενο από τη διαδικασία όρισµα της εντολής expr είναι 20*2.2046. Η αντικατάσταση µεταβλητής µπορεί να εµφανιστεί οπουδήποτε µέσα σε µια εντολή όπως φαίνεται στην ακόλουθη εντολή : set result 20;set base 40 expr $result*$base Η δεύτερη µορφή αντικατάστασης παρεχόµενη από την Tcl είναι η αντικατάσταση εντολής. Η αντικατάσταση εντολής αναγκάζει ένα µέρος ή όλη την εντολή να αντικατασταθεί µε το αποτέλεσµα µιας άλλης εντολής Tcl. Η αντικατάσταση εντολής πραγµατοποιείται όπως φαίνεται στο παρακάτω παράδειγµα: set kgrams 20 set lbs [expr $kgrams*2.2046] Εδώ η εντολή expr εκτελείται δίνοντας αποτέλεσµα 44.092, το οποίο είναι η τιµή που θέτουµε στην µεταβλητή lbs. Η τελευταία µορφή αντικατάστασης στην Tcl είναι η backslash αντικατάσταση. Χρησιµοποιείται για να παρεµβάλει ειδικούς χαρακτήρες όπως οι αλλαγές γραµµής στις λέξεις και επίσης για να παρεµβάλει τους χαρακτήρες όπως [ και το $ χωρίς αυτά να αντιµετωπίζονται ως χαρακτήρες κλειδιά από την Tcl. Παραδείγµατος χάριν, εξετάστε την ακόλουθη εντολή : set msg Eggs:\$2.18/dozen\nGasoline:\$1.49/gallon Eggs:$2.18/dozen Gasoline:$1.49/gallon Υπάρχουν δύο backslash ακολουθούµενες από το $ µε αποτέλεσµα οι χαρακτήρες δολαρίων να αντιµετωπίζονται όπως τους συνηθισµένους χαρακτήρες (δεν προκαλούν την αντικατάσταση µεταβλητής). Η backslash ακολουθούµενη από το n αντικαθίσταται µε έναν χαρακτήρα αλλαγής γραµµής. Ο παρακάτω πίνακας απαριθµεί τις σηµαντικότερες ακολουθίες backslash που υποστηρίζονται από την Tcl : Ακολουθία backslash Αντικαθίσταται µε \n νέα γραµµή \t Tab \space κενός χαρακτήρας \a ηχητικό µήνυµα \b backspace \v κάθετο Tab

Αντικατάσταση Μεταβλητών Προηγούµενα εισάγαµε τη χρήση του χαρακτήρα $ για την αντικατάσταση των µεταβλητών από τις τιµές τους. Αυτό το τµήµα περιγράφει το µηχανισµό λεπτοµερέστερα. Η αντικατάσταση µεταβλητής προκαλείται από την παρουσία ενός χαρακτήρα $ σε µια εντολή Tcl. Οι χαρακτήρες µετά από το δολάριο $ θεωρούνται ως µεταβλητό όνοµα, και αντικαθίστανται από την τιµή της µεταβλητής. Η Tcl παρέχει τρεις µορφές αντικατάστασης µεταβλητής. Μέχρι τώρα έχετε δει µόνο την απλούστερη µορφή, η οποία χρησιµοποιείται όπως φαίνεται παρακάτω : set a 2 expr $a+2 Με αυτήν την µορφή το δολάριο $ ακολουθείται από ένα όνοµα µεταβλητής. Η δεύτερη µορφή αντικατάστασης µεταβλητής επιτρέπει στα στοιχεία πίνακα να αντικατασταθούν από την τιµή τους. Αυτή η µορφή είναι όπως την πρώτη εκτός από το ότι το µεταβλητό όνοµα ακολουθείται αµέσως από ένα όνοµα στοιχείου εσωκλειόµενο σε παρένθεση. Παραδείγµατος χάριν, εξετάστε τις ακόλουθες εντολές : set esoda(january) 100 set esoda(february) 200 set Total [expr $esoda(january)+$esoda(february) Έχουµε τον πίνακα µε το όνοµα esoda και δύο τιµές του. Χρησιµοποιούµε το $ για να πάρουµε τις τιµές των δύο στοιχείων του πίνακα. Η τελευταία µορφή αντικατάστασης χρησιµοποιείται για απλές µεταβλητές όπου το όνοµα της µεταβλητής ακολουθείται από ένα γράµµα ή αριθµό ή underscore. Παραδείγµατος χάριν, υποθέστε ότι επιθυµείτε να περάσετε µια τιµή όπως 100m (όπου µε το m δηλώνουµε τα millimeters) σε µια εντολή ως όρισµα. Εάν προσπαθείτε να αντικαταστήσετε τη µεταβλητή τιµή µε µια µορφή όπως $sizem η Tcl θα µεταχειριστεί το m ως τµήµα του µεταβλητού ονόµατος. Για να ξεπεράσετε αυτό το πρόβληµα µπορείτε να εσωκλείσετε το µεταβλητό όνοµα σε αγκύλες όπως στις ακόλουθες εντολές : set size 100 button.a -width ${sizem pack.a Με τις παραπάνω εντολές µπορούµε να καθορίσουµε το πλάτος του παραθύρου που δηµιουργούµε σε millimeters. Ο µηχανισµός αντικατάστασης µεταβλητών της Tcl προορίζεται για να χειριστεί τις πιό απλές καταστάσεις.υπάρχουν περιπτώσεις όπου καµία από τις ανωτέρω µορφές αντικατάστασης δεν επιτυγχάνει την επιθυµητή επίδραση. Οι πιο περίπλοκες καταστάσεις µπορούν να αντιµετωπιστούν µε µια ακολουθία εντολών. ΣΧΟΛΙΑ Εάν ο πρώτος µη-κενός χαρακτήρας µιας εντολής είναι ο χαρακτήρας # όλοι οι χαρακτήρες που ακολουθούν µέχρι την αρχή της επόµενης εντολής θεωρούνται ως σχόλια και απορρίπτονται. Σηµειώστε ότι ο χαρακτήρας # πρέπει να εµφανιστεί σε µια θέση όπου η Tcl

αναµένει τον πρώτο χαρακτήρα µιας εντολής. Εάν ο χαρακτήρας # εµφανίζεται οπουδήποτε αλλού αντιµετωπίζεται ως συνηθισµένος χαρακτήρας που αποτελεί µέρος µιας έκφρασης : # This is a comment set b 101; # This is a comment Ο τελευταίος χαρακτήρας # αντιµετωπίζεται ως χαρακτήρας σχολίου, δεδοµένου ότι εµφανίζεται αµέσως αφότου ολοκληρωθεί µία εντολή µε ελληνικό ερωτηµατικό. ΠΙΝΑΚΕΣ Εκτός από τις απλές µεταβλητές η Tcl παρέχει επίσης τους πίνακες. Ένας πίνακας είναι µια συλλογή στοιχείων, κάθε ένα από τα οποία είναι µια µεταβλητή µε το όνοµά της και την τιµή της. Το όνοµα ενός στοιχείου πίνακα έχει δύο µέρη : το όνοµα του πίνακα και το όνοµα του στοιχείου. Τα στοιχεία πίνακα αναφέρονται για παράδειγµα µε τη µορφή esoda(january) όπου το όνοµα του πίνακα είναι το esoda και ακολουθείται από το όνοµα του στοιχείου σε παρένθεση (January).Οι πίνακες µπορούν να χρησιµοποιηθούν οπουδήποτε όπως και οι απλές µεταβλητές. Για παράδειγµα : set esoda(january) 100000 100000 set esoda(february) 150000 150000 set esoda(january) 100000 Η πρώτη εντολή δηµιουργεί έναν πίνακα που ονοµάζεται esoda, εάν αυτός δεν υπάρχει ήδη. Κατόπιν δηµιουργεί ένα στοιχείο January µέσα στον πίνακα και του ορίζει την τιµή 87966. Η δεύτερη εντολή ορίζει µια τιµή στο στοιχείο February του πίνακα και η τρίτη εντολή επιστρέφει την τιµή του στοιχείου January. Πολυδιάστατοι Πίνακες Η Tcl υποστηρίζει µόνο µονοδιάστατους πίνακες, αλλά οι πολυδιάστατοι πίνακες µπορούν να προσοµοιωθούν µε τη σύνδεση πολλαπλών δεικτών σε ένα µοναδικό στοιχείο. Το παρακάτω πρόγραµµα προσοµοιώνει ένα δισδιάστατο πίνακα : set pinakas(1,1) 100 set pinakas(1,2) 200 set pinakas(1,3) 300 set i 1 set j 2 set stoixeio $pinakas($i,$j) Ο pinakas είναι ένας πίνακας µε τρία στοιχεία των οποίων τα ονόµατα είναι "1,1", "1,2" και "1,3". Ο πίνακας συµπεριφέρεται ακριβώς σαν να ήταν ένας δισδιάστατος πίνακας. Ειδικότερα, η αντικατάσταση µεταβλητής πραγµατοποιείται έτσι ώστε οι τιµές του i και του j να συνδυάζονται δίνοντας αυτός ο συνδυασµός ένα στοιχείο κάθε φορά.

ιαχείριση Πίνακα Η εντολή array παρέχει πληροφορίες για τα στοιχεία που έχουν οριστεί σε έναν πίνακα. Οι πληροφορίες παρέχονται µε διάφορους τρόπους, ανάλογα µε το πρώτο όρισµα που παίρνουµε στην εντολή. Η εντολή array size επιστρέφει έναν αριθµό που προσδιορίζει πόσα στοιχεία υπάρχουν σε έναν πίνακα ενώ η εντολή array names επιστρέφει έναν κατάλογο µε τα ονόµατα των στοιχείων ενός πίνακα : set nomisma(france) franc set nomisma(greatbritain) pound set nomisma(germany) mark array size nomisma 3 array names nomisma GreatBritain Germany France Για κάθε µια από αυτές τις εντολές το τελικό όρισµα πρέπει να είναι το όνοµα του πίνακα που µας ενδιαφέρει. ΕΚΦΡΑΣΕΙΣ Οι εκφράσεις συνδυάζουν τις τιµές µε τους τελεστές για να παράγουν νέες τιµές. Παραδείγµατος χάριν, η έκφραση 4+2 περιέχει δύο τελεστέους, 4 και 2, και ένα τελεστή +. Πολλές εντολές της Tcl αναµένουν ένα ή περισσότερα από τα ορίσµατά τους να είναι εκφράσεις. Η απλούστερη εντολή είναι η expr, η οποία υπολογίζει το αποτέλεσµα της πράξης που ορίζουν τα ορίσµατά της. Για παράδειγµα : expr {(2+4) * 3.6 Ένα άλλο παράδειγµα είναι η εντολή if, η οποία αφού αξιολογεί το πρώτο της όρισµα χρησιµοποιεί το αποτέλεσµα για να αποφασίσει αν πρέπει να πραγµατοποιηθεί το δεύτερο όρισµά της : if $x<2 then {set x 2 ΟΙ ΕΝΤΟΛΕΣ INCR ΚΑΙ APPEND Οι εντολές incr και append παρέχουν απλούς τρόπους αλλαγής της τιµής µιας µεταβλητής. Η incr παίρνει δύο ορίσµατα, τα οποία είναι το όνοµα µιας µεταβλητής και ένας ακέραιος αριθµός, ο οποίος προστίθεται στην τιµή της µεταβλητής. Για παράδειγµα : set x 4 incr x 2 Ο αριθµός µπορεί να έχει είτε θετική είτε αρνητική τιµή. Μπορεί επίσης να παραλειφθεί, οπότε σε αυτή την περίπτωση θεωρείται ο αριθµός 1 : set x 4 incr x Η αρχική τιµή της µεταβλητής και ο αριθµός που προστίθεται πρέπει να είναι ακέραιοι αριθµοί σε δεκαδικό, οκταδικό ή δεκαεξαδικό σύστηµα.

Η εντολή append προσθέτει κάποιο κείµενο στο τέλος µιας µεταβλητής. Παίρνει δύο ορίσµατα, τα οποία είναι το όνοµα της µεταβλητής και το νέο κείµενο που θα προστεθεί. Επισυνάπτει το νέο κείµενο στη µεταβλητή και επιστρέφει τη νέα τιµή της µεταβλητής. set x hello append x Kavala ΤΕΛΕΣΤΕΣ ΚΑΙ ΠΡΟΤΕΡΑΙΟΤΗΤΑ Η παρακάτω λίστα απαριθµεί όλους τους τελεστές που υποστηρίζονται στις εκφράσεις της Tcl. -a Αντίθετος του a!a Λογικό NOT: 1 αν το a είναι µηδέν, 0 σε άλλη περίπτωση ~a Συµπλήρωµα του a a*b a/b Πολλαπλασιασµός a και b ιαίρεση a µε b a%b Ακέραιο υπόλοιπο κατά τη διαίρεση a µε b a+b a-b Πρόσθεση a και b Αφαίρεση του b από το a a<<b Κύλιση του αριθµού a κατά b bits προς τα αριστερά a>>b Κύλιση του αριθµού a κατά b bits προς τα δεξιά a<b 1 αν a µικρότερο του b, αλλιώς 0 a>b 1 αν a µεγαλύτερο του b, αλλιώς 0 a<=b 1 αν a µικρότερο ή ίσο του b, αλλιώς 0 a>=b 1 αν a µεγαλύτερο ή ίσο του b, αλλιώς 0 a==b 1 αν a ίσο του b, αλλιώς 0 a!=b 1 αν a διάφορο του b, αλλιώς 0 a&b Παράγει µια τιµή της οποίας κάθε δυαδικό ψηφίο είναι 1 αν και τα δύο αντίστοιχα δυαδικά ψηφία των δύο τελεστέων είναι 1

a^b Αποκλειστικό or. Παράγει µια τιµή της οποίας κάθε δυαδικό ψηφίο είναι 1, µόνο αν το ένα ή το άλλο από τα αντίστοιχα δυαδικά ψηφία των δύο τελεστέων είναι 1 a b OR. Παράγει µια τιµή της οποίας κάθε δυαδικό ψηφίο είναι 1, αν ένα ή και τα δύο αντίστοιχα δυαδικά ψηφία των δύο τελεστέων είναι 1 a&&b Λογικό AND : 1 αν τα a και b διάφορα του 0, αλλιώς 0 a b Λογικό OR : 1 αν το a ή το b διάφορο του 0, αλλιώς 0 a?b:c Επιλογή : αν a διάφορο του 0 τότε b, αλλιώς c Οι τελεστές µε την υψηλότερη προτεραιότητα εµφανίζονται στο πάνω τµήµα της λίστας και όσο προχωράµε έχουν και µικρότερη προτεραιότητα, τα κενά κελιά στον πίνακα χωρίζουν τις οµάδες τελεστών των διαφόρων προτεραιοτήτων. Παραδείγµατος χάριν, η έκφραση 4*2<7 ισούται µε 0 επειδή ο τελεστής * έχει υψηλότερη προτεραιότητα από τον τελεστή <. Χρησιµοποιώντας παρενθέσεις µπορούµε να ορίσουµε εµείς την προτεραιότητα µε την οποία θα πραγµατοποιηθούν οι πράξεις σε µια έκφραση. Οι τελεστές µε την ίδια προτεραιότητα εκτελούνται από αριστερά προς τα δεξιά. Παραδείγµατος χάριν, 10-4+3 είναι το ίδιο όπως (10-4)+3. ΜΑΘΗΜΑΤΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ Οι εκφράσεις Tcl υποστηρίζουν διάφορες µαθηµατικές συναρτήσεις, όπως οι sin και exp. Οι µαθηµατικές συναρτήσεις εκτελούνται ως εξής : expr {2*sin($x) expr {hypot($x, $y) + $z Στον παρακάτω πίνακα φαίνονται οι µαθηµατικές συναρτήσεις που υποστηρίζονται από την TCL : Συνάρτηση Αποτέλεσµα abs(x) Απόλυτη τιµή του x. acos(x) Τόξο του συνx στο διάστηµα 0 έως π. asin(x) Τόξο του ηµx στο διάστηµα -π/2 έως π /2. atan(x) Τόξο της εφx στο διάστηµα -π/2 έως π /2. atan2(x,y) Τόξο της εφ(x/y) στο διάστηµα -π/2 έως π /2. ceil(x) Ο µικρότερος ακέραιος που είναι µεγαλύτερος από το x. cos(x) Συνηµίτονο του x.

cosh(x) Yπερβολικό συνx. double(i) Μετατροπή σε πραγµατικό αριθµό του ακεραίου i. exp(x) e εις την x. floor(x) Ο µεγαλύτερος ακέραιος που είναι µικρότερος από το x. fmod(x,y) Υπόλοιπο της διαίρεσης x/y. hypot(x,y) Τετραγωνική ρίζα του (x2 + y2 ). int(x) Μετατροπή του x σε ακέραιο. log(x) Φυσικός λογάριθµος του x. log10(x) Λογάριθµος του x µε βάση το 10. pow(x,y) Η δύναµη x εις την y. round(x) Η ακέραια τιµή του x που προκύπτει από στρογγυλοποίηση. sin(x) Ηµίτονο του x. sinh(x) Υπερβολικό ηµx. sqrt(x) Τετραγωνική ρίζα του x. tan(x) Εφαπτοµένη του x. tanh(x) Υπερβολική εφx. ΑΚΡΙΒΕΙΑ Κατά τη διάρκεια της αξιολόγησης µιας έκφρασης η Tcl αντιπροσωπεύει τους ακέραιους αριθµούς εσωτερικά µε τον τύπο int της C, ο οποίος παρέχει τουλάχιστον 32 bit ακρίβειας στις περισσότερες µηχανές. Οι πραγµατικοί αριθµοί αντιστοιχούν µε τους double της C, που συνήθως αναπαρίστανται από 64 bit τιµές χρησιµοποιώντας τα ieee πρότυπα κινητής υποδιαστολής. Οι αριθµοί µετατρέπονται σε string µόνο όταν είναι απαραίτητο όπως για παράδειγµα όταν χρησιµοποιούνται σε µια εντολή expr. Όταν µια πραγµατική τιµή µετατρέπεται σε string µόνο τα δώδεκα πιο σηµαντικά ψηφία διατηρούνται εξ ορισµού : expr {1.11111111111111111111 + 1.111111111111111111111 Εάν θα επιθυµούσατε περισσότερα ψηφία να εµφανίζονται µπορείτε να χρησιµοποιήσετε την εντολή tcl_precision ως γενική µεταβλητή µε τον επιθυµητό αριθµό σηµαντικών ψηφίων : set tcl_precision 15 expr {1.111111111111111111111 + 1.1111111111111111111111 Η µεταβλητή tcl_precision χρησιµοποιείται όχι µόνο για την εντολή expr αλλά οπουδήποτε σε µια εφαρµογή Tcl όπου ένας πραγµατικός αριθµός µετατρέπεται σε string.

ΚΑΝΟΝΙΚΕΣ ΚΑΙ ΕΚΤΑΚΤΕΣ ΕΠΙΣΤΡΟΦΕΣ ΣΤΗΝ TCL Μια εντολή Tcl µπορεί να ολοκληρωθεί µε διάφορους τρόπους. Μια κανονική επιστροφή που είναι η πιο συνηθισµένη περίπτωση σηµαίνει ότι η εντολή ολοκληρώνεται επιτυχώς και η επιστροφή περιλαµβάνει το αποτέλεσµα της εφαρµογής που εκτελέσαµε. Η Tcl υποστηρίζει επίσης τις έκτακτες επιστροφές από τις εντολές. Η συχνότερη µορφή έκτακτης επιστροφής είναι ένα λάθος. Όταν µια επιστροφή λάθους εµφανίζεται, σηµαίνει ότι η εντολή δεν µπορούσε να ολοκληρώσει την προοριζόµενη λειτουργία της. Η εντολή αποβάλλεται και οποιεσδήποτε εντολές που ακολουθούν στον κώδικα αγνοούνται. Μια επιστροφή λάθους περιλαµβάνει ένα string προσδιορίζοντας το λάθος στην εφαρµογή. Παραδείγµατος χάριν, η ακόλουθη καθορισµένη εντολή παράγει ένα λάθος επειδή έχει πάρα πολλά ορίσµατα : set state Kavala Drama wrong # args: should be "set varname?newvalue?" Στην παραπάνω περίπτωση είναι απαραίτητα τα διπλά εισαγωγικά, αφού η τιµή της µεταβλητής αποτελείται από περισσότερες από µία λέξεις. Το µήνυµα λάθους δεν είναι πάντοτε το ίδιο, αλλά διαφέρει από λάθος σε λάθος. Παραδείγµατος χάριν, η εντολή expr δέχεται οποιοδήποτε αριθµό ορισµάτων αλλά απαιτεί µια ιδιαίτερη σύνταξη διαφορετικά παράγει λάθος, όπως για παράδειγµα αν δεν κλείσει η παρένθεση : expr 3 * (20+4 syntax error in expression "3 * (20+4" ΑΡΙΘΜΗΤΙΚΟΙ ΤΕΛΕΣΤΑΙΟΙ Οι τελεσταίοι έκφρασης είναι ακέραιοι αριθµοί ή πραγµατικοί αριθµοί. Οι ακέραιοι αριθµοί ορίζονται συνήθως στο δεκαδικό σύστηµα, αλλά εάν ο πρώτος χαρακτήρας είναι 0 (µηδέν) ο αριθµός διαβάζεται στο οκταδικό σύστηµα (η βάση 8) και εάν οι πρώτοι δύο χαρακτήρες είναι 0x, ο αριθµός διαβάζεται σε δεκαεξαδικό (βάση 16). Παραδείγµατος χάριν, ο 335 είναι ένας δεκαδικός αριθµός, ο 0517 είναι ένας οκταδικός αριθµός µε την ίδια αξία, και ο 0x14f είναι ένας δεκαεξαδικός αριθµός µε την ίδια αξία. Οι πραγµατικοί τελεσταίοι µπορούν να οριστούν όπως και στην Ansi C, συµπεριλαµβανοµένων και των ακόλουθων παραδειγµάτων : 2.1 7.91e+16 6E4 3. ΠΡΟΣΒΑΣΗ ΣΕ ΑΡΧΕΙΑ Αυτό το κεφάλαιο περιγράφει τις εντολές της Tcl που αφορούν στα αρχεία. Οι εντολές σας επιτρέπουν να διαβάσετε ή να γράψετε αρχεία κατά σειρά ή µε ένα τυχαίο τρόπο. Επίσης σας επιτρέπουν να ανακτήσετε πληροφορίες για τα αρχεία που κρατούνται από το σύστηµα, όπως η ώρα της τελευταίας πρόσβασης. Τέλος µπορούν να χρησιµοποιηθούν για τον χειρισµό των ονοµάτων των αρχείων. Για παράδειγµα µπορείτε να αφαιρέσετε την επέκταση ενός ονόµατος αρχείου ή να βρείτε τα ονόµατα όλων των αρχείων που ταιριάζουν µε ένα συγκεκριµένο δείγµα. Ονόµατα Αρχείων Τα ονόµατα των αρχείων καθορίζονται στην Tcl χρησιµοποιώντας την απλή σύνταξη του UNIX. Για παράδειγµα το όνοµα αρχείου x/y/z αναφέρεται σε αρχείο που ονοµάζεται z, που είναι τοποθετηµένο σε ένα κατάλογο που ονοµάζεται y, ο οποίος µε τη σειρά του είναι

τοποθετηµένος σε ένα κατάλογο που ονοµάζεται x, και ο οποίος πρέπει να είναι στον τρέχοντα κατάλογο στον οποίο δουλεύουµε. Το όνοµα αρχείου /top αναφέρεται σε ένα αρχείο top στον αρχικό κατάλογο. Επίσης µπορείτε να χρησιµοποιήσετε το σύµβολο ~ για να καθορίσετε ένα όνοµα αρχείου σχετικό µε ένα συγκεκριµένο κατάλογο του χρήστη. Για παράδειγµα το όνοµα ~ouster/mbox αναφέρεται σε ένα αρχείο µε τον όνοµα mbox στον κατάλογο του χρήστη ouster και το όνοµα ~/mbox αναφέρεται σε ένα αρχείο που ονοµάζεται mbox στον κατάλογο του χρήστη που τρέχει στο Tcl script. Αυτοί οι κανόνες αντιστοιχούν σε όλες τις εντολές της Tcl που παίρνουν ονόµατα αρχείων ως ορίσµατα. Βασικό Αρχείο I/O Οι εντολές Tcl για τα αρχεία I/O είναι παρόµοιες µε τις διαδικασίες της τυπικής βιβλιοθήκης Ι/Ο της C, και στα ονόµατα και στην συµπεριφορά. Παρακάτω φαίνεται ένα script που καλείται tgrep που παρουσιάζει τα περισσότερα από τα βασικά χαρακτηριστικά του αρχείου Ι/Ο : #!/usr/local/bin/tclsh if {$argc!= 2 { else { error "Usage: tgrep pattern filename" set f [open [lindex $argv 1] r] set pat [lindex $argv 0] while {[gets $f line] >= 0 { close $f if [regexp $pat $line] {puts stdout $line Αυτό το script συµπεριφέρεται πολύ σαν το πρόγραµµα grep του UNIX: µπορείτε να το καλέσετε από το κελί σας µε δυο ορίσµατα, ένα δείγµα κανονικής έκφρασης και ένα όνοµα αρχείου, και θα τυπώσει όλες τις σειρές του αρχείου που ταιριάζουν µε το δείγµα. Όταν εκτελείται η tclsh εξετάζει το script και κάνει τα ορίσµατα γραµµής εντολών διαθέσιµα σαν ένα κατάλογο στην µεταβλητή argv, µαζί µε το µήκος αυτού του καταλόγου στην µεταβλητή argc. Αφού σιγουρευτεί ότι έλαβε αρκετά ορίσµατα το script καλεί την εντολή open. Η open παίρνει δυο ορίσµατα, το όνοµα του αρχείου και την µέθοδο πρόσβασης. Η µέθοδος πρόσβασης παρέχει πληροφορίες όπως για το αν θα διαβάζεται το αρχείο ή θα γράφεται, και αν θα θέλετε να ενσωµατώσετε το αρχείο ή να το προσπελάσετε από την αρχή. Η µέθοδος πρόσβασης µπορεί να έχει µια από τις παρακάτω τιµές : r Άνοιγµα µόνο για διάβασµα. Το αρχείο πρέπει να υπάρχει ήδη. Αυτή είναι η προεπιλογή σε περίπτωση που δεν καθορίζεται η µέθοδος πρόσβασης. r+ Άνοιγµα για διάβασµα και εγγραφή. Το αρχείο πρέπει να υπάρχει ήδη. w Άνοιγµα µόνο για εγγραφή. Μετατρέπει το αρχείο να υπάρχει ήδη, αλλιώς δηµιουργεί ένα νέο άδειο αρχείο. w+ Άνοιγµα για διάβασµα και εγγραφή. Μετατρέπει το αρχείο να υπάρχει ήδη αλλιώς δηµιουργεί ένα νέο άδειο αρχείο. a Άνοιγµα για εγγραφή µόνο και τοποθέτηση της αρχικής θέσης πρόσβασης στο τέλος του αρχείου. Αν το αρχείο δεν υπάρχει τότε δηµιουργεί ένα νέο άδειο αρχείο.

a+ Άνοιγµα του αρχείου για διάβασµα και εγγραφή και τοποθέτηση της αρχικής θέσης πρόσβασης στο τέλος του αρχείου. Αν το αρχείο δεν υπάρχει τότε δηµιουργεί ένα νέο άδειο αρχείο. Η εντολή open επιστρέφει ένα string όπως για παράδειγµα file3 αναγνωρίζει το ανοιγµένο αρχείο. Αυτός ο αναγνωριστής χρησιµοποιείτε όταν καλούνται άλλες εντολές για να χειριστεί το άνοιγµα του φακέλου, όπως η gets, η puts και η close. Υπάρχουν τρεις αναγνωριστές αρχείων ο stdin, ο stdout και ο stderrror οι οποίοι αναφέρονται στα τυπικά κανάλια εισόδου, εξόδου και λάθους για την διαδικασία στην οποία εκτελείται το Tcl script. Μετά το άνοιγµα του αρχείου στο οποίο γίνεται το ψάξιµο, το tgrep script διαβάζει µια σειρά του αρχείου την φορά µε την εντολή gets. Η gets παίρνει κανονικά δυο ορίσµατα έναν αναγνωριστή αρχείων και το όνοµα µιας µεταβλητής. ιαβάζει την επόµενη γραµµή του ανοιγµένου αρχείου, αποθηκεύει την γραµµή στην ονοµασµένη µεταβλητή και επιστρέφει το σύνολο του αριθµού των χαρακτήρων που αποθηκεύτηκαν στην µεταβλητή. Αν το τέλος του αρχείου φτάσει πριν διαβαστούν χαρακτήρες τότε η gets αποθηκεύει ένα άδειο string στην µεταβλητή και επιστρέφει -1. Για κάθε γραµµή του αρχείου το tgrep script αντιστοιχίζει την γραµµή του δείγµατος και την τυπώνει µε την puts αν ταιριάζουν. Η εντολή puts παίρνει δυο ορίσµατα, που είναι ένας αναγνωριστής αρχείου και ένα string για να τυπωθεί. Η puts προσθέτει έναν χαρακτήρα αλλαγής γραµµής στο τέλος του string και εξάγει την σειρά στο δοσµένο αρχείο. Το script χρησιµοποιεί τον αναγνωριστή stdout έτσι ώστε η σειρά να τυπωθεί σαν τυπική έξοδος. Όταν η tgrep φτάσει στο τέλος του αρχείου τότε η gets επιστρέφει -1, και έτσι τελειώνει ο βρόχος while. Το script στη συνέχεια κλείνει το αρχείο µε την εντολή close, πράγµα που απελευθερώνει τους πόρους που σχετίζονταν µε το ανοιγµένο αρχείο. Στα περισσότερα συστήµατα υπάρχει ένα όριο στο ποσά αρχεία µπορούν να είναι ανοιγµένα την ίδια στιγµή από µια εφαρµογή, όποτε είναι σηµαντικό να κλείνετε τα αρχεία αµέσως µόλις τελειώσετε το διάβασµα ή την εγγραφή σε αυτά. Στο παραπάνω παράδειγµα η εντολή close είναι περιττή διότι το αρχείο θα κλείσει αυτόµατα από τη στιγµή που θα τελειώσει η εφαρµογή. Ο Τρέχων Κατάλογος Εργασίας Η Tcl παρέχει δυο εντολές που βοηθούν στη διαχείριση του τρέχοντα καταλόγου εργασίας: την pwd και cd. Η pwd δε παίρνει κανένα όρισµα και επιστρέφει ολόκληρο το path name του τρέχοντος καταλόγου εργασίας. Η cd παίρνει ένα όρισµα και µετατρέπει τον τρέχοντα κατάλογο εργασίας στην τιµή αυτού του ορίσµατος. Αν η cd κληθεί χωρίς όρισµα τότε µετατρέπει τον τρέχοντα κατάλογο εργασίας στον προσωπικό κατάλογο του χρηστή που τρέχει το Tcl script. ιαχείριση Ονοµάτων Αρχείων : glob και file Η Tcl έχει δυο εντολές για την διαχείριση των ονοµάτων αρχείων : την glob και την file. Η glob παίρνει ένα ή περισσότερα δείγµατα ως ορίσµατα και επιστρέφει ένα κατάλογο από όλα τα ονόµατα αρχείων που ταιριάζουν µε τα δείγµατα : glob *.c *.h main.c hash.c hash.h Στο παραπάνω παράδειγµα η glob επιστρέφει τα ονόµατα όλων των αρχείων στον τρέχοντα κατάλογο που τελειώνουν σε.c ή.h. Η glob επίσης επιτρέπει στα δείγµατα να περιέχουν χωρισµένους µε κόµµατα καταλόγους ανάµεσα σε αγκύλες, όπως φαίνεται στο παρακάτω παράδειγµα : glob {{src,backup/*.[ch] src/main.c src/hash.c src/hash.h backup/hash.c

Η glob µεταχειρίζεται αυτό το δείγµα σαν να ήταν πολλά δείγµατα µαζί, µε κάθε ένα να περιέχει κάθε ένα από τα string, όπως στο επόµενο παράδειγµα : glob {src/*.[ch] {backup/*.[ch] Αν ένα δείγµα της glob τελειώνει µε µια κάθετο τότε ταιριάζει µόνο µε τα ονόµατα των καταλόγων. Για παράδειγµα η εντολή: glob */ θα επιστρέψει µια λίστα όλων των υποκαταλόγων του τρέχοντος καταλόγου. Αν η λίστα των ονοµάτων αρχείων που θα επιστραφούν από την glob είναι άδεια τότε παράγεται λάθος. Η δεύτερη εντολή για την διαχείριση των ονοµάτων αρχείων είναι η file. Η file είναι µια γενικού σκοπού εντολή µε πολλές επιλογές οι οποίες µπορούν χρησιµοποιηθούν τόσο για τον χειρισµό των ονοµάτων αρχείων όσο και για την ανάκτηση πληροφοριών από τα αρχεία. Οι εντολές σε αυτό το τµήµα λειτουργούν καθαρά πάνω στα ονόµατα αρχείων. εν κάνουν κλήσεις συστήµατος και δεν ελέγχουν να δυο αν τα ονόµατα αντιστοιχούν πραγµατικά σε φακέλους. Η file dirname επιστρέφει το όνοµα του καταλόγου που περιέχει ένα συγκεκριµένο αρχείο : file dirname /a/b/c /a/b file dirname main.c Η file extension επιστρέφει την επέκταση για ένα όνοµα αρχείου ή ένα κενό string αν το όνοµα δεν έχει καµία επέκταση : file extension src/main.c c Η file rootname επιστρέφει τα πάντα από ένα όνοµα αρχείου εκτός από την επέκταση : file rootname src/main.c src/main file rootname foo foo Τέλος η file tail επιστρέφει το τελευταίο στοιχείο σε ένα όνοµα αρχείου : file tail /a/b/c c file tail foo foo Εντολές για Πληροφορίες Αρχείων Η εντολή file χρησιµοποιείτε για την ανάκτηση πληροφοριών για τα αρχεία. Κάθε µια από τις επιλογές που προσφέρει εκτός από την stat και την lstat έχουν την εξής µορφή: file option name όπου η option καθορίζει την πληροφορία που επιθυµείται, όπως exist ή readable ή size, και η name είναι το όνοµα του αρχείου. Οι επιλογές exists, isfile, isdirectory και type επιστρέφουν πληροφορίες για την φύση του αρχείου. Η file exists επιστρέφει 1 αν υπάρχει το αρχείο µε το όνοµα που δίνεται και 0 αν δεν υπάρχει κανένα αρχείο µε τέτοιο όνοµα ή αν ο τρέχων χρηστής δεν έχει δικαίωµα να ψάξει στους καταλόγους που οδηγούν προς αυτό. Η file isfile επιστρέφει 1 αν το αρχείο είναι ένα συνηθισµένο αρχείο δίσκου και 0 αν είναι κάτι άλλο, όπως ένας κατάλογος ή ένα device αρχείο. Η file isdirectory επιστρέφει 1 αν το αρχείο είναι ένας κατάλογος και 0 αλλιώς. Η file type επιστρέφει ένα string, όπως file, directory ήsocket που αναγνωρίζει τον τύπο του αρχείου. Οι επιλογές readable, writable και executable επιστρέφουν

0 ή 1 για να υποδείξουν αν ο τρέχων χρήστης έχει την άδεια να πραγµατοποιήσει τις ενέργειες αυτές στα αρχεία. Η επιλογή owned επιστρέφει 1 αν ο τρέχων χρήστης είναι ο ιδιοκτήτης του αρχείου και 0 αλλιώς. Η επιλογή size επιστρέφει ένα δεκαδικό string που δίνει το µέγεθος του αρχείου σε bytes. Η file mtime επιστρέφει την ώρα της τελευταίας τροποποίησης του αρχείου. Η επιλογή atime επιστρέφει την ώρα της τελευταίας πρόσβασης στο αρχείο. Η επιλογή stat παρέχει έναν απλό τρόπο για να πάρετε πολλές πληροφορίες για ένα αρχείο µε µια φορά. Η file stat επίσης παρέχει προσθετές πληροφορίες τις οποίες δεν µπορείτε να πάρετε µε τις υπόλοιπες επιλογές. Παίρνει δυο προσθετά ορίσµατα, που είναι το όνοµα ενός αρχείου και το όνοµα µιας µεταβλητής, όπως στο παράδειγµα που ακολουθεί : file stat main.c info Σε αυτή την περίπτωση το όνοµα του αρχείου είναι main.c και το όνοµα της µεταβλητής είναι info. Η µεταβλητή θα µεταχειριστεί σαν ένας πίνακας και τα ακόλουθα στοιχεία θα καθοριστούν, το καθένα σαν ένα δεκαδικό string : atime Η ώρα της τελευταίας πρόσβασης. ctime Η ώρα της τελευταίας αλλαγής κατάστασης. dev gid ino Αναγνωριστής των συσκευών που περιέχουν αρχεία. Αναγνωριστής των οµαδοποιηµένων αρχείων. Σειριακός αριθµός για το αρχείο µέσα στη συσκευή του. mode Κατάσταση των bits στο αρχείο. mtime Η ώρα της τελευταίας µετατρoπής. nlink size uid Ο αριθµός των δεσµών στο αρχείο. Το µέγεθος του αρχείου σε bytes. Αναγνωριστής του ιδιοκτήτη χρήστη του αρχείου. Οι επιλογές lstat και readlink µπορούν να χρησιµοποιηθούν για τον χειρισµό συµβολικών δεσµών και µόνο σε συστήµατα που υποστηρίζουν συµβολικούς δεσµούς. Η file lstat είναι ίδια µε την stat για τα κανονικά αρχεία, ενώ η readlink επιστρέφει το περιεχόµενο ενός συµβολικού δεσµού. Λάθη στις Κλήσεις Συστήµατος Οι περισσότερες από τις εντολές που περιγράφηκαν σε αυτό το κεφαλαίο προκαλούν κλήσεις στο λειτουργικό σύστηµα και σε πολλές περιπτώσεις αυτές οι κλήσεις µπορεί να επιστρέψουν λάθη. Αυτό µπορεί να συµβεί αν καλέσετε την open ή την file stat για ένα αρχείο που δεν υπάρχει ή αν ένα Ι/Ο λάθος συµβεί κατά το διάβασµα ενός αρχείου. Οι εντολές Tcl ανιχνεύουν αυτά τα λάθη των κλήσεων συστήµατος στις περισσότερες περιπτώσεις και επιστρέφουν οι ίδιες λάθος. Το µήνυµα λάθους θα αναγνωρίσει το λάθος που παρουσιάστηκε : open hi couldn't open "hi": no such file or directory Όταν ένα λάθος εµφανίζεται σε µια κλήση συστήµατος η Tcl παρέχει την εντολή errorcode που δίνει περισσότερες πληροφορίες για το λάθος. Μπορεί να βρείτε αυτές τις πληροφορίες χρήσιµες για την ανάκτηση από ένα λάθος, όπως για παράδειγµα να καταλάβετε ακριβώς γιατί

το αρχείο δεν είναι προσπελάσιµο. Αν ένα λάθος κλήσης συστήµατος έχει εµφανιστεί τότε η errorcode θα αποτελείται από τρία στοιχεία : set errorcode POSIX ENOENT {no such file or directory Το πρώτο στοιχείο είναι το POSIX για να επισηµάνει ότι το λάθος εµφανίστηκε σε µια POSIX κλήση συστήµατος. Το δεύτερο στοιχείο είναι το επίσηµο όνοµα του λάθους. Το τρίτο στοιχείο είναι το µήνυµα λάθους που αντιστοιχεί στο συγκεκριµένο λάθος. ΑΝΑΦΟΡΑ Η Tcl παρέχει διάφορους τρόπους για να αποτραπεί η ειδική ερµηνεία στους χαρακτήρες όπως το $ και το ελληνικό ερωτηµατικό. Αυτές οι τεχνικές καλούνται αναφορά. Έχετε δει ήδη µια µορφή αναφοράς µε την backslash αντικατάσταση. Εκτός από την backslash αντικατάσταση η Tcl παρέχει δύο άλλες µορφές αναφοράς : τα διπλά εισαγωγικά " " και τις αγκύλες {. Τα διπλά εισαγωγικά θέτουν εκτός λειτουργίας τους διαχωριστές λέξης και εντολής, ενώ οι αγκύλες θέτουν εκτός λειτουργίας σχεδόν όλους τους ειδικούς χαρακτήρες. Εάν µια λέξη εσωκλείεται σε διπλά εισαγωγικά, το ελληνικό ερωτηµατικό, οι αλλαγές γραµµής, και οι υπόλοιποι χαρακτήρες κλειδιά στην TCL αντιµετωπίζονται ως συνηθισµένοι χαρακτήρες µέσα στην έκφραση. Ένα προηγούµενο παράδειγµα µπορεί να ξαναγραφεί πιο καθαρά µε τα διπλά εισαγωγικά ως εξής : set team "players:\$15\ncoaches:\$1 " players:$15 coaches:$1 Σηµειώστε ότι τα διπλά εισαγωγικά δεν είναι µέρος της έκφρασης. Παραδείγµατος χάριν, το ακόλουθο χειρόγραφο θέτει στο s ένα string που περιέχει το όνοµα µιας µεταβλητής, την τιµή της, και την τιµή του τετραγώνου της : set a 2 set s "a ison $a; to tetragono toy a einai [expr $a*$a]" a is 2; the square of a is 4 Εάν θα επιθυµούσατε να περιλάβετε διπλά εισαγωγικά σε µια έκφραση, χρησιµοποιήστε την backslash αντικατάσταση. Οι αγκύλες { παρέχουν µια ριζικότερη µορφή αναφοράς όπου όλοι οι ειδικοί χαρακτήρες χάνουν την έννοιά τους. Εάν µια λέξη εσωκλείεται σε αγκύλες οι χαρακτήρες µεταξύ τους είναι η τιµή της έκφρασης κατά λέξη. Καµία αντικατάσταση δεν εκτελείται στη λέξη και οι ειδικοί χαρακτήρες αντιµετωπίζονται ως συνηθισµένοι χαρακτήρες. Ένα παράδειγµα µπορεί να ξαναγραφεί µε αγκύλες ως εξής : set msg { players:\$15\ncoaches:\$1 players:\$15\ncoaches:\$1 Το δολάριο στην έκφραση δεν προκαλεί την αντικατάσταση µεταβλητής και η αλλαγή γραµµής δεν ενεργεί ως διαχωριστής εντολής. Σε αυτήν την περίπτωση η έκφραση \n δεν µπορεί να χρησιµοποιηθεί για να παρεµβάλει µια αλλαγή γραµµής. ΛΙΣΤΕΣ Οι λίστες χρησιµοποιούνται στην Tcl για να διαχειριστούν τις συλλογές των πραγµάτων, όπως όλοι οι χρήστες σε ένα group ή όλα τα αρχεία σε έναν κατάλογο ή όλες τις επιλογές για ένα widget. Οι λίστες επιτρέπουν σε σας να συγκεντρώσετε οποιοδήποτε αριθµό

τιµών σε ένα µέρος, να διαµοιράσουν τη συλλογή ως ενιαία οντότητα, και να πάρουν αργότερα τις συστατικές τιµές πάλι πίσω. Μια λίστα είναι µια διατεταγµένη συλλογή στοιχείων όπου κάθε στοιχείο µπορεί να έχει τιµή ένα οποιοδήποτε string, όπως ένα αριθµό, ένα όνοµα ατόµου, το όνοµα ενός παραθύρου ή µια λέξη µιας εντολής Tcl. Οι λίστες αντιπροσωπεύονται ως strings µε µια ιδιαίτερη δοµή, αυτό σηµαίνει ότι µπορείτε να αποθηκεύσετε τους καταλόγους σε µεταβλητές, να τους δακτυλογραφήσετε σε εντολές, και να τους τοποθετήσετε ως στοιχεία άλλων καταλόγων. Παρακάτω θα περιγράφει η δοµή των λιστών και παρουσιάζονται δώδεκα βασικές εντολές για το χειρισµό των λιστών. Οι εντολές αυτές εκτελούν διαδικασίες όπως τη δηµιουργία λιστών, την εισαγωγή και την εξαγωγή στοιχείων, και την έρευνα για συγκεκριµένα στοιχεία. Μια περίληψη αυτών των εντολών φαίνεται στον παρακάτω πίνακα : Concat list?list...? Ενώνει πολλαπλές λίστες σε µία ενιαία (κάθε στοιχείο κάθε λίστας γίνεται ένα στοιχείο της τελικής λίστας ) και επιστρέφει την νέα λίστα. join list?joinstring? Συνδέει τα στοιχεία µιας λίστας µε το joinstring ως διαχωριστή και επιστρέφει το αποτέλεσµα. lappend varname value?value...? Αντιστοιχίζει κάθε τιµή στην µεταβλητή varname ως ένα στοιχείο της λίστας και επιστρέφει τη νέα τιµή της µεταβλητής. ηµιουργεί τη µεταβλητή εάν δεν υπάρχει ήδη. lindex list index Επιστρέφει το στοιχείο της λίστας µε δείκτη index. linsert list index value?value...? Επιστρέφει µια νέα λίστα που διαµορφώνεται τοποθετώντας όλα τα ορίσµατα τιµών ως στοιχεία λίστας πριν από το στοιχείο µε τον δείκτη της λίστας. list value?value...? Επιστρέφει µια λίστα της οποίας τα στοιχεία είναι τα ορίσµατα των τιµών. llength list Επιστρέφει των αριθµό των στοιχείων µιας λίστας. lrange list first last Επιστρέφει έναν κατάλογο που αποτελείται από στοιχεία από την αρχή ως το τέλος του καταλόγου. lreplace list first last?value value...? Επιστρέφει µια νέα λίστα που διαµορφώνεται µε την αντικατάσταση των στοιχείων από την

αρχή ως το τέλος της λίστας µε κανένα ή περισσότερα νέα στοιχεία, κάθε ένα από τα οποία διαµορφώνεται από ένα όρισµα τιµής. lsearch?-exact??-glob??-regexp? list pattern Επιστρέφει τον δείκτη του πρώτου στοιχείου της λίστας ή 1 αν δεν υπάρχει. lsort?-ascii??-integer??-real??-command command? \?-increasing??-decreasing? list Επιστρέφει µια νέα λίστα που σχηµατίζεται από την ταξινόµηση των στοιχείων µιας λίστας. split string?splitchars? Επιστρέφει µια λίστα που διαµορφώνεται χωρίζοντας τα string σε στιγµές του SplitChars και µετατρέπει τους χαρακτήρες ανάµεσα σε αυτές τις στιγµές σε στοιχεία λίστας. Η Βασική οµή των Καταλόγων και η Εντολή lindex Mε την απλούστερη µορφή της µια λίστα είναι ένα string που περιέχει οποιοδήποτε αριθµό στοιχείων που χωρίζονται από κενά ή tabs. Για παράδείγµα το string Giannis Anna Maria Dimitris είναι µια λίστα µε τέσσερα στοιχεία. Μπορεί να υπάρξει οποιοσδήποτε αριθµός στοιχείων σε µια λίστα, και κάθε στοιχείο µπορεί να είναι ένα αυθαίρετο string. Η εντολή lindex εξάγει ένα στοιχείο από µια λίστα : lindex { Giannis Anna Maria Dimitris 1 Η lindex παίρνει δύο ορίσµατα, µια λίστα και έναν δείκτη, και επιστρέφει το επιλεγµένο στοιχείο της λίστας. O δείκτης 0 αντιστοιχεί στο πρώτο στοιχείο της λίστας, ο 1 αντιστοιχεί στο δεύτερο στοιχείο και ούτω καθεξής. Εάν ο δείκτης είναι έξω από το εύρος της λίστας επιστρέφεται ένα κενό string. Όταν µια λίστα εισάγεται σε µια εντολή Tcl η λίστα εσωκλείεται συνήθως σε άγκιστρα, όπως στο παραπάνω παράδειγµα. Τα άγκιστρα δεν είναι µέρος της λίστας, αλλά απαιτούνται στη γραµµή εντολής για να περάσουν ολόκληρη τη λίστα στην εντολή ως µεµονωµένη λέξη. Όταν οι λίστες αποθηκεύονται στις µεταβλητές ή εκτυπώνονται, δεν υπάρχουν άγκιστρα γύρω τους : set x { Giannis Anna Maria Dimitris Τα άγκιστρα και τα backslashes µέσα στα στοιχεία λιστών αντιµετωπίζονται από τις εντολές λιστών µε τον ίδιο τρόπο που ο parser της εντολής Tcl τα µεταχειρίζεται στις λέξεις. Αυτό σηµαίνει ότι µπορείτε να εσωκλείσετε ένα στοιχείο λίστας σε άγκιστρα εάν περιέχει διαστήµατα, και µπορείτε να χρησιµοποιήσετε backslashes για να πάρετε ειδικούς χαρακτήρες όπως αγκύλες στα στοιχεία καταλόγων. Τα άγκιστρα χρησιµοποιούνται συχνά για να τοποθετούν λίστες µέσα σε λίστες, όπως στο ακόλουθο παράδειγµα : lindex { a b { c d e f 2 Σε αυτή την περίπτωση το στοιχείο 2 της λίστας είναι από µόνο του µια λίστα µε τρία στοιχεία. εν υπάρχει κανένα όριο στο πόσο βαθιά οι λίστες µπορούν να τοποθετηθούν.

ηµιουργία Λιστών : concat, list και llength Η Tcl παρέχει δύο εντολές που συνδυάζουν τα strings για να παράγουν λίστες: concat και list. Κάθε µια από αυτές τις εντολές δέχεται έναν αυθαίρετο αριθµό ορισµάτων, και κάθε µια παράγει µια λίστα σαν αποτέλεσµα. Εντούτοις, διαφέρουν στον τρόπο µε τον οποίο συνδυάζουν τα ορίσµατά τους. Η εντολή concat παίρνει µια ή περισσότερες λίστες ως ορίσµατα και ενώνει όλα τα στοιχεία των λιστών ορισµάτων σε µια ενιαία µεγάλη λίστα: concat { a b c { d e f { g h i a b c d e f g h i Η concat αναµένει από τα ορίσµατά της να έχουν τη σωστή δοµή λιστών, εάν τα ορίσµατα δεν είναι καλοσχηµατισµένες λίστες τότε το αποτέλεσµα µπορεί να µην είναι επίσης µια καλοσχηµατισµένη λίστα. Στην πραγµατικότητα, αυτό που κάνει η concat είναι να συνδέει τα string ορισµάτων της σε ένα µεγάλο string τοποθετώντας κενά ανάµεσα στα ορίσµατα. Το ίδιο αποτέλεσµα µε την concat µπορεί να επιτευχθεί χρησιµοποιώντας διπλά εισαγωγικά: set x {a b c set y {d e set z [concat $x $y] set z "$x $y" Η εντολή λιστας list ενώνει τα ορίσµατα της έτσι ώστε κάθε όρισµα να γίνεται ένα ευδιάκριτο στοιχείο της λίστας που προκύπτει : list {a b c {d e f {g h i Σε αυτήν την περίπτωση, η λίστα που προκύπτει περιλαµβάνει µόνο τέσσερα στοιχεία. Η εντολή list παραγάγει πάντα έναν κατάλογο µε την κατάλληλη δοµή, ανεξάρτητα από τη δοµή των ορισµάτων της (προσθέτει άγκιστρα ή backslashes όπως απαιτούνται), και η εντολή lindex µπορεί πάντα να χρησιµοποιηθεί για να εξαγάγει τα αρχικά στοιχεία µιας λίστας που δηµιουργήθηκε µε την εντολή list. Τα ορίσµατα για την list δεν χρειάζεται να είναι καλοσχηµατισµένες λίστες. Η εντολή llength επιστρέφει τον αριθµό στοιχείων σε µια λίστα : llength {{a b c {d e f {g h i llength a llength { Όπως µπορείτε να δείτε από τα παραδείγµατα, ένα απλό string όπως το a είναι µια λίστα µε ένα στοιχείο και ένα κενό string είναι µια λίστα µε µηδέν στοιχεία. Τροποποίηση Λιστών : linsert, lreplace, lrange και lappend Η εντολή linsert δηµιουργεί µια νέα λίστα προσθέτοντας ένα ή περισσότερα στοιχεία σε µια ήδη υπάρχουσα λίστα : set x {a b {c d e a b {c d e linsert $x 2 X Y Z a b X Y Z {c d e linsert $x 0 {X Y Z

{X Y Z a b {c d e Η linsert παίρνει τρία ή περισσότερα ορίσµατα. Το πρώτο είναι µια λίστα, το δεύτερο είναι ένας δείκτης σε ένα στοιχείο αυτής της λίστας και το τρίτο και τα επιπλέον ορίσµατα είναι τα νέα στοιχεία που προστίθενται στη λίστα. Η επιστροφή από την εντολή linsert είναι µια λίστα που δηµιουργείται τοποθετώντας τα νέα στοιχεία ακριβώς πριν από το στοιχείο που υποδεικνύεται από τον δείκτη. Αν ο δείκτης είναι το 0 τότε τα νέα στοιχεία τοποθετούνται στην αρχή της λίστας, αν είναι το 1 τότε τα νέα στοιχεία τοποθετούνται αµέσως µετά από το πρώτο στοιχείο της αρχικής λίστας και ούτω καθεξής. Αν ο δείκτης είναι µεγαλύτερος ή ίσος µε τον αριθµό των στοιχείων τότε τα νέα στοιχεία τοποθετούνται στο τελος της αρχικής λίστας. Η εντολή lreplace διαγράφει στοιχεία από µια λίστα και προαιρετικά προσθέτει νέα στοιχεία στη θέση τους. Παίρνει τρία ή περισσότερα ορίσµατα. Το πρώτο όρισµα είναι µια λίστα και τα δεύτερα και τρίτα ορίσµατα δίνουν τους δείκτες των πρώτων και τελευταίων στοιχείων που διαγράφονται. Εάν µόνο τρία ορίσµατα καθορίζονται τότε το αποτέλεσµα είναι µια νέα λίστα που παράγεται µε τη διαγραφή της δεδοµένης σειράς των στοιχείων από την αρχική λίστα: lreplace {a b {c d e 2 3 a b Αν καθορίζονται επιπλέον ορίσµατα για την εντολή lreplace όπως στο παρακάτω παράδειγµα τότε αυτά τοποθετούνται στη λίστα στην θέση των στοιχείων που διαγράφηκαν : lreplace {a b {c d e 1 2 {W X Y Z a {W X Y Z e Η εντολή lrange εξάγει µια σειρά των στοιχείων από µια λίστα. Παίρνει ως ορίσµατα µια λίστα και δύο δείκτες και επιστρέφει µια νέα λίστα που αποτελείται από τη σειρά των στοιχείων που βρίσκονται µεταξύ των δύο δεικτών : set x {a b {c d e a b {c d e lrange $x 1 3 b {c d e lrange $x 0 1 a b Η εντολή lappend παρέχει έναν αποδοτικό τρόπο να προσαρτηθούν νέα στοιχεία σε µια λίστα που αποθηκεύεται σε µια µεταβλητή. Παίρνει ως ορίσµατα το όνοµα µιας µεταβλητής και κάθε αριθµό πρόσθετων ορισµάτων. Κάθε ένα από τα πρόσθετα ορίσµατα προστίθεται στην τιµή της µεταβλητής ως ένα νέο στοιχείο λίστας και η lappend επιστρέφει τη νέα τιµή της µεταβλητής : set x {a b {c d e a b {c d e lappend x XX {YY ZZ a b {c d e XX {YY ZZ set x a b {c d e XX {YY ZZ

Αναζήτηση σε Λίστες : lsearch Η εντολή lsearch ψάχνει σε µια λίστα για ένα στοιχείο µε µια συγκεκριµένη τιµή. Παίρνει δύο ορίσµατα, το πρώτο από τα οποία είναι µια λίστα και το δεύτερο είναι ένα δείγµα : set x { Giannis Anna Maria Dimitris lsearch $x Maria 2 lsearch $x Philipas -1 Η lsearch επιστρέφει το δείκτη του πρώτου στοιχείου στη λίστα που ταιριάζει µε το δείγµα ή -1 εάν δεν υπήρξε κανένα στοιχείο που να ταιριάζει. Μία από τις τρεις διαφορετικές τεχνικές ταιριάσµατος του δείγµατος µπορεί να επιλεχτεί µε τον καθορισµό µιας από τις εντολές - exact, - glob, και - regexp πριν από το όρισµα της λίστας: lsearch -glob $x A* 1 Οι τρεις παραπάνω εντολές περιγράφονται πιο αναλυτικά παρακάτω. Ταξινόµηση Λιστών : lsort Η εντολή lsort παίρνει µια λίστα ως όρισµα και επιστρέφει µια νέα λίστα µε τα ίδια στοιχεία, αλλά ταξινοµηµένο µε την αυξανόµενη αλφαβητική σειρά : lsort { Giannis Anna Maria Dimitris Anna Dimitris Giannis Maria Μπορείτε να χρησιµοποιήσετε οποιαδήποτε από τις αρκετές εντολές που υπάρχουν, πριν από τη λίστα, για να ελέγξετε το είδος της ταξινόµησης. Για παράδειγµα, η - decreasing διευκρινίζει ότι το αποτέλεσµα πρέπει να έχει το "µεγαλύτερο" στοιχείο πρώτα και η - integer διευκρινίζει ότι τα στοιχεία πρέπει να αντιµετωπιστούν ως ακέραιοι αριθµοί και να ταξινοµηθούν σύµφωνα µε την αξία ακέραιων αριθµών : lsort -decreasing { Giannis Anna Maria Dimitris Maria Giannis Dimitris Anna lsort {10 1 2 1 10 2 lsort -integer {10 1 2 1 2 10 Μετατροπές Ανάµεσα σε string και σε Λίστες : split και join Η εντολή split χωρίζει ένα string σε συστατικά κοµµάτια έτσι ώστε να µπορείτε να επεξεργαστείτε τα κοµµάτια ανεξάρτητα. ηµιουργεί µια λίστα της οποίας τα στοιχεία είναι τα κοµµάτια, έτσι ώστε µπορείτε να χρησιµοποιήσετε οποιαδήποτε από τις εντολές καταλόγων για να επεξεργαστείτε τα κοµµάτια. Για παράδειγµα, υποθέστε ότι µια µεταβλητή περιέχει ένα όνοµα αρχείου UNIX µε συστατικά που χωρίζονται από κάθετους, και θέλετε να το µετατρέψετε σε έναν κατάλογο µε ένα στοιχείο για κάθε συστατικό : set x a/b/c

set y /usr/include/sys/types.h split $x / a b c split $y / { usr include sys types.h Το πρώτο όρισµα στην split είναι το string που χωρίζεται και το δεύτερο όρισµα περιέχει έναν ή περισσότερους χαρακτήρες διάσπασης. Η split εντοπίζει όλες τις περιπτώσεις οποιουδήποτε από τους χαρακτήρες διάσπασης στο string. ηµιουργεί έπειτα µια λίστα της οποίας τα στοιχεία αποτελούνται από τα substrings µεταξύ των χαρακτήρων διάσπασης. Οι άκρες των strings αντιµετωπίζονται επίσης ως χωρισµένοι χαρακτήρες. Εάν υπάρχουν διαδοχικοί χαρακτήρες διάσπασης ή αν το string αρχίζει ή τελειώνει µε έναν χαρακτήρα διάσπασης όπως στο δεύτερο παράδειγµα, τότε τα κενά στοιχεία παράγονται στη λίστα που προκύπτει. Οι ίδιοι χαρακτήρες διάσπασης απορρίπτονται. Αρκετοί χαρακτήρες διάσπασης µπορούν να καθοριστούν, όπως στο ακόλουθο παράδειγµα: split xabzabhi ab Εάν ένα κενό string ορίζεται για χαρακτήρας διάσπασης τότε κάθε χαρακτήρας του string µετατρέπεται σε ένα χωριστό στοιχείο λίστας: split {a b c { Η εντολή join είναι περίπου το αντίστροφο της split. Συνδέει τα στοιχεία λιστών µαζί µε ένα δεδοµένο string µεταξύ τους : join {{ usr include sys types.h / /usr/include/sys/types.h set x {2 12 8 expr [join $x +] 22 Η join παίρνει δύο ορίσµατα: µια λίστα και ένα string σύνδεσης. Εξάγει όλα τα στοιχεία από τη λίστα και τα συνδέει µαζί µε το string σύνδεσης µεταξύ κάθε ζεύγους στοιχείων. Το string σύνδεσης µπορεί να περιέχει οποιοδήποτε αριθµό χαρακτήρων, συµπεριλαµβανοµένου και του κενού. Στο πρώτο παράδειγµα επάνω ένα όνοµα αρχείου παράγεται µε την ένωση των στοιχείων λίστας µε /. Στο δεύτερο παράδειγµα µια έκφραση Tcl παράγεται µε την ένωση των στοιχείων λίστας µε +". Μια από τις πιο κοινές χρήσεις της split και της join είναι για την διαχείριση ονοµάτων αρχείων όπως παρουσιάζονται παραπάνω. Μια άλλη κοινή χρήση είναι για την διάσπαση κειµένου σε γραµµές µε τη χρησιµοποίηση της αλλαγής γραµµής ως χαρακτήρα διάσπασης. Λίστες και Εντολές Υπάρχει µια πολύ σηµαντική σχέση µεταξύ των λιστών και των εντολών στην Tcl. Οποιαδήποτε λίστα είναι επίσης και µια καλοσχηµατισµένη εντολή Tcl. Εάν µια λίστα αξιολογείται ως ένα Tcl script τότε θα αποτελείται από µια απλή εντολή της οποίας οι λέξεις είναι τα στοιχεία της λίστας. Με άλλα λόγια, ο Tcl parser δεν θα εκτελέσει καµία αντικατάσταση : θα εξαγάγει απλά τα στοιχεία της λίστας µε κάθε στοιχείο να µετατρέπεται σε µια λέξη της εντολής. Αυτή η ιδιότητα είναι πολύ σηµαντική επειδή σας επιτρέπει να παράγετε εντολές Tcl που είναι εγγυηµένες να αναλυθούν µε ένα ιδιαίτερο τρόπο ακόµα κι αν µερικές από τις λέξεις των εντολών περιέχουν ειδικούς χαρακτήρες όπως διαστήµατα ή το $. Παραδείγµατος χάριν, υποθέστε ότι δηµιουργείτε ένα button σε Tk, και όταν πατά ο χρήστης στο widget να επιθυµείτε να επαναφέρετε µια µεταβλητή σε µια συγκεκριµένη τιµή. Μπορείτε να δηµιουργήσετε ένα τέτοιο widget µε µια εντολή όπως αυτή :

button.b -text press -command {set x 100 pack.b Το Tcl script set x 100 θα ενεργοποιηθεί όποτε ο χρήστης πατήσει το κουµπί press. Τώρα υποθέστε ότι η τιµή που αποθηκεύεται στη µεταβλητή δεν είναι σταθερή, αλλά υπολογίζεται αµέσως πριν από την εντολή button και πρέπει να ληφθεί από µία µεταβλητή value. Επιπλέον, υποθέστε ότι η value θα µπορούσε να περιέχει οποιοδήποτε string. Μπορείτε να ξαναγράψετε την εντολή ως εξής : button.b -text press -command {set x $value pack.b Το Tcl script set x $value θα αξιολογηθεί όταν ο χρήστης πατά το κουµπί press. Εντούτοις, θα χρησιµοποιηθεί η τιµή της value την στιγµή που ο χρήστης πατά το κουµπί, η οποία µπορεί να µην είναι ίδια µε την τιµή που υπήρχε όταν δηµιουργήθηκε το κουµπί. Για παράδειγµα, η ίδια µεταβλητή µπορεί να χρησιµοποιηθεί για να δηµιουργήσει διάφορα κουµπιά, κάθε ένα µε διαφορετική προοριζόµενη τιµή. Για να λύσετε αυτό το πρόβληµα πρέπει να παράγετε µια εντολή Tcl που να περιέχει την τιµή της value µεταβλητής, όχι το όνοµά της, και να χρησιµοποιήσετε αυτή την εντολή ως µέρος του τµήµατος -command της εντολής button. Εάν η τιµή της value είναι κάτι απλό όπως 47 τότε αυτό θα λειτουργήσει άριστα : η προκύπτουσα εντολή θα είναι set x 47, η οποία θα παράγει το επιθυµητό αποτέλεσµα. Παρόλα αυτά, τι θα γίνει εάν η value περιέχει την τιµή nea smyrni. Σε αυτήν την περίπτωση η προκύπτουσα εντολή θα είναι set x nea smyrni, η οποία έχει τέσσερις λέξεις. Η set θα παράγει λάθος επειδή υπάρχουν πάρα πολλά ορίσµατα. Ακόµα χειρότερα βέβαια, αν η value περιέχει ειδικούς χαρακτήρες όπως το $ ή το [. Αυτοί οι χαρακτήρες θα µπορούσαν να προκαλέσουν ανεπιθύµητες αντικαταστάσεις να προκύψουν όταν αξιολογείται η εντολή. Η µόνη λύση που είναι εγγυηµένη να λειτουργήσει για οποιαδήποτε τιµή της value είναι να χρησιµοποιηθεί εντολή λίστας για να παραχθεί η εντολή, όπως στο ακόλουθο παράδειγµα: button.b -text press -command [list set x $value] pack.b Το αποτέλεσµα της εντολής λίστας είναι µια εντολή Tcl της οποίας η πρώτη λέξη θα είναι η set, η δεύτερη λέξη θα είναι x, και η τρίτη λέξη θα είναι η τιµή της value. Η εντολή θα παράγει πάντα το επιθυµητό αποτέλεσµα και οποιαδήποτε τιµή που αποθηκεύεται στην value την στιγµή που τίθεται σε λειτουργία το button θα αποθηκευτεί στην x όταν το widget τίθεται σε λειτουργία. ΕΛΕΓΧΟΣ ΡΟΗΣ Το παρακάτω κείµενο περιγράφει τις εντολές Tcl για τον έλεγχο της ροής της εκτέλεσης σε ένα χειρόγραφο. Οι Tcl εντολές ελέγχου ροής είναι παρόµοιες µε τις δηλώσεις ελέγχου ροής στη γλώσσα προγραµµατισµού C και csh,όπως είναι οι if, while, for, foreach, switch και eval.