3.2. Μεταβλητές και συναρτήσεις
| 3. Μάθημα Script-Fu |

### 3.2. Μεταβλητές και συναρτήσεις

Τώρα που ξέρουμε ότι κάθε πρόταση του Scheme περιβάλλεται από παρενθέσεις και ότι το όνομα/τελεστής της συνάρτησης καταχωρίζεται πρώτο, χρειάζεται να μάθουμε τη δημιουργία και χρήση μεταβλητών και πώς να δημιουργήσουμε και να χρησιμοποιήσουμε τις συναρτήσεις. Θα ξεκινήσουμε με τις μεταβλητές.

#### 3.2.1. Δήλωση μεταβλητών

Αν και υπάρχουν περισσότερες μέθοδοι για δήλωση μεταβλητών, η προτιμώμενη μέθοδος είναι η χρήση της δομής let*. Εάν ξέρετε άλλες γλώσσες προγραμματισμού, αυτή η δομή είναι ισοδύναμη με τον ορισμό μιας λίστας τοπικών μεταβλητών και μια εμβέλεια στην οποία είναι ενεργή. Π.χ., για να δηλώσετε δύο μεταβλητές, a και b, αρχικοποιημένες στο 1 και 2, αντίστοιχα, πρέπει να γράψετε:

            (let*
               (
                  (a 1)
                  (b 2)
               )
               (+ a b)
            )

ή σε μια γραμμή:

    (let* ( (a 1) (b 2) ) (+ a b) )

| Σημείωση
Πρέπει να γράψετε όλο αυτό σε μια γραμμή εάν χρησιμοποιείται το παράθυρο κονσόλας. Γενικά, όμως, θα θέλετε να υιοθετήσετε μια παρόμοια πρακτική εσοχής για να κάνετε τα σενάρια σας πιο ευανάγνωστα. Θα μιλήσουμε λίγο περισσότερο για αυτό στην ενότητα του κενού διαστήματος.

Αυτό δηλώνει δύο τοπικές μεταβλητές, a και b, τις αρχικοποιεί, έπειτα τυπώνει το άθροισμα των δύο μεταβλητών.

#### 3.2.2. Τι είναι τοπική μεταβλητή;

Θα παρατηρήσατε ότι γράψαμε την άθροιση `(+ a b)` μέσα στις παρενθέσεις της έκφρασης `let*` και όχι μετά από αυτήν.

Αυτό γιατί η πρόταση `let*` ορίζει μια περιοχή στο σενάριο σας στην οποία οι δηλωμένες μεταβλητές είναι χρησιμοποιήσιμες· εάν γράψετε την πρόταση `(+ a b)` μετά την πρόταση `(let*...)`, θα πάρετε σφάλμα, επειδή οι δηλωμένες μεταβλητές ισχύουν μόνο μέσα στο πλαίσιο της πρότασης `let*`· είναι αυτό που οι προγραμματιστές αποκαλούν τοπικές μεταβλητές.

#### 3.2.3. Η γενική σύνταξη του `let*`

Η γενική μορφή της πρότασης `let*` είναι:

            (let* ( μεταβλητές )
              εκφράσεις )

όπου οι μεταβλητές δηλώνονται μέσα σε παρενθέσεις, π.χ., `(a 2)` και εκφράσεις είναι κάθε έγκυρη έκφραση του Scheme. Να θυμόσαστε ότι οι δηλωμένες μεταβλητές εδώ είναι έγκυρες μόνο μέσα στην πρόταση `let*` — είναι τοπικές μεταβλητές.

#### 3.2.4. Κενό διάστημα

Πιο μπροστά, αναφέραμε το γεγονός ότι θα θέλετε προφανώς να χρησιμοποιήσετε εσοχές για να ξεκαθαρίσετε και να οργανώσετε τα σενάρια σας. Αυτή είναι μια καλή πολιτική να δεχθείτε και δεν είναι πρόβλημα στο Scheme — τα κενά διαστήματα αγνοούνται από τον ερμηνευτή του Scheme και μπορείτε έτσι να τα εφαρμόσετε ελεύθερα για ξεκαθάρισμα και οργάνωση του κώδικα στο σενάριο. Όμως, εάν δουλεύετε στο παράθυρο της κονσόλας του Script-Fu, θα πρέπει να εισαγάγετε την συνολική έκφραση σε μια γραμμή, δηλαδή οτιδήποτε μεταξύ της αρχικής και τελικής παρένθεσης μιας έκφρασης, πρέπει να έλθει σε μια γραμμή στο παράθυρο της κονσόλας του Script-Fu.

#### 3.2.5. Απόδοση μιας νέας τιμής σε μια μεταβλητή

Αφού αρχικοποιήσατε μια μεταβλητή, ίσως χρειαστεί να αλλάξετε την τιμή της αργότερα στο σενάριο. Χρησιμοποιήστε την πρόταση `set!` για να αλλάξετε την τιμή της μεταβλητής:

            (let* ( (theNum 10) ) (set! theNum (+ theNum theNum)) )

Προσπαθήστε να μαντέψετε τι θα κάνει η πιο πάνω πρόταση, έπειτα συνεχίστε και εισάγετε το στο παράθυρο κονσόλας του Script-Fu.

| Σημείωση
Το «`\`»δείχνει ότι δεν υπάρχει καμία αλλαγή γραμμής. Αγνοήστε το (μην το γράφετε στην κονσόλα Script-Fu και μην πατάτε Enter), απλά συνεχίστε με την επόμενη γραμμή.

#### 3.2.6. Συναρτήσεις

Τώρα που μάθατε για τις μεταβλητές, ας δουλέψουμε με μερικές συναρτήσεις. Δηλώνετε μια συνάρτηση με την ακόλουθη σύνταξη:

            (define
               (
                  name
                  param-list
               )
               expressions
            )

όπου `name` είναι το όνομα που δόθηκε στη συνάρτηση , `param-list` είναι μια λίστα ονομάτων παραμέτρων οριοθετημένου χώρου και `expressions` είναι η σειρά των εκφράσεων που η συνάρτηση εκτελεί, όταν καλείται. Π.χ.:

    (define (AddXY inX inY) (+ inX inY) )

`AddXY` είναι το όνομα της συνάρτησης και `inX` και `inY` είναι οι μεταβλητές. Αυτή η συνάρτηση παίρνει τις δύο παραμέτρους της και τις προσθέτει μαζί.

Εάν έχετε προγραμματίσει σε άλλες προστακτικές γλώσσες (όπως C/C++, Java, Pascal, κλ.), ίσως να παρατηρήσατε ότι μερικά πράγματα λείπουν στον ορισμό αυτής της συνάρτησης, όταν συγκρίνετε με άλλες προγραμματιστικές γλώσσες.

- Πρώτα, σημειώστε ότι οι παράμετροι δεν έχουν κανένα «τύπο» (δηλαδή δεν τις δηλώσαμε ως αλφαριθμητικά, ακέραιους κλ.). Το Scheme είναι μια άτυπη γλώσσα. Αυτό είναι εύχρηστο και επιτρέπει τη συγγραφή πιο γρήγορων σεναρίων.

- Δεύτερο, παρατηρείστε ότι δεν χρειάζεται να ανησυχούμε για την «επιστροφή» του αποτελέσματος της συνάρτησης μας — η τελευταία πρόταση είναι η «επιστρεφόμενη» τιμή, όταν καλείται αυτή η συνάρτηση. Γράψτε τη συνάρτηση στην κονσόλα, έπειτα προσπαθήστε κάτι όπως:

      (AddXY (AddXY 5 6) 4)

3. Μάθημα Script-Fu |  | 3.3. Λίστες, λίστες και πάλι λίστες

Αναφέρτε το σφάλμα στον ανιχνευτή σφαλμάτων