Δευτέρα, 23 Οκτωβρίου 2017

Αναθεώρηση 42 (Έκδοση 8.9)

Σε αυτή την αναθεώρηση βρήκα ένα ενοχλητικό Bug, που αρχικά φαίνονταν ανώδυνο, αλλά μετά από έλεγχο διαπίστωση ότι δημιουργούσε προβλήματα στο πέρασμα με αναφορά αντικείμενα τύπου ομάδα. Για να γίνουν οι απαιτούμενες αλλαγές χρειάστηκε να δοκιμαστεί ο διερμηνευτής με μια μεγάλη σειρά προγραμμάτων "προβλημάτων". Αυτά τα προγράμματα τεκμηριώνουν πιθανά προβλήματα.
Το παρακάτω είναι ένα τέτοιο πρόγραμμα-πρόβλημα. Την προβληματική γραμμή την έχω βάλει στο μπλοκ Try { }. Υπάρχει και το πέρασμα με ισχνή αναφορά σε δεύτερο πρόγραμμα. Δηλαδή αναφορά που κάθε φορά που την χρησιμοποιούμε "επιλύεται" (resolved) από τον διερμηνευτή, ενώ η κανονική αναφορά επιλύεται μια φορά. Ενώ μπορούμε ονόματα (αναγνωριστικά μεταβλητών) να περαστούν με αναφορά, δεν μπορούμε να περάσουμε στοιχεία πίνακα με δείκτη, αφού δεν μπορούμε πχ το α(1) να το αντιστοιχίσουμε σε ένα όνομα πχ α. Όμως η ισχνή αναφορά δουλεύει με πίνακες, πχ αν δώσουμε το α(1) στην συνάρτηση ισχνή$() θα μας δώσει ένα αλφαριθμητικό που θα είναι η ισχνή αναφορά του. Στα τμήματα (modules) που δέχονται ισχνές αναφορές για ομάδες μπορούν να δεχτούν όχι μόνο μια ομάδα επώνυμη αλλά και εκείνη σε θέση (ανώνυμη) σε πίνακα.

σε ένα τμήμα έστω Α βάζουμε το παρακάτω πρόγραμμα. Δημιουργούμε το tsekme ως γενικό (θα φαίνεται παντού στο Α, και κάτω, αλλά με το πέρας εκτέλεσης του Α θα διαγραφεί, αν υπήρχε πριν γενικό tsekme θα σκιαστεί για όσο τρέχει το Α.

Στο Delta.Look στο Beta.X αν βάλουμε το = και όχι το <= θα φτιάξει ο διερμηνευτής τοπική Beta.X. και θα συνυπάρχει με το Beta.X του αντικειμένου. Όμως θα έρχεται πρώτο στη ζήτηση το τοπικό, με την τιμή 500, και στην αναφορά θα περάσει η τιμή Beta.X και όχι η ιδιότητα του Beta (η οποία έχει τον τελεστή ++).
Η List ! δείχνει τις μεταβλητές όπως υπάρχουν στη λίστα μεταβλητών με αναλογική γραφή.Δεν δείχνει ιδιωτικές,  και έτσι δεν βλέπουμε τις [Χ] και [Υ] τις μεταβλητές πίσω από τις ιδιότητες.

Η Read New (Διάβασε Νέο) φτιάχνει νέα μεταβλητή Beta (γιατί υπάρχει ήδη γενική).

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 {
            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]
      }
}
Group Delta {
      Module Look {
            Read New Beta
            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
            Push Beta3
            List!
      }
}
Global Beta=Alfa()
Beta.X<=2000
Delta.Look Alfa()
Read BetaFinal


Print Beta.X, BetaFinal.X







Ένα μικρό πρόγραμμα για να δείξει πως σκιάζουμε ένα γενικό τμήμα, με δυο τρόπους, με τοπικό τμήμα με ίδιο όνομα (θα μπορούσαμε να το είχαμε και ως γενικό), και με διαμόρφωση (decoration) με χρήση του συμβόλου ";" (μόνο τα τμήματα έχουν αυτήν την ιδιότητα).

Module global Z {
      Print "old zeta"
}

Module global W {
      ' just call Z
            Z
}

Module K {
      Module Z {
            Print "own Z in K"
      }
      Z
      W  \\ this call old Zeta
      W ; Z \\ this call Z in k in W, because W decorated  by Z.
      Module somethingelse {
            Print "something else"
      }
      W ; Z as somethingelse
}
K
W


Ακολουθεί το αρχικό πρόγραμμα πρόβλημα με χρήση ισχνής αναφοράς στο tsekme.Η εντολή Push a(1) βάζει το αντίγραφο του a(1) στο σωρό τιμών. Με το που τερματίζει το τμήμα, το μόνο που έχει αφήσει είναι αυτό το αντικείμενο στο σωρό. Όλα τα άλλα διαγράφτηκαν. Με την Read διαβάζουμε το αντικείμενο σε ένα όνομα (χάνεται από το σωρό). Τα τμήματα δέχονται όχι μόνο τα ορίσματα που δίνουμε στο σωρό τιμών, αλλά και τον σωρό του "γονέα". Επίσης οφείλουν τα τμήματα να παραδώσουν σωστά το σωρό τιμών. (ο σωρός τιμών δεν χρησιμοποιείται ως σωρός επιστροφών, ή για τοπικές μεταβλητές). Μπορούμε λοιπόν να επιστρέφουμε όσες τιμές "έχουμε ήδη κανονίσει", και εδώ επιστρέφουμε μια.


Module global tsekme {
      Read n$
      try {
            \\ operator "lost" in reference (in previous revisions)
            n$.++
       }
      Print"check it", Eval(n$.)
}
Class Alfa {
      Property X=10
      Group X {
            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]
      }
}
Group Delta {
      Module Look {
            Read New Beta
            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
            Dim base 1, a(1)
            a(1)=Beta3
            tsekme weak$(a(1).X)
            Push a(1)

            List!
      }
}
Global Beta=Alfa()
Beta.X<=2000
Delta.Look Alfa()
Read BetaFinal

Print Beta.X, BetaFinal.X