Κυριακή 19 Αυγούστου 2018

Αναθεώρηση 6 Έκδοση 9.4

Ένα μικρό λάθος διορθώθηκε, το οποίο απέτρεπε την σωστή αντιγραφή ενός δείκτη σε ομάδα σε μια νέα θέση στο σωρό τιμών.

Ακολουθεί ένα μικρό πρόγραμμα που επεξηγεί τις δυο μορφές των ομάδων (Group), ως επώνυμα (named), και ως επιπλέοντα (float). Η ομάδα που "επιπλέει" είναι ανώνυμη, δεν έχει δηλαδή θέση αυτή και τα μέλη της στο σύστημα ονομάτων της Μ2000, αλλά έχει θέση σε κάτι άλλο, όπως σε ένα πίνακα, σε μια κατάσταση ειδών, σε ένα σωρό τιμών.
Μια ομάδα δημιουργείται ως επώνυμη, και όταν την επιστρέψουμε από μια συνάρτηση τότε επιστρέφουμε μια επιπλέουσα (που μετακινείται) ομάδα που έχει μέλη αντίγραφα των μελών της αρχικής. Αν την δώσουμε σε ένα πίνακα τότε αυτή πιάνει τη θέση ως έχει (αν ήδη υπάρχει στην θέση αυτή κάτι άλλο το πετάει), ενώ αν την δώσουμε σε νέο όνομα τότε δημιουργείται ένα επώνυμο αντικείμενο με πρότυπο αυτό που του δώσαμε, αν δώσουμε σε υπάρχουσα επώνυμη ομάδα τότε έχουμε συγχώνευση, ώστε αυτό που δίνουμε να υπάρχει στην επώνυμη ομάδα με ότι έχει αυτή παραπάνω.

Ένας δείκτης σε ομάδα δείχνει σε μια επώνυμη ή σε μια επιπλέουσα ή είναι μηδενικός (παραμένει όμως να έχει τύπο Ομάδα). Αν ο δείκτης δείχνει σε επώνυμη ομάδα στην ουσία έχει ισχνή αναφορά σε αυτήν. Με συνέπεια αν μετακινηθεί ο δείκτης σε χώρο όπου έχει πια διαγραφεί αυτό που δείχνει να έχει άκυρη ισχνή αναφορά, και η οποία θα φανεί με το πρώτη ζήτηση. Αν ο δείκτης δείχνει σε επιπλέουσα ομάδα τότε την κρατάει "ζωντανή", γιατί υπάρχει αρίθμηση στο πόσοι δείκτες την έχουν, και για να διαλυθεί πρέπει να φύγει και ο τελευταίος. Οι δείκτες αντιγράφονται με = ενώ για να πάρουν νέο δείκτη από μια ομάδα πρέπει να δώσουμε αυτό Α->Α(3) όπου σημαίνει ότι ο Α έχει δείκτη σε επιπλέουσα ομάδα (δεν είναι επώνυμη), ή Α->(Αλφα)  όπου οι παρενθέσεις στο όνομα κάνουν το Αλφα να αντιγραφεί σε επιπλέουσα ομάδα, και το Α->Αλφα το οποίο είναι δείκτης σε επώνυμη ομάδα.


Module Big {
      Module Checkit {
            Group Alfa {
                  \\ all are public by default
                  x=-10, y=30, a$="a String"
                  Module testMe {
                        Print .x, .y, .a$
                  }
            }
            \\ show list  Alfa[Group], Alfa.x, Alfa.y, Alfa.a$
            List
            \\ Show Alfa.testMe
            Modules ?
            Alfa.testme
            Dim a(1 to 3)
            A(1)=Alfa
            \\ A(1) has a float group, a copy of Alfa
            A(1).x+=20
            Print A(1).x=10 ' true
            Print Alfa.x=-10 ' true
           
            \\ thin arrow used instead = to get pointer from a group
            \\ notice that A(2)->(Alfa) make a copy before return a pointer
            A(2)->Alfa
            \\ A(2) has a pointer to Alfa (a pointer to a named group is a weak reference, not adding ref count to Alfa)
            \\ we can use this pointer until this module exit, and Alfa erased
            A(2).x+=20
            Print A(2).x=10 ' true
            Print Alfa.x=-10 ' false, it is 10, A(2) has a pointer  to Alfa
            Group Alfa {
                  Function AddXY {
                        =.x+.y
                  }
            }
            Print A(2).AddXY()=40
            \\ A(1) has no AddXY() function
            Print Valid(A(1)..AddXY())=false
            \\ z is a pointer to A(1)
            \\ a pointer to a float group is actual a pointer to object, adding a ref count.
            \\ we can use this pointer anytime because hold object alive
            \\ using z->0& we pass a null, and release the object. This happen at the exit of this module
            \\ but before the exit maybe we tranfer a copy to another destination, like a container, or in current stack of values
            z->A(1)
            Module CallByRef (&a) {
                  a+=1000
            }
            For A(1), A(2), alfa {
                  \\ any new in this block destroyed at exit
                  \\ A(2) points to Alfa, and Alfa exist as named group
                  \\ So only A(1) close all
                  Print .x, ..x, ..x ' 10 10 10
                  ..x+=30
                  Print ..x=40, ...x=40 ' A(2) points to alfa
                  \\ we pass .x (from A(1)) as reference, because .x has a name (hidden), it is linked now
                  CallByRef &.x
                  \\ z points to a float group A(1), but now  A(1 )is linked and so z find link and get proper value
                  \\ we use fat arrow to access member from a pointer (as a variable)
                  \\ for arrays not need to use fat arrow
                  Print z=>x = 1010
            }
            \\ so now we want to upgrade A(1)
            For A(1) {
                   m=Alfa ' we get a copy
                   m=This ' we get a merge
                  This=M ' we get a merge in reverse
            }
            \\ Now M not exist.
            Print A(1).AddXY()
            Push z
       }
      Flush ' empty stack here       
       \\ call checkit
       Checkit
       \\ Print stack items from current stack
       Stack
       \\ we see a  *[Group] means a pointer to Group
       \\ we want Here to read Good as a group (not as a pointer)
       pGroup=StackItem()
       Read Good as group
       \\ Good is a pointer
       Print Good.AddXY() , pGroup=>AddXY()
       pGroup->0& ' release object
       List
       Modules ?
}
Big
\\ There are no variables
List
\\ There is one module Big
Modules ?




Επιπλέον μπήκαν νέες σελίδες στην βοήθεια για τελεστές. Υπάρχει η σελίδα Τελεστές, με βοήθεια τελεστές βγαίνει, αλλά τώρα προστέθηκαν και ξεχωριστές σελίδες για τους τελεστές, στη λίστα ΔΙΕΡΜΗΝΕΥΤΗΣ
Η ΚΑΙ ΑΠΟ ΕΙΝΑΙ ΔΙΑ ΔΙΑ# ΥΠΟΛ ΥΠΟΛ#

Βοήθεια Διερμηνευτής

ή μπορούμε να δώσουμε χωριστά
βοήθεια υπολ
βοήθεια "υπολ#"   (θέλει εισαγωγικά για το #

πχ στο Δια# υπάρχει το παράδειγμα

α=-20
β=6
\\ Ευκλείδεια διαίρεση και υπόλοιπο
γ=α Διά# β
δ=α Υπόλ# β
Τύπωσε γ, δ  ' -4   4
Τύπωσε α=β*γ+δ
\\ Κανονική διαίρεση και υπόλοιπο
γ=α Διά β
δ=α Υπόλ β
Τύπωσε γ, δ ' -3  -2
Τύπωσε α=β*γ+δ

και στα αγγλικά αυτό:
a=-20
b=6
\\ Euclidean  div as div#, mod as mod#
c=a div# b
d=a mod# b
Print c, d  ' -4   4
Print a=b*c+d
\\ normal
c=a div b
d=a mod b
Print c, d ' -3  -2
Print a=b*c+d

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

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

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