Δευτέρα 27 Μαρτίου 2017

Αναθεώρηση 5 (Έκδοση 8.6)

1) Προστέθηκαν μερικά αναγνωριστικά στο αρχείο βοήθειας.
2) Προστέθηκε η δυνατότητα να φτιάχνουμε ιδιωτικές κλάσεις με τιμές αριθμητές ή αλφαριθμητικές εντός κλάσεων (οι Ιδιότητες παρεμένουν ως έχουν, να είναι πάντα δημόσιες)

Δυο παραδείγματα (στα αγγλικά) που δείχνουν την νέα δυνατότητα:
Όταν δημιουργούμε μια κλάση σε ένα τμήμα τότε η κλάση γίνεται αυτόματα μια γενική συνάρτηση. Εντός μιας κλάσης ή μιας ομάδας ο ορισμός κλάσης είναι τοπικός. Όμως επειδή οι ομάδες δεν έχουν ξεχωριστό interface (αλλά ένα κοινό), μπορούμε ένα αντικείμενο να το χειριστούμε αν το δώσουμε ως επιστροφή από μια συνάρτηση. Δηλαδή ο διερμηνευτής της Μ2000 δεν χρειάζεται να ξέρει τι έχει μια ομάδα δηλώνοντας έναν τύπο. Για παράδειγμα όταν δημιουργούμε την Class BetaClass ο διερμηνευτής παίρνει το κείμενο όπως είναι και το καταχωρεί σαν συνάρτηση. Όταν γράφουμε εντός μιας κλάσης ή μιας ομάδας το BetaClass Beta, Delta ο διερμηνευτής εκτελεί αυτό Beta=BetaClass() και αυτό Delta=BetaClass(). Κάθε φορά η συνάρτηση BetaClass() επιστρέφει ένα ανώνυμο αντικείμενο και αυτό έχει μέσα τη λίστα με τα περιεχόμενά του. Ο διερμηνευτής παίρνει τη λίστα και φτιάχνει όλο το περιεχόμενο με το όνομα που δίνουμε εδώ Beta (και μετά με το Delta), έτσι το όνομα της ιδιωτικής k είναι Beta.k αλλά σαν ιδιωτική δεν μπορεί να "βρεθεί" αν την καλέσουμε έξω από ένα τμήμα/συνάρτηση που ανήκει στο Beta. Επειδή και το Beta ανήκει σε μια άλλη κλάση και έχει δηλωθεί ιδιωτικό, ούτε αυτό μπορεί να βρεθεί έξω από εκεί που φτιάχτηκε.
Το Μ θα μπορούσε και αυτό να γύρναγε μια τιμή που θα θέλαμε. Τώρα γυρνάνει ένα αντίγραφο του εαυτού του, δηλαδή ένα αντικείμενο ομάδα με όλα τα στοιχεία του Μ, ακόμα και τα ιδιωτικά ως αντίγραφα. Έτσι μια Ζ=Μ θα παράγει ένα Ζ ίδιο με το Μ (το Ζ είναι αντιγραφή του Μ όχι αναφορά).
Αν το Μ επέστρεφε τιμή (επειδή είχαμε βάλη μια Set { }) τότε το Ζ θα έπαιρνε αυτήν την τιμή. Αν θέλαμε να έπαιρνε το αντίγραφο ομάδας τότε θα το επιστρέφαμε ως Ομάδα(Μ)
Σε περίπτωση που το Μ γύρναγε αλφαριθμητικό τότε θα ήταν γραμμένο ως Μ$ (απαραίτητα πρέπει να φαίνεται στον εκτιμητή παραστάσεων αν κάτι γυρνάει αλφαριθμητικό με το σύμβολο $). Δηλαδή Class Alfa$ { } και M$=Alfa$(). Και από αυτό μπορούμε να πάρουμε την ομάδα με την Ομάδα$(Μ$). Μάλιστα όλες οι ομάδες με όνομα με σύμβολο $ έχουν και όνομα χωρίς αυτό (αλλιώς δεν θα μπορούσαμε να πάρουμε μια αριθμητική τιμή, από μια περιεχόμενη ιδιότητα με αριθμητική τιμή). Στο δεύτερο παράδειγμα κάνουμε χρήση αυτού και έτσι δείχνουμε την τιμή μιας αριθμητικής συνάρτησης της ομάδας Beta$ που φτιάξαμε με την BetaClass$ (και η ομάδα και η κλάση έχουν το σύμβολο του αλφαριθμητικού, σημαίνει ότι η ομάδα και η παραγόμενη από τη κλάση γυρνάει τιμή αλφαριθμητικό)
Όταν δίνουμε τιμές σε ομάδες που περιέχονται σε άλλες, δηλαδή όταν δίνουμε σε ομάδες της ομάδας τότε βάζουμε το <= και όχι το = γιατί ο διερμηνευτής πάντα προτιμάει να φτιάχνει τοπικές μεταβλητές και το "<=" του λέει "ψάξε αλλού" (γενικά το χρησιμοποιούμε για γενικές μεταβλητές, αλλά και για τις μεταβλητές της ομάδας από τις συναρτήσεις και τα τμήματα της ομάδας)

Προσθήκη στο πρώτο παράδειγμα, ο τελεστής "++".


Class Alfa {
Private:
      Class BetaClass {
      Private:
            k=100
      Public:
            Dim B(20)=1234
            Function KLM {=1001}
            Value {=.k}
            Set {Read .k }
            Operator "++" {
                  .k++
            }
            N=130
      }
      \\ make two objects inside Alfa Class
      BetaClass Beta, Delta
Public:
      Module TestMe {
            Print .Beta
            .Beta<=500
            Print .Beta, .Beta.N , .Beta.KLM(), .Beta.B(2)
            Print .Delta, .Delta.N , .Delta.KLM(), .Delta.B(2)
            Print Valid(.Beta.k) \\ 0 = False
            Print .Beta-.Delta \\ 400
            .Beta++
            Print .Beta
      }
}
M=Alfa()
M.TestMe
Print Valid(M.Beta) \\ 0 = False


Σε άλλο τμήμα γράφουμε αυτό:


Class Alfa {
Private:
      Class BetaClass$ {
      Private:
            k$="Yes"
      Public:
            Value {=.k$}
            set {Read .k$}
            Function KLM {=1002}
            Dim B(20)=1234
      }
      BetaClass$ Beta$, Delta$
Public:
      Module TestMe {
            Print .Beta$
            .Beta$<="No"
            Print .Beta$, .Delta$
            Print .Beta.KLM(), .Beta.B(2)
      }
}


M=Alfa()
M.TestMe





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

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

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