Τετάρτη, 15 Φεβρουαρίου 2017

Αναθεώρηση 19 Έκδοση 8.2

Διορθώθηκαν μερικά Bug (και έγινε προσπάθεια να βρεθεί και άλλο, και δεν καρποφόρησε..ακόμα)
Στο παράδειγμα παρακάτω...βάζουμε ένα αντικείμενο ομάδα, σε μια κατάσταση και την κατάσταση σε ένα πίνακα. Ενώ οι πίνακες και οι ομάδες αντιγράφονται, οι καταστάσεις δεν αντιγράφονται απλά περνάει μια αντιγραφή ενός δείκτη που δείχνει την κατάσταση. Αυτό θα το λέγαμε ως αναφορά στη κατάσταση. Ο λόγος που γίνεται αυτό είναι γιατί η κατάσταση θα έχει πολλά στοιχεία και μια αντιγραφή θα κοστίζει σε χρόνο (φόρτος).
Μια Κατάσταση μπορεί να έχει μόνο κλειδιά, ή να βάλουμε και σε όποιο κλειδί θέλουμε κάτι, ένα αριθμό, ένα αλφαριθμητικό, μια συνάρτηση λάμδα, ένα πίνακα, μια ομάδα, ένα πίνακα με ομάδες ή και ότι άλλο θέλουμε, ακόμα μπορούμε να βάλουμε μια άλλη Κατάσταση (πάλι όμως θα περάσει σαν αναφορά).
Για να διαβάσουμε κάτι από τη κατάσταση είναι απλή υπόθεση. Αν την βάλουμε σε πίνακα, συνεχίζει να είναι απλή υπόθεση. Όμως για να αλλάξουμε κάτι, ενώ είναι σε πίνακα δεν είναι τόσο απλό. Επειδή έχει έμμεση αναφορά, ο τρόπος που έχει επιλεχθεί είναι με χρήση μιας άλλης κατάστασης που παίρνει την αναφορά στην καταχωρημένη στο πίνακα. Κάνουμε αλλαγές μέσω αυτής και στο τέλος απλά καθαρίζουμε με την Καθαρό ΌνομαΚατάστασης που αφήνει μια κενή νέα κατάσταση. Ο πίνακας συνεχίζει να δείχνει την αναφορά ση κατάσταση που επεξεργαστήκαμε.Στο παράδειγμα και η τοπική Λ και η τοπική Ν θα "εξαφανιστούν" στην λήξη του Για Αυτό {} γιατί αυτό είναι το μπλοκ όπου όλοι οι ορισμοί μεταβλητών, πινάκων, ομάδων κ.α.α είναι προσωρινοί για το μπλοκ αυτό.

Για τον πίνακα Π και τη θέση 1 υπάρχει μια εντολή που κάνει τη Κατάσταση να "ξεκολλήσει", και αυτό είναι το 0. Όταν πάμε στην Ν την κατάσταση, βάζουμε το 0 στη θέση στον πίνακα απ΄όπου την πήραμε. Εδώ πρακτικά δεν μας βοηθάει κάπου αυτό. Θα βοηθούσε αν τρέχουν νήματα και κάποιο νήμα θέλει να αλλάξει κάτι στη Κατάσταση, γιατί τώρα απλά δεν θα την βρεί!


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

Κατάσταση Κ1
Ομάδα αβγ {
      μ=5
      Συνάρτηση φ { Διάβασε χ : =χ*10+ }
}
Τύπωσε αβγ.φ(20)
κλειδί$="Ναι"
\\ φορτώνουμε στη λίστα ένα αντίγραφο της ομάδας
Προσθήκη Κ1, κλειδί$:=αβγ
\\ Ο διερμηνευτής επιλύει αυτό
Τύπωσε Κ1("Ναι").φ(20)
\\ και αυτό
Κ1("Ναι").μ++
Τύπωσε Κ1("Ναι").μ \\ 6


Πίνακας Π(10)
\\ η Κατάσταση πάντα γράφεται με αναφορά
\\ εδώ ο πίνακας κρατάει μια αναφορά στην κατάσταση Κ1
Π(1)=Κ1
Τύπωσε Π(1)("Ναι").φ(20), Π(1)("Ναι")
Για Αυτό {
      \\δεν έχουμε κάποια Λ στο κώδικα πριν, έστω ότι έχουμε: φτιάχναμε μια τοπική
      Τοπική Λ
      Κατάσταση Λ
      Λ=Π(1) \\ Τώρα θα δώσουμε μια αναφορά στο Ν (το Ν είναι κατάσταση
      Λ("Ναι").μ+=10
      \\ εδώ τελειώνει το Για Αυτό {}, και η Λ θα διαγραφεί (ο δείκτης στη Π(1) που είναι ίδιος με την Κ1)
     
}
\\ Απόδειξη
Τύπωσε Π(1)("Ναι") \\ 16
Τύπωσε Κ1("Ναι").μ \\ 16
Τύπωσε Μήκος(Κ1) \\ 1 στοιχείο
Καθαρό Κ1 \\ καθαρίζουμε τη κατάσταση, βάζοντας μια καινούργια μηδενική!
Τύπωσε Μήκος(Κ1) \\ 0
Τύπωσε Μήκος(Π(1)) \\ 1  η κατάσταση μένει εδώ ως έχει.
Τύπωσε Π(1)("Ναι") \\ 16
Για Αυτό {
      Τοπική Ν
      Κατάσταση Ν
      Ν=Π(1)
      Π(1)=0 \\ δεν παίρνει το μηδέν αλλά το Τίποτα
      Τύπωσε Τύπος$(Π(1)) \\ Nothing, παραμένει ένα "τίποτα"
      Π(1)=Ν \\ τώρα το βάλαμε στη θέση του1
      Τύπωσε Τύπος$(Π(1)) \\ Inventory (Κατάσταση)
}
\\ Σβήνουμε τον πίνακα
Πίνακας Π()
Λίστα
\\ την εντολή παρακάτω την δίνουμε για να αδειάσει η συλλογή σκουπιδιών.
\\ στην ουσία σβήνει τις κρατημένες αναφορές, και τις τυχόν κυκλικές
\\
Άδειασε Σκουπίδια