Τρίτη, 24 Οκτωβρίου 2017

Αναθεώρηση 44, Έκδοση 8.9

Σε αυτήν την αναθεώρηση διόρθωσα μια γραμμή και τώρα τρέχει και αυτό το πρόγραμμα δοκιμής (όπως περίπου τα άλλα στις 43 και 42 αναθεωρήσεις, της τρέχουσας έκδοσης)

Αυτό το τεστ έχει λίγο μπέρδεμα. Χρησιμοποιώ ένα γεγονός Μ ως μέλος του Delta. Τα γεγονότα φορτώνονται με συναρτήσεις με ίδια υπογραφή (στην C# λέγονται delegates). Μπορούμε να περάσουμε και με αναφορά κάτι. Η κλήση του γεγονότος όμως δεν παρέχει τον σωρό τιμών του τμήματος, (το τρέχον σωρό), οπότε πρέπει να σηκώσουμε τα ορίσματα και να τα δώσουμε στην κλήση. Το πρώτο όρισμα είναι ομάδα, οπότε η Ομάδα ή Group κάνει τη δουλειά του. Το δεύτερο όρισμα είναι μια αναφορά σε ομάδα. Οι αναφορές είναι αλφαριθμητικά (είναι το πλήρες όνομα μιας μεταβλητής στη λίστα μεταβλητών), οπότε η Διάβασε όταν περιμένει κάτι με αναφορά, περιμένει ένα αλφαριθμητικο το οποίο θα κοιτάξει να δει αν υπάρχει ως κλειδί στην λίστα μεταβλητών - αυτό γίνεται γρήγορα γιατί η λίστα έχει πίνακα κατακερματισμού. Αν όντως υπάρχει τότε θα δει τι είναι αυτό, και ανάλογα θα πράξει. Αν είναι μια απλή μεταβλητή θα πάρει το δείκτη της και θα τον βάλει στο νέο όνομα, έτσι ώστε το νέο όνομα να δείχνει την τιμή της "αναφοράς", και κάθε αλλαγή θα γίνει μια φορά και για τις δυο μεταβλητές (δυο ονόματα, κοινή θέση αποθήκευσης). Αν όμως είναι ομάδα (Group) τότε φτιάχνει ένα νέο αντικείμενο με το όνομα που δίνουμε, και στην λίστα μελών βάζει αναφορές από το αρχικό, ως νέα μέλη, που δείχνουν όμως τα αρχικά. Αν προσθέσουμε μέλη σε αυτή την ομάδα, τότε δεν θα προστεθούν στην αρχική. Θα έχουμε δηλαδή μια ομάδα όπου τα αρχικά μέλη είναι με αναφορά και νέα μέλη (άλλα ονόματα) θα είναι τοπικά! Μπορούμε να αλλάξουμε τμήματα και συναρτήσεις, γιατί στην ουσία η "αναφορά" σε αυτά είναι αντιγραφή του κώδικα στη λίστα τμημάτων/συναρτήσεων (δεν υπάρχουν σε αυτή τη λίστα πραγματικές αναφορές, και όταν λέμε πχ αναφορά στην συνάρτηση έχουμε το κώδικα της συνάρτησης). Δείτε εκεί που δηλώνουμε νέα συνάρτηση στο γεγονός Μ. Του δίνουμε αναφορά, αλλά η αναφορά σε συνάρτηση είναι ο κώδικάς της. Ακόμα και να "ταξιδέψει" η ομάδα, πχ να αντιγραφεί κάπου αλλού θα υπάρχει ο κώδικας στη Μ. Βέβαια εδώ υπάρχει μια "καυτή πατάτα". Δηλαδή έχουμε το tsekme, ως ένα γενικό (σφαιρικό λέγεται σε άλλες γλώσσες) τμήμα. Αυτό το καλούμε από οπουδήποτε, εφόσον υπάρχει όμως. Διότι αν το τμήμα που το έφτιαξε τερματίσει, τότε σβήνεται. Έτσι αν το γεγονός κληθεί ενώ δεν υπάρχει πια το tsekme, θα βγει λάθος!




Module global tsekme {
      Read &n
      Try {
            \\ operator "lost" in reference (in previous revisions)
            n++
      }
      Print"check it", n
}
Class Alfa {
      Property X=10
      Group X {
            something=100
            operator "++" {
                  Link parent [X] to X
                  X++
            }
      }
      Property Y=5
      Module TestMe {
            \\  .[X] is a value
            \\ .X is a group which we can read or write, or read and write
            Print .[X], .[Y]
      }
}
Function OutOfGroup {
            Read New Beta, &Ret
            Beta2=Alfa()
            Group Beta3 {
                  Property X=10
                  Property Y=5
            }
            Beta.X<=500
            Beta.X++
\\            List !
            Print Beta.X, Beta2.X, Beta3.X
            Beta.TestMe
            Beta3=Beta
            Beta3.TestMe
            tsekme &Beta3.X
           ' List!
            Ret=Beta3
? "***************************"
           ' List!
}
Group Delta {
      \\ we can't put rem's in Event's signature block
      Event M {
            Read myGroup, &retGroup
      }
      Module Look {
            ' group is in stack for values
            ' Events have own stack, so we have to place using signature
            ' & references are strings in M2000.
            Call Event .M, Group, letter$
      }
}
Event Delta.M new &OutOfGroup()
Global Beta=Alfa()
Beta.X<=2000
BetaFinal=Alfa()
Delta.Look Alfa(), &BetaFinal
Print Beta.X, BetaFinal.X