Τρίτη, 27 Ιουνίου 2017

Αναθεώρηση 1 (Έκδοση 8.9)

Σε αυτήν την αναθεώρηση, είχα μάλλον το κέφι να επιλύσω ένα ζήτημα με το πώς θα μπορούσα να εξάγω ένα δείκτη σε αντικείμενο ομάδα χωρίς όμως να πάει σε μεταβλητή, αλλά να χρησιμοποιηθεί εντός του εκτιμητή παραστάσεων (evaluator). Και αυτό γιατί δεν θέλω οι ομάδες να δίνουν δείκτες προς τα έξω. Ο λόγος που δεν το θέλω είναι απλός για μένα αλλά δύσκολος σε κάποιον που δεν γνωρίζει τα αντικείμενα. Σε συνήθεις γλώσσες ένα αντικείμενο "ζει" όσο υπάρχει δείκτης να το κρατάει. Αυτό συμβαίνει και για τα αντικείμενα με δείκτες που υποστηρίζει η Μ2000. Υπάρχει μάλιστα και ειδικός συλλέκτης σκουπιδιών που βρίσκει κυκλικές αναφορές και τις εξαφανίζει. Όμως στα αντικείμενα Ομάδα θέλω να έχουμε δυο καταστάσεις. Ή να είναι "επώνυμα", να έχουν όνομα δηλαδή, ή να έχουν θέση (πχ σε έναν πίνακα). Σε καμία περίπτωση όμως δεν υπάρχει διπλός δείκτης. Πάντα θα υπάρχει ένας μοναδικός, είτε έχουμε επώνυμη ομάδα, είτε ομάδα σε θέση (ανώνυμη).
Επιπλέον οι ομάδες μπορούν να έχουν άλλες ομάδες εσωτερικά, οπότε αν είχα δώσει τρόπο να χειριζόμαστε τις ομάδες με δείκτες θα γίνονταν μεγάλο μπέρδεμα! Πχ θα μπορούσε κανείς να βάλει την εσωτερική ομάδα να δείχνει στην εξωτερική! Επειδή λοιπόν τα αντικείμενα Ομάδα, τα επώνυμα, έχουν λειτουργία συγχώνευσης  (δηλαδή στην εκχώρηση Α=Β θα έχουμε ένα A με όλα τα μέρη του Β σε αυτό), αν είχαμε τέτοιους δείκτες ίσως να μην τελείωνε ποτέ η αντιγραφή.
Άλλα γνωρίσματα των αντικειμένων Ομάδα
Τα μέλη στα αντικείμενα ομάδα δεν γράφονται σε συνεχόμενη μνήμη. Στις επώνυμες ομάδες τα μέλη είναι ξεχωριστά, και για το λόγο αυτό μεταβλητές της ομάδας μπορούμε να τις περάσουμε με αναφορά, χωρίς να περάσουμε την ομάδα μαζί. Στις ανώνυμες ομάδες (δηλαδή ομάδες σε θέση), έχουμε κλειστό αντικείμενο, δηλαδή όλα τα μέλη βρίσκονται σε λίστα εντός της ομάδας και δεν είναι προσπελάσιμα. Αν για παράδειγμα στο Α(3) έχουμε μια ομάδα με μεταβλητή Χ, τότε το:
Τύπωσε Α(3).Χ
 θα δημιουργήσει ένα ανοικτό αντικείμενο θα διαβάσει το Χ και μετά θα κλείσει το αντικείμενο (γίνεται γρήγορα). Ομοίως αν θέλουμε να αλλάξουμε τιμή:
Α(3).Χ++
Α(3).Χ+=10
Α(3).Χ=1000
θα έχουμε άνοιγμα και κλείσιμο για κάθε περίπτωση. Για να κάνουμε πιο γρήγορη τη διαδικασία υπάρχει η εντολή Για (όχι η απαρίθμηση):
Για Α(3) {
      .Χ++
      Τύπωσε .Χ
}

Μπαίνουν και φωλιασμένα με ξεχωριστές ή μη αγκύλες:
(εδώ βάζουμε διπλή τελεία για το δεύτερο)
Για Α(3), Α(4) {
     Τύπωσε .Χ, ..Χ
}
ή το οποίο φαίνεται μεν ίδιο αλλά εδώ έχουμε δυο μπλοκ "προσωρινών ορισμών"
Για Α(3) {

 Για Α(4) {
     Τύπωσε .Χ, ..Χ
 }
}

Ότι νέο φτιάξουμε στην Για αντικείμενο { } θα διαγραφεί στο πέρας αυτού.
Υπάρχει και αυτό:
Για Αυτό {
' εδώ βάζουμε προσωρινούς ορισμούς.
}

Τα αντικείμενα Ομάδα σε θέση δεν κάνουν συγχώνευση όταν εκχωρούμε νέο αντικείμενο. Αντίθετα πετάνε το παλιό και παίρνουν το νέο (όπως θα γίνονταν και με δείκτες, με τη διαφορά πως αν βάζαμε το δείκτη σε δυο θέσεις, τότε η αλλαγή δείκτη σε μια από αυτές θα διατηρούσε στην άλλη θέση το αντικείμενο, ή χωρίς αλλαγή ότι κάναμε στο ένα αντικείμενο θα φαίνονταν και στο άλλο αφού θα είχαμε δυο θέσεις δεικτών με κοινό δείκτη σε ένα αντικείμενο). Με τις ομάδες στη Μ2000 ξέρουμε σίγουρα ότι δεν υπάρχει δείκτης σε αυτές, και πως κάθε θέση έχει μοναδικό αντικείμενο.
'Οταν στην Για αντικείμενο {} ανοίξουμε ένα αντικείμενο στην ουσία βγάζουμε ένα αντίγραφο, κάνουμε τη δουλειά μας και το κλείνουμε διαγράφοντας το παλιό. Αν κάποιος διαβάσει το αντικείμενο στη θέση αυτή (μπορεί να γίνει στην Μ2000 αν υπάρχει μια αναμονή και τρέχει στο μεταξύ ένα  νήμα) πριν τερματίσει η Για τότε θα πάρει την αποθηκευμένη τιμή και όχι αυτήν στην Για. Για να την πάρει θα πρέπει να κλείσει η Για και να την μεταγράψει στη θέση της.