Σάββατο, 28 Απριλίου 2018

Αναθεώρηση 6 (Έκδοση 9.3)

1.Αφαιρέθηκε ένα λάθος που προκαλούσαν οι δείκτες σε επόμενη εντολή Διάβασε (ένα" σκουπίδι" έκανε την Διάβασε να μην διαβάζει ένα αλφαριθμητικό, αλλά να το βλέπει σαν ομάδα).
2. Όταν αντιγράφαμε κώδικα με ρουτίνες από το Blog και όταν στον ορισμό της ρουτίνας είχαμε διαστήματα δεξιά, τότε λόγω της αλλαγής σε non brake space που κάνει ο διερμηνευτής στην εξαγωγή html (με αντιγραφή από τον διορθωτή/συντάκτη, με χρωματισμό κώδικα) στην αντίστροφη αντιγραφή παρέμεναν αντί οι χαρακτήρες 32, οι χαρακτήρες 160 (αυτό είναι το διάστημα που δουλεύει ως χαρακτήρας αλλά φαίνεται ως διάστημα). Ο Διερμηνευτής σε όλες τις άλλες περιπτώσεις δεν είχε πρόβλημα με το 160, αλλά  είχε η εύρεση ρουτίνας. Τώρα διορθώθηκε στην εύρεση.
3. Το προηγούμενο θέμα με τον χαρακτήρα 160, έκανε τον διορθωτή με το Tab και Shift Tab να μην αυξάνει ή μειώνει τις εσοχές. Και αυτό αντιμετωπίστηκε.
4.Οι ρουτίνες μπορούν να κληθούν και όταν βρίσκονται στο κώδικα του γονικού (τμήματος ή συνάρτησης). Δεν ισχύει στις λάμδα συναρτήσεις (δεν έχουν γονικό τμήμα ή συνάρτηση). Το ενδιαφέρον σε αυτή την αναθεώρηση είναι ότι δουλεύει πολύ καλά, με προτεραιότητα στις εσωτερικές ρουτίνες. Δηλαδή αν στο ίδιο τμήμα έχουμε δυο άλλα τμήματα που χρησιμοποιούν τις εξωτερικές για αυτά ρουτίνες και σε μια από αυτές τις εξωτερικές γίνεται κλήση σε μια έστω Β() τότε ο διερμηνευτής κοιτάει αν υπάρχει εσωτερική Β() και καλεί αυτή, και αν όχι τότε κοιτάει στις εξωτερικές πριν αποφανθεί ότι δεν υπάρχει, ή εντέλει βρει τη ρουτίνα και την εκτελέσει. Για κάθε τμήμα οι ρουτίνες καταγράφονται στη πρώτη ζήτηση, και η καταγραφή επιτυχώς γίνεται και ως προς που βρέθηκε η ρουτίνα (εσωτερικά ή εξωτερικά). Οι εξωτερικές ρουτίνες εκτελούνται σαν να είναι εσωτερικές, δηλαδή με ορατότητα μεταβλητών στο χώρο του τμήματος που της κάλεσε και όχι του γονικού.

Παράδειγμα.
Το τμήμα Βήτα έχει δική του Β(), ενώ το Βήτα1 δεν έχει τίποτα και χρησιμοποιεί ότι βρίσκει από το γονικό (υποθέτουμε ότι το παρακάτω ανήκει σε ένα τμήμα έστω Α).
Οι ρουτίνες έχουν αναδρομή, και υπάρχει η Όριο.Αναδρομής που θέτει μέγιστο όριο. Το μέγιστο όριο μπορεί να είναι όσο θέλουμε, να καλύπτει δηλαδή σχεδόν όλη τη μνήμη, γιατί ο σωρός επιστροφής των ρουτινών είναι τοπικός στο αντικείμενο εκτέλεσης του κάθε τμήματος με δυνατότητα να αυξάνεται κατά τη ζήτηση. Το όριο μπήκε για να έχουμε έναν τερματισμό όταν θεωρούμε ότι μετά από ένα μέγιστο όριο κλήσεων έχουμε λάθος. Οι συναρτήσεις και τα τμήματα κάνουν χρήση του σωρού (ή στοίβας) του διερμηνευτή, και αυτός περιορίζεται βάσει του προγράμματος που φορτώνει το M2000.dll, τον διερμηνευτή. Το M2000.exe έχει φτιαχτεί για να έχει μεγάλο σωρό, και αυτό δίνει στο διερμηνευτή μερικές χιλιάδες κλήσεις σε συναρτήσεις και σε τμήματα. Υπάρχει η εντολή Έλεγχος που δίνει μια εκτίμηση.

Γενική Ομάδα κ {
      χ=30
}
Τμήμα Βήτα {
      Για κ {
            Τύπωσε "Βήτα",
            α(10)
           Τύπωσε "ΟΚ"
            α(10)
            }
      Ρουτίνα Β(χ)
            Τύπωσε χ**2
            Τέλος Ρουτίνας
      }
βήτα
Τμήμα Βήτα1 {
       Για κ {
            Τύπωσε "Βήτα",
            α(10)
            Τύπωσε "ΟΚ"
            α(10)
            }
      }
βητα1
Ρουτίνα Α(χ)
      Β(χ)
      Τύπωσε "ok2"
Τέλος Ρουτίνας

Ρουτίνα Β(χ)
      Τύπωσε χ*2
Τέλος Ρουτίνας


Δεύτερο παράδειγμα με λάμδα. Εδώ δεν μπορούμε να χρησιμοποιήσουμε εξωτερικές ρουτίνες αλλά δουλεύουν εσωτερικά αν υπάρχουν, και βλέπουν και τα κλεισίματα:
κ=λάμδα μ1=101 -> {
                  Τύπωσε "Βήτα"
                  α(10)
                       Τύπωσε  "ΟΚ", μ1
                  α(10)
                  \\ δεν επιστρέφουμε τιμή
                  \\ ο διερμηνευτής δίνει το 0 ως επισροφή
                  \\ μόλις δει το Ρουτίνα ο διερμηνευτής δεν συνεχίζει κάνει έξοδο
                  Ρουτίνα Α(χ)
                   Β(χ)
                   Τύπωσε "ok2", μ1
                   Τέλος Ρουτίνας
                   Ρουτίνα Β(χ)
                         Τύπωσε χ*2
                   Τέλος Ρουτίνας

}
Μ=κ() ' και έτσι καλούμε
Κάλεσε κ() ' και έτσι. αλλά αν η τιμή είναι διάφορη του 0 βγαίνει λάθος

Τρίτο παράδειγμα με ανώνυμη συνάρτηση (την έχουμε απλά σε ένα αλφαριθμητικό)

' Ανώνυμη συνάρτηση
' τοποθετημένη πρόσκαιρα σε ένα αλφαριθμητικό
' πρέπει να έχει ένα μπλοκ κώδικα
' Αυτό "{=10}" είναι συνάρτηση που γυρίζει το 10
Τύπωσε Συνάρτηση("{=10}")=10
' Αυτό "{=Αριθμός**2}" είναι συνάρτηση που γυρίζει το τετράγωνο του αριθμού που δίνουμε
Τύπωσε Συνάρτηση("{=Αριθμός**2}", 3)=9
' Μπορούμε να διαβάσουμε σε μεταβλητές
Τύπωσε Συνάρτηση("{Διάβασε Χ, Υ : =Χ**Υ}", 2, 3)=8

α$={{
      Τύπωσε "Βήτα"
      α(10)
     Τύπωσε "ΟΚ"
      α(10)            
      Ρουτίνα Β(χ)
            Τύπωσε χ
            κ(χ)
      Τέλος Ρουτίνας
}}
\\ ένας τρόπος κλήσης είναι με την Συνάρτηση()
Μ=Συνάρτηση(α$)
\\ ένας άλλος είναι με την Κάλεσε
Τύπωσε "Κλήση με την Κάλεσε"
Κάλεσε α$
\\ εδώ βλέπει το Ρουτίνα ο διερμηνευτής και κάνει έξοδο
Ρουτίνα Α(χ)
  Β(χ)
  Τύπωσε "ok2"
  Τέλος Ρουτίνας
  Ρουτίνα Β(χ)
        Τύπωσε χ*2
  Τέλος Ρουτίνας
  Ρουτίνα Κ(χ)
   Τύπωσε "οκ4", χ
  Τέλος Ρουτίνας