Τετάρτη 23 Σεπτεμβρίου 2015

Ισχνή Αναφορά, Ένθεση εντολών (Μ2000)

\* χρήση της ισχνής αναφοράς, της ένθεσε
\* ισχνή αναφορά είναι η μαγιά για να γίνει η αναφορά σε άλλο χρόνο
\* ουσιαστικά είναι το πραγματικό όνομα αυτού που αναφέρεται
\* Οι μεταβλητές δεν έχουν μόνο το όνομα που φαίνεται όταν
\* τις ορίζουμε αλλά διαθέτουν εσωτερικά ένα πρόθεμα που σχετίζεται
\* με το που πραγματικά βρίσκονται, σε ποιο τμήμα ή συνάρτηση
\* Εδώ είναι καλό να αναφέρουμε ότι το όνομα του τμήματος ή συνάρτησης
\* δεν ταυτίζεται πάντα με το όνομα που έχουμε δηλώσει ένα τμήμα αλλά
\* με το όνομα του αντιγράφου του τμήματος που εκτελείται.
\* Έτσι μια ισχνή αναφορά προϋποθέτει ότι διατηρείται σε εκτέλεση
\* το τμήμα απ' όπου πήραμε την αναφορά, ή και εδώ είναι το ωραίο
\* αν την στιγμή της χρήσης έχουμε μια συγκεκριμένη ακολουθία που
\* θα φέρει το ίδιο όνομα.
\* Μια μη ισχνή αναφορά είναι για παράδειγμα το πέρασμα με αναφορά μιας
\* μεταβλητής, πίνακα, όπου άμεσα έχουμε ένα όνομα που συνδέεται
\* άμεσα με την μνήμη που δείχνει η μεταβλητή, ή ο πίνακας.
\* Και συναρτήσεις μπορούν να περαστούν με αναφορά αλλά θα το δούμε
\* άλλη φορά.
\\ Δείτε τη χρήση της εντολής Ένθεσε η οποία βάζει κώδικα που συνθέτει την ώρα
\\ της εκτέλεσης. Αυτό γίνεται γιατί έχουμε διερμηνευτή.


Κλάση Άλφα {
      δοκίμασέ_με=12345
      Πίνακας κάτι$(10)="Ναι", κάτι(20)
      Κλάση Βήτα1 {
            πατρικό$  \\ use of weak reference
            Τμήμα Βήτα1 {
                  Διάβασε .πατρικό$
            }
            Συνάρτηση πάρε {
                  Διάβασε β$
                  =Εκφρ( .πατρικό$+"."+β$) \\ εσωτερική συνάρτηση
            }
            Συνάρτηση πάρε$ {
                  Διάβασε β$
                  Ένθεση "Βάλε "+ .πατρικό$+"."+β$ \\ εκτελεί την εντολή Βάλε
                  =γράμμα$
            }
            Τμήμα Βάλε { \\έχει το ίδιο όνομα με την εντολή Βάλε
                                    \\ δεν μας πειράζει γιατί βάζουμε τελεία πριν την χρήση της
                  Διάβασε β$
                     \\ έτσι μπορούμε να διαβάζουνμε οτιδήποτε
                  Ένθεση  "Για  "+.πατρικό$+" { Διάβασε  ."+β$+"}"
            }
      }
      Συνάρτηση Βήτα { \\ βάζουμε την Βήτα() να καλεί την Βήτα()
                                    \\ για να περνάμε αναφορά στο ίδιο, το Αυτό!
                                    \\ την οποία κάνουμε ισχνή αναφορά!
                                    \\ στο τμήμα βήτα1 (αυτό λαμβάνει το &Αυτο)
                                    \\ Το &Αυτο είναι αλφαριθμητικό τυπικά
                                    \\ Μια Διάβασε μπορεί να το δει ως αναφορά
                                    \\ Όταν ζητάμε στη διάβασε μια αναφορά!
                                    \\ Φαίνεται απλό αλλά έκανα δέκα χρόνια να σκεφτώ
                                    \\ ότι η Διάβασε κανονίζει τι είναι τι,
                                    \\ η για να το πούμε αλλιώς, με ερώτημα:
                                    \\ που υπάρχει η περισσότερη πληροφορία για κάτι, σε
                                    \\ αυτόν που καλεί ή σε αυτό που δέχεται κλήση;
                                    \\ Στον Αντικειμενοστρεφή προγραμματισμό αυτό
                                    \\ είναι και το δύσκολο της λόγικής μας που προσπαθεί να λύσει!
            =.Βήτα1(&Αυτό)
      }
}
\\ τα α και β παίρνουν από μια ομάδα που κατασκευάζεται σε συνάρτηση
\\ - ο κατασκευαστής φτιάχνει την ομάδα και την περνάει στο σωρό
\\ ως πτητική ομάδα (κλειστή, παγωμένη, χωρίς όνομα), αλλά με όλα τα
\\ στοιχεία της μέσα, τα δεδομένα πακετάρονται στο χώρο της και όχι σε ένα
\\ γενικό χώρο όπως στις κανονικές ομάδες, όπως επίσης πακετάρονται
\\ τα τμήματα και οι συναρτήσεις της.
\\ - Κατόπιν στην αντικατάσταση (στο ίσον) ο μεταφραστής δίνει προτεραιότητα
\\ στην ύπαρξη αντικειμένου και δίνει το αντικείμενο.
\\ (αν κάναμε Τύπωσε1 Άλφα() θα παίρναμε το 0 γιατί η Τύπωσε1 πετάει τα αντικείμενα)
\\ - Έτσι τα α και β δεν είναι δείκτες ή αναφορές στις ομάδες, αλλά δηλώνουν μνήμη
\\ που περιέχουν το αντικείμενο Group που είναι μια κλάση γραμμένη σε Visual Basic 6
\\ (ο κώδικας της Μ2000 είναι γραμμένος σε  Visual Basic 6 και είναι ανοικτού κώδικα)
\\ Το Group είναι η ομάδα.
α=Άλφα()
Τύπωσε Τύπος$(α)
\\ β=α.Βήτα()    \\ δες το ίδιο σε δυο βήματα Βάλε-Διάβασε
Βάλε α.Βήτα()
Τύπωσε ΣωρούΤύπος$(1) \\ διαβάζουμε το τύπο σωρού
Διάβασε β
\\ Τώρα θα δείξουμε πως από το αντικείμενο β
\\ θα μπορούμε να αλλάζουμε τιμές στο πατρικό του
\\ το α, αλλά και πως θα αναμορφώσουμε το α
\\ Αυτή η αναμόρφωση γίνεται επειδή τα αντικείμενα της Μ2000
\\ είναι ομάδες δεδομένων και όχι τύποι δεδομένων.
\\ οι ομάδες έχουν έναν και μόνο τύπο, το Group
Για β {
      \\ στην Για ομαδα {} συμβαίνει να σβήνονται στο τέλος
      \\ νέες μεταβλητές, νέα τμήματα και νέες συναρτήσεις
      \\ που κάνουμε σε αυτό το χώρο.
      \\ Αυτό σημαίνει ότι η ομάδα κάπα θα χαθεί
      \\ Όμως ένα αντίγραφο το κρατάμε στο κάτι(0) της
      \\ ομάδας α που το περάσαμε μέσα από το β.βάλε
      \\ και αυτό γίνεται χωρίς να χαλάσει ο "νόμος" της Για {}
      \\ αφού το κάτι(0) υπήρχε και συνεχίζει να υπάρχει
      \\ το κάπα θα γίνει "πτητική" ομάδα, θα υπάρχει σε
      \\ κλειστή μορφή, οπότε η ιδιότητα Χ δεν θα έχει
      \\ κανονική μερίδα στη μνήμη, μέχρι να ανοίξει η ομάδα
      Τύπωσε .πάρε("δοκίμασέ_με"), .πάρε$("κάτι$(3)")
      .Βάλε "δοκίμασέ_με", 100
      .Βάλε μορφή$("κάτι$({0})", τυχαίος(2,3)), "Όχι"
      Τύπωσε .πάρε("δοκίμασέ_με"), .πάρε$("κάτι$(2)"), .πάρε$("κάτι$(3)")
      \\ μπορούμε να κατασκευάζουμε ομάδες σε βήματα!
      ομάδα κάπα {Χ=10, Ψ=50}
      .Βάλε "κάτι(0)", κάπα
      Τύπωσε .πάρε("κάτι(0).Χ"), .πάρε("κάτι(0).Ψ") \\ 10  50
}
Τμήμα Τύπωσε1 {
      αν όχι κενό τότε {
            Τύπωσε "Απάντηση:";
            Ενω όχι κενό {
                  αν εινγρ τότε {Τύπωσε γράμμα$,
                  } Αλλιώς.αν ειναρ τότε {Τύπωσε αριθμός,} Αλλιώς πέτα
                  \\ το πέτα πετάει την κορυφή του σωρού!
            }
      }
      Τύπωσε
}
Τύπωσε1 α.δοκίμασέ_με
\\ Εδώ ανοίγουμε την ομάδα στο κάτι(0), δυο φορές
\\ φτιάχνει ο μεταφραστής ένα αντίγραφο ομάδας με κανονικό όνομα,
\\ και μετά διαβάζει τη Χ.
Τύπωσε1 α.κάτι(0).Χ, α.κάτι(0).Ψ \\ 10  50
\\ Μπορούμε όμως να ανοίξουμε μια φορά το κάτι(0)
Για α {
      Για .κάτι(0) {
          @Βάλε Αυτό
            Τύπωσε1 ..Χ, ..Ψ
      }
}


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


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

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

You can feel free to write any suggestion, or idea on the subject.