Τετάρτη, 7 Μαΐου 2014

Κλάσεις - Αντικείμενα

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

Έγιναν αλλαγές για να τρέχει στην έκδοση 8.6 αναθεώρηση 6 για να γυρίσει η συμβατότητα ως είχε
Το γράφουμε σε ένα τμήμα έστω Α

Τμημα ΕΝΑΕΠΙΠΕΔΟ {
                Τμημα ΕΝΑΕΠΙΠΕΔΟΚΑΤΩ {
                      ' Όταν τρέχει ένα τμήμα το περιβάλλον της Μ2000 αντιγράφει το κείμενό του σε ένα και μόνο αλφαριθμητικό!
                      ' Σε αυτό αφαιρούνται οι εντολές που έτρεξαν. Σε περίπτωση επανάληψης το κομάτι έχει κρατηθεί για το σκοπό αυτό
                      ' Μπορούμε όμως να δώσουμε με την  Ενθεση άμεσα κώδικα για τρέξιμο
                      ' Θα φτιάξω μια κλάση με μια μεταβλητή που θα βλέπουν όλες
                      ' καθώς και ένα πρότυπο με το οποίο θα κατασκευάζω νέες παρουσίες
                      ' Θα χρησιμοποιώ τα @@ εντός του πρότυπου για να περνάω το όνομα
                      ' της νέας παρουσίας
                      ' φτιάχνω μια σφαιρική (τοπικά) μεταβλητή που μπορούν να την διαβάζουν και όλα τα τμήματα που θα τρέξουν εδώ!
                      'Στην 8.1 ήθελε αυτό: Γενική ΔΙΚΟΜΟΥ.ΓΕΝΙΚΟ = 1000
                      ΔΙΚΟΜΟΥ@ΓΕΝΙΚΟ = 1000
                      ΤΕΛΕΥΤΑΙΑ@ΚΛΑΣΗ$ = "" ' θα δημιουργούμε μια συνδεδεμένη λίστα και αυτή η μεταβλητή θα δείχνει τη κορυφή της λίστας
                      ' ακολουθεί μια μεταβλητή που παίρνει κείμενο, το οποίο όμως θα γίνει ο κατασκευαστής της κλάσης μας!
                      ΓΕΝΙΚΟ@ΠΡΩΤΟ$ = {
' το @ στο όνομα της μεταβλητής την κάνει σφαιρική μεταβλητή (κάτι ως FRIEND σε άλλες γλώσσες)
' και θα διαβάζεται όσο υπάρχει το τμήμα που την έφτιαξε
' και δεν θα φτιάξουμε τοπική μεταβλητή με το ίδιο όνομα (αν ξεχάσουμε να βάλουμε το @ στο όνομα όταν είναι αριστερά στο =)
' αλλιώς θα γίνει σκίαση...θα βρίσκει την τοπική και όχι την σφαιρική
ΒΑΛΕ ΤΜΗΜΑ$ ' βάζουμε στο σωρό το όνομα του τμήματος που θα κάτσει η παρουσία, του γονικού τμήματος
ΤΜΗΜΑ @@ ' εδώ έχουμε το όνομα της παρουσίας...θα το κάνουμε όνομα του τμήματος (με αλλαγή του @@ με το όνομα)
ΔΙΑΒΑΣΕ ΓΟΝΙΟΣ$ ' κρατάμε το όνομα του τμήματος στον ΓΟΝΙΟΣ$ η οποία είναι ιδιότητα του @@
ΕΠΟΜΕΝΗΚΛΑΣΗ$=ΤΕΛΕΥΤΑΙΑ.ΚΛΑΣΗ$ ' στην ιδιότητα ΕΠΟΜΕΝΗΚΛΑΣΗ$ βάζουμε την μέχρι τώρα κορυφή
ΤΕΛΕΥΤΑΙΑ@ΚΛΑΣΗ$="@@" 'και εδώ αλλάζουμε κορυφή, έτσι μόλις συνδέσαμε τη παρουσία @@
a=1 ' ακολουθούν τρεις ιδιότητες
b=2
n$="no man"
' ακολουθεί ένας πίνακας (από την έκδοση 6.1 έχουμε και αλλαγή διαστάσεων και μεγέθους με χρήση πάλι της DIM με το ίδιο όνομα
' ή ακόμα καλύτερα με πέρασμα αναφοράς σε συνάρτηση και εκεί αλλαγή μεγέθους ...π.χ. να πάρει ένα ακόμα στοιχείο!
ΠΙΝΑΚΑΣ a(10)
ΣΥΝΑΡΤΗΣΗ personal {
' Αυτή είναι η "προσωπική" συνάρτηση καλούμε συναρτήσεις με personal() χωρίς παράμετρο
' Στην Μ2000 τα ορίσματα των συναρτήσεων δεν είναι προκαθορισμένα! Μπορούμε να καλέσουμε
' τη συνάρτηση με ότι ορίσματα θέλουμε. Αρκεί να έχουμε κανονίσει ένα τρόπο να τα διαβάζουμε.
' και παραπάνω να βάλουμε δεν πειράζει!
' Για κάθε παρουσία θα υπάρξει μια νέα συνάρτηση.
' η c είναι τοπική στη συνάρτηση, ΔΙΚΟΜΟΥ@ΓΕΝΙΚΟ είναι σφαιρική, την βλέπουν όλες οι παρουσίες
' @@.a και @@.bb είναι ιδιότητες της κλάσης και πρέπει να γίνει αναφορά με το όνομα της παρουσίας
' εδώ δεν το γνωρίζουμε επειδή είναι το πρότυπο.
c=12
ΔΙΚΟΜΟΥ.ΓΕΝΙΚΟ++ \\έβγαλα το @ γιατί δίνει λάθος στην 8
\\ ΔΙΚΟΜΟΥ@ΓΕΝΙΚΟ++ ' από την έκδοση 6.3 έχω βάλει τα ++ -- += -= /= και *= για μεταβλητές (όχι για στοιχεία πινάκων)
'ΔΙΚΟΜΟΥ@ΓΕΝΙΚΟ=ΔΙΚΟΜΟΥ@ΓΕΝΙΚΟ+1
' η συνάρτηση δεν έχει "return" για επιστροφή τιμής αλλά = και η επιστροφή γίνεται στην αγκύλη τέλους.
=(@@.a+@@.b)*ΔΙΚΟΜΟΥ.ΓΕΝΙΚΟ+c ' στο δεξί μέρος η σφαιρική μεταβλητή μπορεί να γραφεί και με τελεία στη θέση του @
}
ΤΜΗΜΑ ΓΟΝΙΟΣ$ 'στο τέλος του πρότυπου επαναφέρουμε το όνομα του τμήματος σε αυτό του γονικού.
'πάνω σε αυτήν την δυνατότητα στήριξα όλο αυτό!
}
                      ' τώρα θα δώσουμε συναρτήσεις που θα έχουν να κάνουν με οποιαδήποτε παρουσία της κλάσης. Για να κάνουμε δοκιμές!
                      ' θα πρέπει να δίνουμε το όνομα σε αλφαριθμητικό και είναι λογικό αφού θα θέλουμε να έχουμε μια λίστα με ονόματα παρουσιών
          
                      Τμημα ΕΜΕΝΑ.ΘΕΣΕ {
                            Διαβασε ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$ : Τμημα ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$
                                  ' διαβάζουμε το όνομα παρουσίας και το κάνουμε όνομα τμήματος (namespace)
                            Διαβασε a, b, n$ ' διαβάζουμε απ΄ευθείας από το σωρό και τοποθετούμε τιμές στις ιδιότητες a, b, n$
                                                          'υποθέτουμε ότι θα στέλνουμε τιμές για αυτές τις ιδιότητες.
                            Τμημα ΓΟΝΙΟΣ$ ' επαναφέρουμε το όνομα του τμήματος με το όνομα του γονικού (να γιατί το κρατήσαμε)
                      }
                      Τμημα ΕΜΕΝΑ.ΤΥΠΩΣΕ {
                            Διαβασε ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$ : Τμημα ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$
                            Print a, b, n$ ' εδώ τυπώνουμε τις ιδιότητες (στις κλάσεις οι μεταβλητές που ανήκουν σε παρουσίες και έχουμε εξωτερική
                                                          ' πρόσβαση λέγονται ιδιότητες
                            Module ΓΟΝΙΟΣ$
                      }
                      ' Άρα μέχρι εδώ έχουμε φτιάξει πρότυπο, σφαιρικές μεταβλητές, μια για παράδειγμα και μια για λειτουργία λίστας
                      ' Και έχουμε φτιάξει μια συνάρτηση (μέθοδο της κλάσης) για την κάθε παρουσία ξεχωριστά και
                      ' δυο τμήματα, το ένα βάζει τιμές, το άλλο τυπώνει, για όλες τις παρουσίες της κλάσης.
          
                      ' Από εδώ ξεκινούν τα μαγικά!
                      ' Φτιάχνουμε ένα αλφαριθμητικό το οποίο θα μπει με μια ΕΝΘΕΣΗ (ένθεση κώδικα) τέσσερις φορές, μία για κάθε παρουσία
                      ' Το αλφαριθμητικό αυτό περιέχει μια εντολή ΕΝΘΕΣΗ που βάζει το αποτέλεσμα μιας Αλλαγη$( η οποία αλλάζει τα @@ με το ΝΑΗΚΛΑΣΗΜΟΥ$
                      ' στο πρότυπο ΓΕΝΙΚΟ@ΠΡΩΤΟ$
                      ' Έτσι μέσα στο Για {} θα έρθει και θα τρέξει τέσσερις φορές το πρότυπο με το σωστό όνομα παρουσίας,
                        ' Και θα αφήσει μεταβλητές Και συναρτήσεις.
                      ' θα μπορούσα να δώσω απευθείας το Ενθεση Αλλαγη$("@@",ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$,ΓΕΝΙΚΟ@ΠΡΩΤΟ$ ) αλλά ήθελα να φανεί το όνομα της κλάσης!
                      
                      ΝΑΗΚΛΑΣΗΜΟΥ$ = {Ενθεση Αλλαγη$("@@", ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$, ΓΕΝΙΚΟ@ΠΡΩΤΟ$ )}
                      Βαλε "ena", "allo", "ekeino", "kaiafto"
                      Για i = 1 Εως 4 {
                            Διαβασε ΟΝΟΜΑΠΑΡΟΥΣΙΑΣ$
                            Ενθεση ΝΑΗΚΛΑΣΗΜΟΥ$ 'καλούμε τον κατασκευαστή της κλάσης, βάζοντας κώδικα (στο αλφαριθμητικό που "τρέχει")!
                      }
                      ' τα μαγικά δεν σταματούν εδώ. Καθώς φτιάχνονταν τα παραπάνω...φτιάχνονταν και η συνδεδεμένη λίστα
                      ' Η οποία χρειάζεται για να αλλάξει την σειρά ή να διαγράψει κανείς κάποια παρουσία από τη σειρά!
                      ' Ας γεμίσουμε τις παρουσίες με στοιχεία (φαίνεται πως μπορούν να περάσουν και με Σειρα ή με Εισαγωγη από αρχείο!
                      ' Αυτός είναι ο Serialize τρόπος, ή σειριακός χειρισμός. Ο άλλος είναι να γίνεται ανά ιδιότητα το διάβασμα και το γράψιμο.
                      ΕΜΕΝΑ.ΘΕΣΕ "ena", 1, 2, "aaaaaaaa" 'οι τιμές πάνε στα αντικείμενα τα οποία περνάμε με όνομα
                      ΕΜΕΝΑ.ΘΕΣΕ "allo", 4, 5, "bbbbbbb" ' Η 6η έκδοση δεν γνωρίζει από κλάσεις!
                      ΕΜΕΝΑ.ΘΕΣΕ "ekeino", 7, 8, "ccccccccc"
                      ΕΜΕΝΑ.ΘΕΣΕ "kaiafto", 100, 120, "ok"
                      ' θα τυπώσω μόνο για το "ενα"
                      ΕΜΕΝΑ.ΤΥΠΩΣΕ "ena"
                      Τυπωσε "Τώρα όλα μαζί"
                      ' τώρα θα σβήσω το σωρό γιατί η Σειρα βάζει από το τέλος
                      Αδειασε ' αν και δεν περίμενα τίποτα εκεί, η καλή συνήθεια δεν βλάπτει!
                      Σειρα "ena", "allo", "ekeino", "kaiafto"
                      Για i = 1 Εως 4 {ΕΜΕΝΑ.ΤΥΠΩΣΕ }' δεν δίνω παράμετρο άμεσα στο Τμήμα, έχω δώσει στο σωρό.
                      ' χωρίς ΑΔΕΙΑΣΜΑ με την flush ή Αδειασε
                      Βαλε "kaiafto", "ekeino", "allo", "ena" ' με την ανάποδη σειρά ΤΕΛΕΥΤΑΙΟ ΜΠΑΙΝΕΙ ΠΡΩΤΟ ΒΓΑΙΝΕΙ (LIFO)
                      Για i = 1 Εως 4 {ΕΜΕΝΑ.ΤΥΠΩΣΕ }' πάλι ξανά
          
                      ' Ανά ιδιότητα χειρισμός:
                      ena.a( 4 ) = 1000 ' γράφουμε στον πίνακα του ena
                      Τυπωσε "ena.a(4)=" ; ena.a( 4 ) ' τυπώνουμε από τον πίνακα
                      ' θα καλέσουμε την συνάρτηση της ena τρεις φορές.
                      Για i = 1 Εως 3 {
                            Τυπωσε "ena.ΠΡΟΣΩΠΙΚΗ()=" ; ena.personal( ) ' η οποία χρησιμοποιεί ιδιότητες, σφαιρική μεταβλητή και τοπικές μεταβλητές.
                      }
                      ' Αλλάζω με σειριακό χειρισμό
                      ΕΜΕΝΑ.ΘΕΣΕ "allo", 1000, 2000, "George"
                      Τυπωσε "allo.n$=" ; allo.n$ ' ενώ διαβάζω με χειρισμό ανά ιδιότητα
                      Τυπωσε "allo.ΠΡΟΣΩΠΙΚΗ()=" ; allo.personal( ) ' εδώ καλώ την μέθοδο
                      kaiafto.a( 6 ) = 4
                      ' Πάμε στο τελευταίο μέρος των μαγικών όπου θα δούμε όλες τις παρουσίες
                      ' με γνώση μόνο ενός αντικειμένου, αυτού που είναι στην κορυφή στην ΤΕΛΕΥΤΑΙΑ@ΚΛΑΣΗ$
          
                      ' Θα ξαναφτιάξουμε ένα κώδικα σε αλφαριθμητικό, επειδή θέλουμε να τον καλέσουμε χωρίς να είναι σε τμήμα.
                      ' Γιατί όλες οι παρουσίες μας ανήκουν σε αυτό το τμήμα και κάθε Ενθεση βάζει κώδικα γι΄αυτό το τμήμα!
                      ' Επιπλέον θέλουμε να προσθέσουμε συνάμα και μια νέα ιδιότητα την check
                      ' η οποία θα έχει ρόλο σε αυτό τον κώδικα. θα καλέσουμε τον ίδιο κώδικα δυο φορές.
                      ' Την πρώτη φορά θα φτιάξει την ιδιότητα και θα τυπώσει όλα τις παρουσίες
                      ' Μετά θα αλλάξουμε μόνο την ιδιότητα σε μια συγκεκριμένη παρουσία.
                      ' Θα ξανά τρέξουμε τον ίδιο κώδικα και τώρα η ιδιότητα θα αλλάξει το τρόπο εμφάνισης αποτελεσμάτων!
                      ' Θα εξαιρέσει την παρουσία εκείνη για την οποία αλλάξαμε την ιδιότητα check.
          
                      ΣυνδεδεμενηΛιστα$ = {
' έχουμε βάλει στο σωρό την κορυφή της λίστας
Επαναλαβε {
Τμημα Γραμμα$ 'καθορίζουμε το όνομα του τμήματος (η letter$ ή Γραμμα$ σηκώνει το αλφαριθμητικό από τον σωρό)
' δείτε πως η αλλαγή έγινε μέσα το repeat για να γλιτώσουμε μια εντολή!
' Κοιτάμε με την valid() ή ΕΓΚΥΡΟ() αν υπάρχει η check, αν όχι τότε την φτιάχνουμε και βάζουμε τιμή
' αυτή θα φτιαχτεί για τον χώρο ονόματος module$ (μπορούμε να το διαβάσουμε σε αυτήν την μεταβλητή)
' ο οποίος είναι αυτό που περάσαμε παραπάνω στην module
Αν Οχι Εγκυρο(check) Τοτε check=Αληθης
Αν check Τοτε { ' τώρα θα υπάρχει η check
Τυπωσε "Αντικείμενο:";Τμημα$ ,, ' τυπώνουμε όνομα
Τυπωσε ">>>>>>>>>>>>>>>>";n$,, ' και ένα στοιχείο, για γούστο!
}
Βαλε ΕΠΟΜΕΝΗΚΛΑΣΗ$ ' Είχαμε κρατήσει όμως την επόμενη παρουσία και την βάζουμε στο σωρό (για να διαβαστεί από την Γραμμα$)
} Μεχρι ΕΠΟΜΕΝΗΚΛΑΣΗ$="" ' συνεχίζουμε μέχρι το τέλος όπου δεν υπάρχει επόμενη παρουσία.
Διαβασε ΑΔΕΙΟ$ ' πετάμε το "", ' μπορούμε να αδειάσουμε το σωρό FLUSH ΑΔΕΙΑΣΕ
Τυπωσε "Όνομα Τμήματος:";Τμημα$ ' εδώ έχει γυρίσει το όνομα στο σωστό χωρίς να δώσουμε εντολή!
' αυτό συμβαίνει γιατί με το πέρας της repeat το όνομα επανήλθε

}
                      Βαλε ΤΕΛΕΥΤΑΙΑ.ΚΛΑΣΗ$ ' Αυτό είναι το "ena"
                      Ενθεση ΣυνδεδεμενηΛιστα$ ' μπαίνει ο κώδικας και εκτελείται
                                              'υπενθυμίζω δεν μπαίνει σε αυτό το αρχείο αλλά στη "θέση" όπου έχει αντιγραφεί το αρχείο και μεταφράζεται
                                              ' η ένθεση γίνεται στο χώρο της μετάφρασης όχι σε αυτόν της αποθήκευσης!
                                              ' τώρα αλλάζουμε με ανά ιδιότητα χειρισμό την νέα ιδιότητα check
                      ekeino@check = Ψευδης
                      ' και ξανά τρέχουμε την "ανάγνωση συνδεδεμένης λίστας με περιορισμούς"
                      Βαλε ΤΕΛΕΥΤΑΙΑ.ΚΛΑΣΗ$
                      Ενθεση ΣυνδεδεμενηΛιστα$
                      ' και βλέπουμε πως το ekeino λείπει.
                      ' εδώ μπορούμε να δώσουμε μια Λιστα (list) και να μας δείξει ο μεταφραστής όλες τις μεταβλητές και τις ιδιότητες που έχουν "παρουσία"
                      ' μπορούμε να δώσουμε και την Τμηματα και να δούμε όλες τις μεθόδους που έχουν "παρουσία"
                      \ ΤΜΗΜΑΤΑ
                      ' εδώ η εσωτερική μεταβλητή μας δείχνει σε ποιό όνομα τμήματος βρισκόμαστε!
                      Τυπωσε "Όνομα Τμήματος:" ; Τμημα$
          
                      ' δεν μπορούμε να διαγράψουμε ένα αντικείμενο αλλά όλα θα διαγραφούν με το πέρας της παρουσίας αυτού του τμήματος!
                      ' ακριβώς τώρα
                      }
          ΕΝΑΕΠΙΠΕΔΟΚΑΤΩ ' εδώ καλούμε το τμήμα...(κλήση τμήματος μέσα σε τμήμα)
          }
          ΕΝΑΕΠΙΠΕΔΟ

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

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