Δευτέρα, 10 Απριλίου 2017

Αναθεώρηση 3 στην έκδοση 8.7

Σε αυτήν την αναθεώρηση, διόρθωσα δυο μικρές ασυμβατότητες με παλαιότερες εκδόσεις, η μία έχει να κάνει με την ονομασία ενός γενικού τμήματος με όνομα ένα όνομα εντολής, το οποίο δεν έτρεχε στη γραμμή εντολών, ενώ τώρα τρέχει.(το παράδειγμα ιταλικά είχε ένα τμήμα Λέξεις το οποίο είχε όνομα την εντολή Λέξεις (δίνει τις λέξεις ενός κειμένου στο σωρό τιμών σε αλφαβητική σειρά, με ή χωρίς τον αριθμό παρουσιών). Η εντολή Νέο σβήνει όλα τα γενικά τμήματα και συναρτήσεις από τη γραμμή εντολών και επαναφέρει τις εντολές όπως πρέπει.  Με την εντολή Τμήματα ? (ctl+N) εμφανίζονται όλα τα γενικά τμήματα/συναρτήσεις που άμεσα μπορούμε να καλέσουμε σαν ξεχωριστά προγράμματα. Όλα τα τοπικά τμήματα/συναρτήσεις δεν έχουν "παρουσία" παρά μόνο στο κώδικα αυτών των τμημάτων και συναρτήσεων. Αν τρέχουμε κάποιο τμήμα και αυτό έχει φτιάξει τοπικά τμήματα τότε η Τμήματα ? θα δείξει και αυτά. Στην επιστροφή όμως θα έχουν διαγραφεί οπότε αυτό που βλέπουμε θα είναι ό,τι είναι γενικό, που έχει δηλαδή γραφτεί από μας με τον διορθωτή ή έχει φορτωθεί από δίσκο.
Η δεύτερη ασυμβατότητα είναι μια ευκολία που είχα παλαιότερα και με την ανανέωση του κώδικα βγήκε ως λάθος, να δίνουμε σε μια ομάδα (σε πίνακα) τιμή 0, ώστε να διαγράφεται, δηλαδή να μην μένει δείκτης σε ομάδα. Όταν έβαλα την δυνατότητα να παίρνουν τιμές οι ομάδες σαν μεταβλητές, έβαλα έλεγχο αν δίνουμε τιμή σε ομάδα που δεν παίρνει, και έτσι βγήκε το λάθος για το 0. Τώρα λοιπόν το 0 "καθαρίζει" αν η ομάδα δεν παίρνει κανονικά τιμή (πριν δώσω το λάθος στο κώδικα βλέπω αν η τιμή είναι μηδέν, αν όχι δίνω λάθος, αν ναι τότε διαγράφω την ομάδα από τον πίνακα με καταχώρηση 0 τύπου long μακρύ, οπότε όχι απλά είναι 0 αλλά με την τυπος$() μπορούμε να δούμε και το τύπο του)

Επιπλέον έκανα προσαρμογές στο θέμα της χρήσης δεικτών στους πίνακες, ώστε να μην χρειάζονται αντιγραφές αντικειμένων εκεί που δεν είναι απαραίτητες. Αυτό ήθελε αρκετή δουλειά. Αλλά ήρθε και η ιδέα να μπορώ να έχω σε ομάδες σε πίνακες και καταστάσεις και σωρούς με κοινούς πίνακες. Αυτό γινόταν με μεταβλητές που δείχνουν πίνακες αλλά όχι με πίνακες (με παρενθέσεις). Ο λόγος που αυτά τα δύο ξεχωρίζουν ( η Α ως πίνακας και η Α() ως πίνακας) είναι για να τα χειριζόμαστε διαφορετικά.  Το Α()=Β() κάνει αντιγραφή σε πίνακα, όπως και το Α()=Α όταν το Α είναι δείκτης σε πίνακα. Το Στη Α()=Α αλλάζει το δείκτη της Α() και τον κάνει να δείχνει ότι και ο Α (η Στη είναι στα αγγλικά η Let, δεν σκέφτηκα κάτι άλλο).  Μέσα στον ορισμό της ομάδας (και της κλάσης) αν ο πίνακας ορίζεται με την Πίνακας Κοινός Α(10) (έχει και σε πληθυντικό Πίνακες Κοινοί..) τότε όταν γράφουμε ομάδες σε θέσει πίνακα, σε καταστάσεις ή στο σωρό δεν βγαίνει αντίγραφο του πίνακα αλλά δείκτης, οπότε κάθε αλλαγή στο πίνακα θα φαίνεται σε όλα τα αντικείμενα με τον ίδιο δείκτη. (οι πίνακες με απλό γράμμα ως δείκτες σε πίνακες το έκαναν αλλά εδώ έχουμε κάτι επιπλέον. Αν δώσουμε την ομάδα από την θέση της σε ένα όνομα (δημιουργηθεί δηλαδή μέσα σε τμήμα ένα αντίγραφο με όνομα πια και όχι με θέση) τότε έχουμε αντιγραφή ακόμα και αν έχουμε υποδείξει στον διερμηνευτή ότι θα είναι κοινός. Σε αντίθεση όπου υπάρχουν πίνακες ως δείκτες (με αναγνωριστικό χωρίς παρενθέσεις) τότε αυτοί είναι κοινοί. Μπορούμε να δώσουμε έναν νέο πίνακα σε μια ομάδα που έχει θέση σε έναν πίνακα και αυτόματα αυτή θα έχει το δικό της δείκτη. (η αλλαγή δεν θα φανεί σε άλλες ομάδες στο πίνακα), αν όμως αντιγράψουμε έναν νέο πίνακα σε υπάρχον που είναι κοινός δεν θα αλλαχθεί ο δείκτης, η αντιγραφή θα γίνει στο ίδιο αντικείμενο, άρα όλες οι ομάδες που έχουν κοινό πίνακα, θα συνεχίσουν να έχουν κοινό πίνακα (αυτό δεν γίνονταν με την μεταβλητή δείκτη σε πίνακα, γιατί απλά θα άλλαζε οδείκτης για συγκεκριμένη ομάδα)

Ένα μικρό παράδειγμα στα αγγλικά. Το Beta γίνεται ομάδα (με εκχώρηση δημιουργούμε μεταβλητές, και αυτό που εκχωρούμε δίνει και τον τύπο). Η Beta έχει όνομα ενώ όλες οι άλλες ομάδες που δημιουργούμε έχουν θέση σε πίνακα. Η Class είναι συνάρτηση που επιστρέφει ομάδα (Group).  Ο πίνακας (1,2,3,4,5,6,7,8,9,10) λέγεται αυτόματος πίνακας και δίνει δείκτη σε πίνακα. Ο διερμηνευτής αντί να δώσει τον δείκτη στον πίνακα στο A(1).b() καλεί μια μέθοδο του αντικειμένου σε αυτό, που κάνει αντιγραφή στοιχείων στο δικό του χώρο, και πετάει ως άχρηστο τον αυτόματο πίνακα (στην ουσία αποδεσμεύει τον δείκτη, και εφόσον δεν υπάρχει άλλος δείκτης σε αυτόν...το σύστημα τον διαγράφει). Στους πίνακες εδώ χρησιμοποιώ σε κάποιους αριθμούς για στοιχεία και κάποιους  ομάδες, όμως κάθε πίνακας μπορεί να παίρνει ότι στοιχείο θέλουμε. Σε περίπτωση που δώσουμε όπως εδώ στον ορισμό σαν τιμή στοιχείων μια ομάδα (και η κλάση γυρνάει ομάδα), τότε τυχόν συναρτήσεις και μέθοδοι θα αποθηκευτούν μια φορά, διαφορετικά, όπως στο πίνακα b() αποθηκεύει όλη τη δομή ως ένα πράγμα, δεδομένα, αναγνωριστικά και κώδικα (σε τμήματα/συναρτήσεις/τελεστές/ιδιότητες της ομάδας). Να γιατί οι ομάδες έχουν όλες έναν κοινό τύπο, και παρόλο που έχουν διαφορετικά μέλη, ακολουθούν ίδιους κανόνες.  Οι πίνακες με αναγνωριστικό  με ή χωρίς παρενθέσεις είναι στην ουσία μια διαφορά σε interface (τρόπο χειρισμού) για το ίδιο πράγμα, τον πίνακα. Πχ. Το Α(1)=2 : Α(3)=5:Α(6)=7 είναι τρεις εντολές που σε κάθε μια εμφανίζεται ο πίνακας. Αν χρησιμοποιήσουμε το Α ως αναφορά του Α(), με Α=Α() τότε η Επιστροφή Α,1:=2,3:=5,6:=7 κάνει την ίδια δουλειά βάζει τιμές με εύρεση μιας φοράς του πίνακα.(Εδώ οι αριθμοί - δείκτες- ταυτίζονται με αυτές του Α() γιατί έχουμε μια διάσταση. Η εντολή Επιστροφή δουλεύει με θέση στο πίνακα σαν να ήταν μονοδιάστατος. Η ίδια εντολή επιστρέφει στοιχεία σε καταστάσεις, πίνακες και σωρούς, και αν είναι αλφαριθμητική έκφραση και όχι αριθμητική (όπως το Α) τότε η εντολή αυτή δέχεται ορίσματα βάση δεδομένων (όνομα αρχείου) και SQL ερώτημα και ακολουθεί απλή λίστα πεδίων που επιστρέφουμε (εκεί που δείχνει το SQL ερώτημα. (αλλά αυτό μπορεί να το δει κανείς και με την Βοήθεια Επιστροφή στη γραμμή εντολών).

Class alfa {
      dim common b(10)=10
}
Dim a(2)=alfa()
Dim b(100)
b(3)=a(1) ' copy preserve pointer to array
beta=alfa(1)
a(0).b(5)+=10
Print a(1).b(5) ' 20 using Common or 10 without
Print beta.b(5) ' 10
Print b(3).b(5) ' 20  using Common or 10 without
a(1).b()=(1,2,3,4,5,6,7,8,9,10)
Print a(1).b(5) ' 6
Print beta.b(5) ' 10
Print b(3).b(5) ' 6  using Common or 10 without