Δευτέρα 16 Ιουλίου 2018

Αναθεώρηση 24 'Εκδοση 9.3 Προσθήκη στις Ομάδες (Αντικείμενα)

Σε αυτήν την αναθεώρηση (από 22 πήγαμε στην 24), έγινε μια προσθήκη για τις ομάδες. Μπορούμε να βάζουμε μια ειδική  συνάρτηση Διαγραφή {} ή Remove {} που καλείται για ένα αντικείμενο που μπορεί να είναι σε πίνακα ή σε μεταβλητή, ως αντικείμενο ή ως δείκτης σε αντικείμενο, μέσω της Καθαρό (ή Clear), εφόσον αυτό το αντικείμενο δεν έχει άλλο δείκτη σε αυτό. Ουσιαστικά η Καθαρό ελέγχει αν το αντικείμενο είναι το τελευταίο βάσει του αριθμού δεικτών που το χρησιμοποιούν και αν ναι τότε καλεί την Καθαρό (αν δεν υπάρχει, δεν πειράζει, δεν βγαίνει λάθος). Η Διαγραφή ή Remove δεν μπορεί να κληθεί με άλλο τρόπο. Το πραγματικό όνομα της συνάρτησης δεν είναι το Διαγραφή ή Remove.

Το σύμβολο << στον ορισμό του πίνακα Α() κάνει τον διερμηνευτή να φτιάχνει ένα νέο αντικείμενο για κάθε στοιχείο του Α(). Αν βάζαμε το = αντί του << τότε θα έφτιαχνε ένα νέο αντικείμενο και θα το αντέγραφε σε όλες τις θέσεις του πίνακα.


Global RefAlfa=0
Class Alfa {
      id
      Remove {
            Print "remove"
            RefAlfa--
      }
Class:
      Module Alfa (.id){
            RefAlfa++
      }
}
\\ Try with false
if True then {
      k->Alfa(2)
} ELse K=Alfa(2)
Dim A(10)<<Alfa(Random(10, 100))
Dim A(12)
A(10)->k
A(11)->k
n=each(A())
While n {
      Print A(n^).id
}
Print "RefAlfa="; RefAlfa
n=each(A())
While n {
      Clear A(n^)
}
Print "RefAlfa="; RefAlfa
Clear k

Print "RefAlfa="; RefAlfa


Πιο απλό πρόγραμμα:

Module Global A {
      Global RefAlfa=0
      Class Alfa {
            id
            Remove {
                  Print "Remove"
                  RefAlfa--
            }      
        Class:
            Module Alfa (.id){
                  RefAlfa++
            }
    
      }
      A->Alfa(3)
      z->A
      Print refAlfa
      Clear A
      Print refAlfa
      Clear Z
      Print refAlfa
}
A

Και σε ελληνικά:

Τμήμα Γενικό βήτα {
      Γενική Μετρητής_Αλφα=0
      Κλάση Άλφα {
            Ένας_Αριθμός
            Διαγραφή {
                  Τύπωσε "Διαγραφή"
                  Μετρητής_Αλφα--
            }      
        Κλάση:
            Τμήμα Άλφα (.Ένας_Αριθμός){
                  Μετρητής_Αλφα++
            }
      }
      α->Αλφα(12345)
      \\ δοκίμασε και με α=Αλφα(12345)
      \\  με α->... η λίστα δείχνει: Μετρητής_Αλφα = 1, ΒΗΤΑ.Α*[Group] δηλαδή το Α είναι δείκτης σε ομάδα
      Λίστα
      \\ με α=... η λίστα δείχνει: Μετρητής_Αλφα = 1, ΒΗΤΑ.Α[Group], ΒΗΤΑ.Α.ΈΝΑΣ_ΑΡΙΘΜΟΣ = 12345
      \\ δηλαδή το α είναι ανοικτό αντικείμενο - συνδεδεμένο με το τμήμα - να γιατί βλέπουμε τη δημόσια Ένας_Αριθμός.
      Τύπωσε Μετρητής_Αλφα=1 ' ok
      \\ φτιάχνουμε έναν δείκτη στο α
      \\ αν το α είναι δείκτης σε κλειστό αντικείμενο, θα έχουμε δείκτη σε κλειστό αντικείμενο, όπως το α->Αλφα(12345)
      \\ αν το α δεν είναι δείκτης, ή είναι δείκτης σε ανοικτό αντικείμενο, τότε το κ θα γίνει δείκτης σε ανοικτό αντικείμενο
      \\ αυτό σημαίνει ότι οι δείκτες είναι "ισχνές αναφορές" και ότι δεν έχουν ισχύ αν τερματίσει αυτό το τμήμα.
      \\ το τελευταίο θα συμβεί με το α=Αλφα(12345).
      κ->α
      Τυπωσε κ=>Ένας_Αριθμός=12345
      \\ βάζουμε στο κ τη κενή ομάδα (θα το κάνει ο διερμηνευτής αυτό, εμείς δίνουμε έναν Μακρύ 32bit, το 0&, μετά το ->)
      κ->0&
      \\ Τώρα μειώθηκε ο αριθμός αναφορών, σε ένα.
      \\ Μόνο η Καθαρό καλεί  τη Διαγραφή
      Καθαρό α ' καλεί την διαγραφή αν είναι ο τελευταίος δείκτης στο αντικείμενο
      Τύπωσε Μετρητής_Αλφα=0
}
Κάλεσε βήτα


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

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

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