Δευτέρα, 8 Μαΐου 2017

Αντικείμενο Ομάδα (Πώς λειτουργεί)

Σε αυτήν την ανάρτηση θα δούμε τι είναι ένα αντικείμενο Ομάδα όπως το "λειτουργεί" ο διερμηνευτής.


Για να δούμε την ομάδα θα πρέπει να δούμε πως καταχωρούνται τμήματα και μεταβλητές από το διερμηνευτή.




Υπάρχουν δυο λίστες, μια η λίστα μεταβλητών και μια η λίστα τμημάτων/συναρτήσεων. Κάθε λίστα έχει δυο μέρη, το ένα είναι το ευρετήριο βάσει κλειδιού και το άλλο ο πίνακας τιμών. Οι λίστες είναι δυναμικές, αλλά δεν μπορούμε να διαγράψουμε οπουδήποτε αλλά μόνο από το τέλος. Στο τέλος είναι το πιο πρόσφατο δημιουργημένο. Το κλειδί ευθύνεται για το πώς κάτι είναι γενικό ή ανήκει κάπου. Το κλειδί λέγεται και ισχνή αναφορά εδώ.

Κάθε φορά που καλούμε ένα τμήμα δημιουργείται ένα αντικείμενο εκτέλεσης. Σε αυτό θα υπάρχει ένα αντίγραφο του κώδικα που θα καταναλωθεί, θα εκτελεστεί.Λέμε θα καταναλωθεί γιατί όντως εντολές που εκτελούνται διαγράφονται! Αν χρειάζεται κάτι να επαναληφθεί τότε υπάρχει αντίγραφο, αν έχουμε μπλοκ κώδικα, ή αν δεν υπάρχει (πχ εκτελούμε μια προς) τότε θα πάρει το αντικείμενο το κώδικα από εκεί που φόρτωσε πρώτη φορά, από το σημείο που πρέπει να τον εκτελέσει.

Στο αντικείμενο εκτέλεσης υπάρχουν διάφορα στοιχεία που του είναι γνωστά σε αυτό και μόνο. Στο παραπάνω διάγραμμα δεν φαίνεται η λειτουργία των νημάτων (θα δοθεί σε διαφορετικό διάγραμμα). Φαίνεται όμως ότι το αντικείμενο εκτέλεσης έχει τρία συστατικά (τουλάχιστον), το ένα είναι η λίστα στατικών μεταβλητών (είναι εκτός λίστας μεταβλητών, και αν δεν υπάρχουν είναι μηδενικού μήκους), το επόμενο είναι ένα ευρετήριο για ρουτίνες που ενημερώνεται κάθε φορά που ζητάμε μια ρουτίνα που δεν περιέχεται (άρα ξεκινάει το αντικείμενο με μηδενικού μήκους ευρετήριο), και το τελευταίο είναι η αποτύπωση του μεγέθους των λιστών των μεταβλητών και των τμημάτων συναρτήσεων που υπήρχαν κατά την εκκίνηση. Αυτό το τελευταίο είναι σημαντικό για την λειτουργία της γλώσσας. Κάθε φορά που το τμήμα τερματίζει διαγράφει ότι νέο υπάρχει στις λίστες, και έτσι υποχρεωτικά πρέπει να γνωρίζει ποιο είναι το παλιό! Η αποτύπωση γίνεται με δυο αριθμούς, ο ένας λέει πόσες μεταβλητές έχει η λίστα μεταβλητών και ο άλλος πόσα τμήματα/συναρτήσεις η λίστα τμημάτων και συναρτήσεων.

Στο σχήμα φαίνεται και ο σωρός τιμών. Τα τμήματα παρέχουν το δικό τους σωρό στα τμήματα που καλούν ενώ οι συναρτήσεις πάντα ξεκινούν με νέο με αρχικές τιμές τα ορίσματα σε αυτές. Οι σωροί είναι αντικείμενα.

Κάθε αντικείμενο εκτέλεσης ξέρει το όνομα αυτού που εκτελεί και μάλιστα το που θα βρει το κώδικα αν χρειαστεί να τον φορτώσει ξανά (ή μέρος αυτού, όπως γίνεται στις ρουτίνες). Οι ρουτίνες δεν έχουν δικό τους αντικείμενο εκτέλεσης.

Όταν θέλουμε να ορίσουμε ένα τμήμα απλά το γράφει ο διερμηνευτής στο πίνακα τμημάτων/συναρτήσεων και μαζί με το όνομα του τμήματος που το δημιούργησε (το οποίο γνωρίζει το αντικείμενο εκτέλεσης) μπαίνει ένα κλειδί στο ευρετήριο. Αν σε ένα τμήμα ορίσουμε ένα γενικό τμήμα, πάλι θα μπει και αυτό στον ίδιο χώρο, απλά στο όνομα του ευρετηρίου θα μπει το όνομα του τμήματος που ορίζουμε ως γενικό χωρίς πρόθεμα το όνομα του τμήματος. Το ευρετήριο δέχεται όμοια κλειδιά αλλά στην αναζήτηση δείχνει πάντα το τελευταίο που μπήκε. Με αυτόν τον τρόπο μια γενική μπορεί να σκιάσει μια υπάρχουσα γενική με το ίδιο όνομα (για όσο το αντικείμενο εκτέλεσης εκτελείται).

Οι λίστες δουλεύουν με ευρετήριο με συνάρτηση κατακερματισμού, και έχουν ένα πίνακα για το ευρετήριο μεγαλύτερο από τον αριθμό ονομάτων προς εύρεση. Με αυτόν τον τρόπο έχουμε λιγότερες πιθανότητες να πέφτουν στον ίδιο κωδικό (βγαλμένο από τη συνάρτηση κατακερματισμού), άλλα ονόματα. Δεν θέλουμε πολλές συγκρούσεις, γιατί αυτές σημαίνουν σειριακή αναζήτηση (παύει να χρησιμοποιείται το αποτέλεσμα της συνάρτησης κατακερματισμού και αναζητούμε σε συνδεδεμένη λίστα ονόματα σειριακά).

Στη λίστα μεταβλητών έχουμε την περίπτωση να έχουμε περισσότερες μεταβλητές από τις τιμές που δίνονται γι´ αυτές στο πίνακα τιμών. Αυτό μπορεί να συμβεί αν έχουμε μεταβλητές που είναι αναφορές σε άλλες. Η αναφορά δηλώνεται εσωτερικά ως τη θέση σε υπάρχον τιμή στο πίνακα τιμών. Επιπλέον στο ευρετήριο δηλώνεται ότι έχουμε αναφορά ώστε στην αποκατάσταση της λίστας (στο τέλος εκτέλεσης του τμήματος) να μην διαγραφεί η τιμή όπου δηλώνεται ότι είναι αναφορά.


Ο σωρός τιμών δεν έχει ονόματα, που σημαίνει ότι όταν βάζουμε το Α θα μπεί η τιμή του. Επειδή όμως χρησιμοποιείται για τις κλήσεις τμημάτων και συναρτήσεων, στο πέρασμα με αναφορά, το &Α θα γραφτεί ως ισχνή αναφορά. Στο διάγραμμα γράφει ότι τα ονόματα στην λίστα μεταβλητών λέγονται ισχνές αναφορές. Όταν μια Διάβασε στο τμήμα που καλέσαμε ζητάει έστω το &Χ τότε περιμένει να βρει ένα αλφαριθμητικό, και αυτό να του δώσει το δείκτη (τη θέση) στο πίνακα τιμών. Αν δεν συμβεί αυτό βγαίνει λάθος. Αν συμβεί τότε δημιουργείται μια  Χ ως αναφορά του Α (του προηγούμενου τμήματος), χωρίς να δημιουργηθεί νέα τιμή στο πίνακα τιμών.

Η ιδέα του αντικειμένου Ομάδα αρχικά ήταν να μπορούμε να δίνουμε με αναφορά μια ομάδα μεταβλητών, δηλαδή να περνάμε ένα αντικείμενο με μια λίστα ισχνών αναφορών. Η δημιουργία ομάδας στην ουσία είναι δημιουργία μεταβλητών και ενός αντικειμένου που λέει ποιες μεταβλητές συνιστούν την ομάδα. Στο ευρετήριο τα ονόματα των μεταβλητών παίρνουν ένα διπλό πρόθεμα, το όνομα από το τμήμα που ανήκουν και το όνομα της ομάδας. Ως τοπικές μεταβλητές στο τμήμα εμφανίζονται μόνο με το μισό πρόθεμα, το όνομα ομάδας. Έτσι η Ομάδα Άλφα {Χ=10, Υ=3} θα έχει τα Άλφα.Χ και Άλφα.Υ ως τοπικές μεταβλητές στο τμήμα που δημιουργήσαμε το Άλφα.

Αυτή η "ομαδοποίηση" με κοινό όνομα δεν θα είχε νόημα να λέγονταν ομάδα αν δεν γίνονταν λειτουργίες για όλα τα μέλη της ομάδας.

Σε επόμενο βήμα οι ομάδες απέκτησαν τμήματα και συναρτήσεις. Και αυτά γράφονται ως ανεξάρτητες οντότητες στην λίστα τμημάτων/συναρτήσεων με πρόθεμα το όνομα του τμήματος και το όνομα της ομάδας. Όμως εδώ ο πίνακας για το κώδικα έχει και ένα πεδίο ακόμα που γράφει το όνομα της ομάδας (ως ισχνή αναφορά). Όταν εκτελούμε ένα τμήμα ομάδας ο διερμηνευτής ετοιμάζει ένα αντικείμενο εκτέλεσης και το ενημερώνει ότι είναι τμήμα της ομάδας με συγκεκριμένη ισχνή αναφορά. Ας υποθέσουμε ότι η ομάδα έχει μια μεταβλητή Χ. Αν εμφανιστεί το  .Χ (δείτε την τελεία πριν το Χ) ή το Αυτό.Χ (είναι το ίδιο πράγμα), σε μια έκφραση τότε αυτόματα ο διερμηνευτής θα τον αναζητήσει βάζοντας ως πρόθεμα όχι το όνομα του τμήματος αλλά την ισχνή αναφορά στο αντικείμενο. Έτσι θα διαβάσει την τιμή της μεταβλητής Χ της ομάδας. Στην εκχώρηση τιμής πρέπει να δώσουμε το <= και όχι το = γιατί το δεύτερο φτιάχνει πάντα τοπικές μεταβλητές (αν χρειαστεί να ορίσει, πράγμα που δεν το κάνει στους πίνακες, αφού ορίζονται με την Πίνακας).

Ας δούμε όμως μια λειτουργία που αλλάζει την υπόσταση της ομάδας. Ουσιαστικά την αλλάζει σε αντίγραφο. Η βασική υπόσταση είναι το ανοικτό αντικείμενο, όπου όλα τα μέλη είναι στις λίστες, και μπορούν να βρεθούν άμεσα από τον διερμηνευτή. Η άλλη υπόσταση είναι το κλειστό αντικείμενο. Εκεί η ομάδα έχει σε δική της λίστα όχι μόνο ονόματα αλλά και τιμές, και δεν έχει κανένα μέλος στο πίνακα τιμών ή στο πίνακα κώδικα. Μια ομάδα ως κλειστό αντικείμενο δεν βρίσκεται καν σε ευρετήριο, γιατί δεν έχει όνομα. Μπορεί να βρίσκεται ως τιμή σε πίνακα, και άλλα αντικείμενα που δέχονται αντικείμενα (όπως η Κατάσταση και ο Σωρός),  στο σωρό τιμών του τμήματος/συνάρτησης (είναι και αυτός αντικείμενο Σωρός), και στην επιστροφή από παράσταση (ή αλλιώς τη λέμε δεξιά έκφραση, δεξιά του ίσον).

Άλλες γλώσσες προγραμματισμού δουλεύουν με αυτό που λέμε εδώ κλειστό αντικείμενο, ως αντικείμενο. Επίσης σε κάποιες γλώσσες το τι θα έχει ένα αντικείμενο το προδιαγράφει μια κλάση, η οποία με έναν τρόπο είναι συνδεδεμένη με τη κάθε νέα παρουσία αντικειμένου αυτής της κλάσης. Επειδή στη Μ2000 τα αντικείμενα είναι λίστες μελών δεν μας ενδιαφέρει να έχουν σύνδεση με προκαθορισμένη λίστα μελών, που προφανώς θα ήταν ένα άλλο αντικείμενο, και ίσως η όποια αλλαγή του άλλαζε όλα τα συνδεδεμένα αντικείμενα. Μπορούμε να έχουμε μια συνάρτηση να επιστρέφει αντικείμενο όπως το θέλουμε, ως κατασκευαστής αντικειμένων.  Τεχνικά τα αντικείμενα Ομάδα έχουν κοινή διεπαφή την οποία χειρίζεται ο διερμηνευτής. Προγραμματιστικά το κοινό το δημιουργεί ο τρόπος που φτιάχνουμε ομάδες. Μπορεί να φτιαχτεί μια ομάδα βηματικά (να προσθέτουμε) ή με αλλαγές (να αλλάζουμε κώδικα σε τμήματα ή συναρτήσεις της ομάδας), να προσθέσουμε κάτι πρόσκαιρα και να διαγράψουμε μετά (δεν θα φανεί αυτό σε αυτό το κείμενο). Πάντα θα βλέπουμε την ομάδα σαν μια οντότητα, με δικά της μέλη και όχι με δικό της τύπο. Ο τύπος εννοείται! Θα μπορούσε κανείς να βάζει μια μεταβλητή Τύπος$ και να γράφει το όνομα τύπου!

Καλύτερα όμως να έχουμε έναν κατασκευαστή που να φαίνεται ότι είναι ο τύπος.  Η εντολή Κλάση στην Μ2000 δημιουργεί μια συνάρτηση (γενική εκτός ομάδας, τοπική εντός ομάδας) που επιστρέφει μια ομάδα (ως κλειστό αντικείμενο, γιατί όπως αναφέρθηκε η επιστροφή από δεξιά έκφραση, όπως το =Κλάση1() είναι κλειστό αντικείμενο.



\\ αυτό το γράφουμε έστω στο τμήμα Β
Γενική Μ=30
Τμήμα Γενικό Α {
      \\ το τμήμα δεν θα έχει πρόθεμα το γονικο τμήμα
      \\ άρα θα είναι γενικό
      \\ Εντός όμως της Α δεν μπορεί να κληθεί
      \\ Δεν έχει αναδρομή το τμήμα με την απλή κλήση με το όνομα
      \\ Έχει αν κληθεί με την Κάλεσε Α
      \\ Οι συναρτήσεις έχουν αναδρομή.
      Ομάδα Άλφα {
            Χ=10
            Τμήμα Α {
                  Διάβασε Κ
                  Τύπωσε Κ *
                  <=Κ
            }
            Συνάρτηση Β (Ν){
                  \\ ο διερμηνευτής θα βάλει τη εντολή: Διάβασε Ν
                  \\ κατά την εγγραφή της συνάρτησης στη λίστα
                  =**Ν
            }
      }
      Πίνακας Α(10)
      Λίστα !
      Τμήματα ?
      Α(3)=Άλφα
      Α(3).Α 30
      \\ άλλαξε η τιμή της Χ στο Α(3)
      Τύπωσε Α(3).Χ, Άλφα.Χ
      Τύπωσε Τύπος$(Α(3)) \\ Group δηλαδή Ομάδα
}
Λίστα !
Τμήματα ?
Α    \\ καλούμε το Α μόνο με το όνομα





Αν το ανοικτό αντικείμενο (αν έχει όνομα είναι ανοικτό) Άλφα το δώσουμε ως τιμή σε νέο όνομα έστω Βήτα τότε ο διερμηνευτής πρώτα παράγει ένα κλειστό αντικείμενο με αντιγραφές όλων των μελών του Άλφα, για να βγάλει την δεξιά έκφραση, και μετά παράγει το Βήτα ως ομάδα, με όλα τα μέλη που δηλώνει το κλειστό αντικείμενο και το πετάει. Μετά το Βήτα=Άλφα θα υπάρχουν δυο ομάδες με ίδιες τιμές, αλλά όχι αναφορές του Άλφα στο Βήτα. Μπορούμε δηλαδή να αλλάζουμε τιμές σε όποιο θέλουμε.
Αν δίναμε την εντολή Ένωσε Άλφα στο Βήτα τότε θα είχαμε ένα Βήτα με όλα τα μέλη σε αναφορά στο Άλφα. Το ίδιο θα γίνονταν αν δίναμε Βάλε &Άλφα και μετά το Διάβασε &Βήτα. Και στις δυο περιπτώσει το Βήτα πρέπει να είναι νέο όνομα (να μην έχει χρησιμοποιηθεί στο ίδιο τμήμα/συνάρτηση,  γιατί όπως αναφέρθηκε μια μεταβλητή με αναφορά δεν μπορεί να πάρει άλλη αναφορά, ενώ οποιαδήποτε μεταβλητή, ακόμα και αυτή που είναι αναφορά σε άλλη μπορεί να δώσει νέα αναφορά, σε νέο όνομα).

Συγχώνευση

Μια λειτουργία που δεν έχει φανεί ακόμα είναι η συγχώνευση ομάδας. Αν το Βήτα είναι ήδη ομάδα τότε το Βήτα=Άλφα θα εκτελεστεί ως εξής: Θα δημιουργηθεί το κλειστό αντικείμενο του Άλφα και θα συγχωνευθεί στο Βήτα. Αν υπάρχουν μέλη με ίδιο όνομα τότε το Βήτα θα αλλάξει τιμές σε αυτά, αν όχι τότε το Βήτα θα τα αποκτήσει!

Θέση σε Πίνακα

Αν έχουμε τον πίνακα Α(10) (με δέκα στοιχεία και έστω με Βάση 0, με θέσεις από 0 έως 9), τότε με την Α(0)=Άλφα βάζουμε το κλειστό αντικείμενο στο Α(0). Αν υπήρχε ένα άλλο ήδη στην θέση αυτή θα διαγραφεί και θα μπει το νέο.
Οι πίνακες είναι αντικείμενα στην Μ2000. Στην λίστα μεταβλητών κάθε πίνακας πιάνει μια θέση. Για το λόγο αυτό δεν μπορούμε να έχουμε αναφορά σε θέση πίνακα (αφού αναφορές γίνονται μόνο σε ότι είναι στο ευρετήριο). Μπορούμε όμως να έχουμε αναφορά σε όλο το πίνακα. Κάθε στοιχείο πίνακα (κάθε θέση αν το πούμε αλλιώς) εσωτερικά είναι τύπου Variant, που σημαίνει ότι μπορεί να είναι αριθμός, αλφαριθμητικό ή αντικείμενο. Έτσι ενώ δημιουργούμε πίνακα για αριθμούς μπορούμε να βάλουμε αντικείμενα στις θέσεις του.

Μια ομάδα επιστρέφει εκτός από το κλειστό αντικείμενο και το μηδέν σε εκφράσεις. Το αντικείμενο που μένει μπορεί να το χρησιμοποιήσει ο διερμηνευτής σε εκχώρηση. Ειδικά στις τελευταίες εκδόσεις της γλώσσας τα αντικείμενα μπορούν να πάρουν Αξία, μια συνάρτηση Αξία { } που επιστρέφει κάποια τιμή. Σε αυτήν την περίπτωση το αντικείμενο Ομάδα δεν επιστρέφει κλειστό αντικείμενο αλλά τιμή. Η συνάρτηση Ομάδα() παίρνει μια ομάδα και είτε αυτή γυρνάει το κλειστό αντικείμενο ή μια τιμή, δίνει πάντα το κλειστό αντικείμενο.

Εκτός από τα Τμήματα και τις Συναρτήσεις μπήκαν στις ομάδες και οι Τελεστές. Οι τελεστές δουλεύουν όταν ο διερμηνευτής βρίσκει ομάδα. Αν έχουμε Αξία τότε δεν βρίσκει ομάδα ο διερμηνευτής αλλά την αξία. Βρίσκει όμως σε αριστερή έκφραση (αριστερά του =), ή αν έχουμε ανοικτό αντικείμενο τότε βρίσκει αν έχουμε το Ομάδα(Άλφα) οπότε λειτουργεί ο τελεστής.

Οι ομάδες μπορούν να έχουν όνομα αλφαριθμητικής μεταβλητής. Σε αυτή την περίπτωση μπορούμε να παίρνουμε τιμή από την ομάδα αλφαριθμητικό, ή αν θέλουμε να δίνουμε τιμή αλφαριθμητικό. Το τι ακριβώς θα κάνουμε την τιμή το περιγράφουμε στη Θέσε {}, και ομοίως το πώς εξάγεται η τιμή από την ομάδα το περιγράφουμε με την Αξία {}.

Μια ομάδα μπορεί να έχει δημόσια ή και ιδιωτικά μέλη. Τα ιδιωτικά μέλη δεν εμφανίζονται στο τμήμα, παρά μόνο εντός της ομάδας. Αφού όμως είδαμε ότι όλα τα μέλη είναι ανεξάρτητα, τότε το ερώτημα που προκύπτει είναι "πώς κρύβονται"; Λοιπόν το κρύψιμο είναι εύκολο γιατί απαιτείται ένας χαρακτήρας πριν από το όνομα του μέλους να δηλώνει ότι είναι κρυφό, και τον βάζει αυτόν στον ορισμό του μέλους, αφού δηλωθεί μετά την ετικέτα Ιδιωτικό:. Όταν εντός ενός τμήματος ή μιας συνάρτησης που συνδέεται με μια ομάδα αναζητούμε την .Χ που είναι κρυφή τότε ο διερμηνευτής τη ζητάει ως φανερή και  δεν θα την βρει, οπότε την ζητάει ως κρυφή (βάζει το χαρακτήρα που το δηλώνει), και έτσι τη βρίσκει!

Όταν μια ομάδα έχει άλλες ομάδες στην ουσία έχει για κάθε περιεχόμενη ομάδα ένα αντικείμενο ομάδα και τις μεταβλητές χωριστά (όσο είναι ανοικτό), ενώ όταν έχουμε κλειστό αντικείμενο, όλα αυτά βρίσκονται στην λίστα της ομάδας που περιέχει τις άλλες. Ένα τμήμα περιεχόμενης ομάδας σε ομάδα βλέπει μόνο τις μεταβλητές τις δικές του και της ομάδας του, αλλά όχι της ομάδας που περιέχεται η ομάδα του. Μπορεί να δει όμως τις μεταβλητές που περιέχονται σε ομάδες που περιέχει η ομάδα του (αρκεί να μην είναι ιδιωτικές).

Στις νεότερες εκδόσεις υπάρχουν οι Ιδιότητες, που είναι ομάδες με τιμές, και ορίζουμε αν θα έχουν τις συναρτήσεις αξία ή και θέσε (αν θα δίνουν ή και παίρνουν τιμή). Παράλληλα μπορούμε να ορίσουμε ιδιότητες σε ιδιότητες (αφού είναι ομάδες σε ομάδες), τμήματα και συναρτήσεις. Το πρόβλημα που ίσως να μην φάνηκε στην προηγούμενη παράγραφο, επιλύθηκε εδώ, με μια ειδική ένωση μεταβλητής με μεταβλητή στη γονική ομάδα. (ενώ κανονικά δεν μπορούμε να δούμε τη μεταβλητή της γονικής ομάδας, μέσω ειδικής εντολής γίνεται). Αυτή η εντολή δουλεύει με χρήση του αντικειμένου εκτέλεσης (διότι το τμήμα της ομάδας έχει δικό του αντικείμενο εκτέλεσης και υπάρχει τρόπος να δούμε μεταβλητές στο γονικό αντικείμενο, εκεί που υπάρχει η ομάδα και η γονική ομάδα). Η ιδιότητα ως εντολή ορισμού δημιουργεί μια κρυφή μεταβλητή στην ομάδα και φτιάχνει μια ομάδα που χειρίζεται αυτήν την μεταβλητή (με χρήση της ειδικής ένωσης). Έτσι αν μια ιδιότητα οριστεί να έχει μόνο αξία, να επιστρέφει δηλαδή μόνο τιμή, άρα να μην δέχεται τιμή (να μην γίνεται εκχώρηση), δεν σημαίνει ότι δεν μπορεί μέσα από την ομάδα που έχει την ιδιότητα να αλλάξει τιμή, απλά αλλάζουμε τιμή στην κρυφή μεταβλητή.

Σε μια Ιδιότητα Βήτα {Αξία}=10 φτιάχνεται μια [Βήτα] με τιμή 10. Σε ένα τμήμα της ομάδας που περιέχει την Βήτα μπορούμε να δούμε την .Βήτα ως μόνο για ανάγνωση και την .[Βήτα] για ανάγνωση και εγγραφή. Έξω όμως από την ομάδα η [Βήτα] δεν υπάρχει, είναι κρυφή. Οι ιδιότητες είναι πάντα δημόσιες (ενώ οι πραγματικές τους μεταβλητές είναι ιδιωτικές). Μπορούμε να μην χρησιμοποιήσουμε την κρυφή μεταβλητή και να φτιάξουμε ιδιότητες απευθείας με την εντολή Ομάδα και όπως τις θέλουμε, ή να χρησιμοποιήσουμε το Αξία {} και Θέσε {} εντός του ορισμού της ιδιότητας και να κάνουμε κάποιους υπολογισμούς για το πώς θα διαμορφωθεί η τελική τιμή, ή πώς θα διαμορφωθεί η εκχώρηση. Τέλος οι ιδιότητες μπορούν να δέχονται και δείκτες, έτσι μια ιδιότητα Χ μπορεί να έχει δείκτη στην εισαγωγή, ή και στην εξαγωγή τιμής.


Εδώ έχουμε ένα παράδειγμα με μια ομάδα ως μια ιδιότητα. Παίρνει τιμή με δείκτη, και δίνει τιμή με δείκτη. Ο διερμηνευτής ένα Βήτα( θα το ψάξει πρώτα ως πίνακα και αν δεν το βρει ως ομάδα Βήτα (αν δεν την βρει τότε κάνει αναζήτηση ρουτίνας γιατί οι ρουτίνες καλούνται με τη Διαμέσου ή χωρίς αυτήν με όνομα και παρενθέσεις, με ή χωρίς ορίσματα). Εδώ θα το βρει ως ομάδα, θα δει ότι έχει τη θέσε (τη βλέπει από μια σημαία μέσα στο αντικείμενο), θα δει ότι η θέσε έχει παραμέτρους και θα περάσει τα ορίσματα στο σωρό, μετά θα βάλει στο σωρό το αποτέλεσμα της έκφρασης  και θα καλέσει την Θέσε. Εδώ διαβάζουμε το .Μ (που είναι κρυφή στην Βήτα) και την διαιρούμε με τον δείκτη.

Ομάδα Βήτα {
Ιδιωτικό:
      Μ
Δημόσιο:
      Αξία (χ) {
            =*Χ
      }
      Θέσε (χ) {
           Διάβασε .Μ
           /=Χ
      }
}
βήτα(2)=10
Τύπωσε βήτα(2), βήτα(4)
βήτα(10)=2
Τύπωσε βήτα(2), βήτα(4), βήτα(10)



Το παρακάτω παράδειγμα έχει μια ομάδα που γυρνάει αριθμό. Μπορούμε όμως να χειριστούμε την ομάδα και σαν ομάδα. Εδώ φαίνεται πως βάζουμε στους τελεστές την Διάβασε και την Βάλε ανάλογα την περίπτωση. Επίσης μπορούμε να κάνουμε συγχώνευση, ή επιλεκτική συγχώνευση (πχ αντί να διαβάζουμε το Αυτό να διαβάσουμε ένα Μ και από αυτό να πάρουμε αυτό που θέλουμε

Ομάδα Άλφα {
      Κ=10, Λ=30
      Αξία {
            =*
      }
      Συνάρτηση Αυτό {
            =Ομάδα(Αυτό)
      }
      Τελεστής "+" {
            Διάβασε Μ \\ ομάδα
            +=Μ.Κ
            +=Μ.Λ
      }
      Τελεστής "+=" {
            Διάβασε Μ \\ αριθμός
            +=Μ
            +=Μ
      }
      Τελεστής ">" {
            Διάβασε Μ \\ ομάδα
            Βάλε Μ.Κ> και Μ.Λ>
      }
      Θέσε {
            Αν Ταύτιση("Ο") τότε {
                  Διάβασε Αυτό
             \\ ή κάνουμε επιλεκτική συγχώνευση
             \\ σε τιμές
             \\  .Κ<=Μ.Κ
             \\  .Λ<=Μ.Λ
            } Αλλιώς Λάθος "Περίμενα Ομάδα"
   
      }
}
Τύπωσε Άλφα
Βήτα=Άλφα.Αυτό()
Τύπωσε Βήτα.Αυτό()>Άλφα.Αυτό()
Βήτα+=10
Δέλτα=Αλφα.Αυτό()+Βήτα.Αυτό()
Τύπωσε Δέλτα, Αλφα+Βήτα
Τύπωσε (Άλφα.Κ+Βήτα.Κ)*(Άλφα.Λ+Βήτα.Λ), (Άλφα.Κ*Αλφα.Λ)+(Βήτα.Κ*Βήτα.Λ)
Τύπωσε Βήτα.Αυτό()>Άλφα.Αυτό()
Τύπωσε Βήτα>Άλφα, Βήτα, Άλφα
Βήτα=Άλφα.Αυτό()
Τύπωσε Βήτα>Άλφα, Βήτα, Άλφα
 

Δείτε ότι στην σύγκριση η Μ είναι η ομάδα αριστερά του > και εδώ βάζουμε στο σωρό μια τιμή. Στο τελεστή "+" δεν βάζουμε κάτι και βάζει ο διερμηνευτής το "Αυτό". Στην "+=" ο τελεστής επιδρά στο αντικείμενο αριστερά του, ενώ στο "+" δεν επιδρά σε κανένα, γιατί στην δεξιά έκφραση έχουμε κλειστά αντικείμενα που ανοίγει πρόσκαιρα ο διερμηνευτής.

Οι συναρτήσεις των Τελεστών βλέπουν το σωρό του τμήματος που είναι η έκφραση που περιέχονται. Δεν υπάρχει το =τιμή_οποιαδήποτε που θα είχε μια κανονική συνάρτηση ως επιστροφή τιμής. Ο τύπος κλήσης είναι παρόμοιος με το Κάλεσε Συνάρτηση1() όπου και εδώ δεν έχουμε επιστροφή τιμής και ο σωρός είναι ο σωρός του τμήματος/συνάρτησης που εκτελεί αυτή την εντολή.


Στο blog αυτό υπάρχουν πολλά παραδείγματα με ομάδες, που χρησιμοποιούνται σε πίνακες. Αν ένας πίνακας δηλωθεί ότι έχει μια συγκεκριμένη ομάδα τότε ο διερμηνευτής βάζει τα τμήματα, τις συναρτήσεις, και τους τελεστές σε μια ξεχωριστή θέση στο αντικείμενο πίνακα, και όλα τα κλειστά αντικείμενα έχουν μια μετατροπή που έμμεσα βλέπουν αυτή τη θέση. Έστω στον Α() έχουμε όλες τις θέσεις με ομάδες με κοινά τμήματα/συναρτήσεις/τελεστές, και στο Β() έχουμε απλά αριθμούς (πχ το 0). Η Β(3)=Α(2) θα μετατρέψει το Β(3) σε ομάδα, και θα έχει ένα αντίγραφο του Α(2), μαζί όμως με τα τμήματα/συναρτήσεις/τελεστές.


Στο παράδειγμα χρησιμοποιώ μια κλάση (μια συνάρτηση που γυρνάει ομάδα), και εκεί έχω δηλώσει την ΡιζαΧ ως ιδιότητα μόνο για ανάγνωση. Συνδέω το γονικό Χ με μια τοπική Χ και δίνω στην Αξία το Ρίζα(Χ). Η κρυφή μεταβλητή [ΡίζαΧ] δεν χρησιμοποιείται. Εξ ορισμού οι πίνακες έχουν βάση 0. Μπορεί να αλλάξει με την εντολή Βάση 1 ή πρόσκαιρα μετά την Πίνακας...πχ Πίνακας Βάση 1, Α(10)=1 θα δώσει το Α(1)...Α(10) με 1 το καθένα.

Κλάση Άλφα {
Ιδιωτικό:
      Χ=10
Δημόσιο:
      Τμήμα ΔείξεΧ {
            Τύπωσε .Χ
      }
      Ιδιότητα ΡίζαΧ {
            Αξία {
                  Ένωσε Γονικό Χ στο Χ
                  Αξία=Ρίζα(Χ)
            }
      }
      Θέσε {
            Διάβασε .Χ
      }
}
Πίνακας Α(10)=Άλφα(), Β(5)=100
Β(
3)=Α(5)
Τύπωσε Β(3).ΡίζαΧ, Β(4)
Α(
5)=20
Τύπωσε Α(5).ΡίζαΧ
\\ η Στη κάνει αυτό Βάλε Β(3) : Διάβασε Α(5)
\\ Α(5)=Β(3) θα έδινε ομάδα αντί για αριθμό στο .Χ
Στη Α(5)=Β(3)
Τύπωσε Α(5).ΡίζαΧ









Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου