Τρίτη, 7 Μαρτίου 2017

Έκδοση 8.4

Νέα έκδοση του διερμνηνευτή Μ2000. Πολλές προσθήκες και βελτιώσεις!

Βελτιώσεις (μικρές και μεγάλες):
1. Στον διορθωτή (editor) το πλήκτο Home μια φορά πάει στην αρχή της γραμμής και την επόμενη στΗν αρχή της πρώτης λέξης. Αυτό βοηθάει όταν γρήγορα μαζεύουμε τις γραμμές (Tab πάνε οι επιλεγμένες γραμμές δεξιά. και Shift Tab πάνε αριστερά).

2. Στον έλεγχο (Control), μπορούμε να δώσουμε μια εντολή (στην Τύπωσε που εμφανίζει), ώστε να σταματήσει σε συγκεκριμένη ετικέτα δοκιμής (Εντολή Δοκιμή). Θα το δείξω σε άλλη ανάρτηση.

3. Βελτίωση στην κλήση ρουτινών. Ενώ τα τμήματα και οι συναρτήσεις, ανήκουν σε μια λίστα όπου υπάρχει όνομα και κώδικας, οι ρουτίνες δεν έχουν δική τους "υπόσταση", αλλά βρίσκονται σε κώδικα μέσα σε τμήματα και συναρτήσεις. Κάθε φορά που καλούνταν γίνοταν αναζήτηση από το τέλος του κώδικα, ενώ τώρα αυτό γίνεται την πρώτη φορά, και για κάθε κώδικα στη λίστα τμημάτων-συναρτήσεων υπάρχει λίστα ρουτινών που αναζητήθηκαν έστω μια φορά. Το παιχνίδι Φιδάκι που είχα ανεβάσει, κέρδισε σε ταχύτητα!

4.Νέου τύπου μεταβλητή, η μεταβλητή με αναφορά σε πίνακα. Μπορούμε να χειριστούμε το πίνακα σαν μεταβλητή. Πχ. να προσθέσουμε ένα αριθμό σε όλα τα στοιχεία του. Θα δείξω παραδείγματα χρήσης σε επόμενη ανάρτηση. Υπάρχουν οι εντολές Car(), Cdr() και Cons()  (από την Lisp) για να βγάζουμε αντίγραφο του πρώτου στοιχείου, ή των υπολοίπων, ή να αντιγράφουμε δυο πίνακες σε έναν. Οι πίνακες αυτοί μεταβιβάζουν την αναφορά τους σε άλλες μεταβλητές ή βγάζουν αντίγραφο αν δώσουμε όνομα πίνακα με παρενθέσεις. Μπορούν να έχουν μέχρι δέκα διαστάσεις, αλλά οι ειδικές εντολές λειτουργούν ως να ήταν μονοδιάστατοι. Μπορούμε να ενώσουμε μια μεταβλητή πίνακα, με ένα πίνακα, ώστε να διαβάζουμε όπως θέλουμε τα στοιχεία. Οι πίνακες μπορούν να έχουν εκτός από αλφαριθμητικά και αριθμούς οτιδήποτε άλλο, πχ λάμδα συναρτήσεις, καταστάσεις, πίνακες, ομάδες (αντικείμενα) και άλλα.

5.Νέου τύπου μεταβλητή (που δεν φαίνεται άμεσα, ως απαριθμητής στοιχείων) όπου παίρνει έναν πίνακα ή μια κατάταση και διατρέχει τα στοιχεία του. Προς το παρόν ο δρομέας ανήκει στο πίνακα/κατάσταση, άρα δεν μπορούν να χρησιμοποιηθούν πολλαπλές τέτοιες μεταβλητές για τον ίδιο πίνακα, αλλά μπορεί να αλλαχτεί χωρίς να έχει επιπτώσεις ο δρομέας, και να τον γυρίσουμε πάλι στο σημείο που θέλουμε. Προς το παρόν δεν έχει όνομα (είναι σαν μεταβλητή πίνακα, αλλά αναφέρει η Τύπος$() αυτό που δείχνει, τον πίνακα ή τη κατάσταση - η κατάσταση είναι λίστα με κλειδιά). Περισσότερα παραδείγματα στις επόμενες αναρτήσεις!


                  Κατάσταση αλφα="b","a","f","d","c"
                  Ταξινόμηση αλφα
                  Τύπωσε αλφα
                  M=Κάθε(αλφα Τέλος έως Αρχή)
                  Τύπωσε M
                  N=Κάθε(αλφα,-1, 1)
                  Τύπωσε M


6. Η εντολή τύπωσε τυπώνει πίνακες, καταστάσεις και σειρές αυτών (με τον απαριθμητή στοιχείων).

7. Νέου τύπου Κατάσταση. Αυτή λέγεται Κατάσταση Ουρά. Οι καταστάσεις χρησιμοποιούν πίνακα κατακερματισμού για γρήγορη αναζήτηση, διαγραφή, προσθήκη. Αν και υπάρχει η εντολή Ταξινόμηση, μια διαγραφή μπορεί να αλλάξει τη σειρά. Επιπλέον τα κλειδιά στην Κατάσταση είναι μοναδικά, δηλαδή δεν δέχεται διπλό ίδιο κλειδί. Η νέα Κατάσταση λέγεται Κατάσταση Ουρά, και έχει το πλεονέκτημα να παίρνει όμοια κλειδιά, αλλά δεν μπορεί να διαγράψει οποιαδήποτε κλειδιά, παρά μόνο τα τελευταία, και δεν μπορεί να ταξινομηθεί. Αν έχουμε ένα κλειδί ίδιο τρεις φορές, η αναζήτηση βρίσκει το τελευταίο που μπήκε στη λίστα. Αν το σβήσουμε τότε η αναζήτηση θα βρεί το αμέσως προηγούμενο. Μπορούμε βέβαια να διαβάζουμε όποιο στοιχείο θέλουμε στη κατάσταση, σαν να είναι πίνακας, ή να διαβάσουμε το κλειδί κάθε στοιχείου, ή να δώσουμε ένα κλειδί και να μας δώσει το σύστημα τη θέση στη κατάσταση. Για τα όμοια κλειδιά είναι μια κατάσταση "Το πρώτο που θα μπει θα βγεί τελευταίο".

                   Κατάσταση Ουρά αλφα=1,2,3:="αα",3:="ββ",4,4
                  Αν υπάρχει(αλφα, 3) Τότε Τύπωσε εκφρ$(αλφα)
                  Τύπωσε μήκος(αλφα) ' 6
                  Πέτα άλφα 3 ' πετάει τα τελευταία 3
                  Τύπωσε μήκος(αλφα) ' 3
                  Τύπωσε εκφρ$(αλφα, 2) ' Τυπώνει το 3ο στοιχείο

8. Σημαντική βελτίωση έγινε στις Ομάδες. Οι ομάδες είναι στην ουσία μικρά προγράμματα, τα οποία έχουν ότι θέλουμε από μεταβλητές, αλλά και συναρτήσεις και τμήματα, και κάποια από όλα αυτά τα δηλώνουμε ως δημόσια και άλλα ως ιδιωτικά. Ενώ στα τμήματα και στις συναρτήσεις ο κώδικας "παραμένει", οι ομάδες μπορούν να είναι επώνυμες μέσα σε τμήματα και συναρτήσεις, να αποτελούν μέρος τους, ή να είναι ανώνυμες, και να βρίσκονται σε θέση, πχ σε πίνακα, σε κατάσταση ή στο σωρό τιμών. Μέχρι εδώ αυτές τις δυνατότητες είχαν. Τώρα προστέθηκαν τα παρακάτω:

8.1 Ιδιότητες στις ομάδες (είναι ομάδες που γυρνούν τιμές).
Οι ομάδες μπορούν να έχουν τιμή, και να επιστρέφουν και να δέχονται τιμή. Επειδή οι ομάδες μπορούν να έχουν ομάδες, μπήκε η εντολή Ιδιότητα που φτιάχνει ομάδες που αποτελούν ιδιότητες. Οι ιδιότητες μπορούν να είναι μόνο ανάγνωσης, ή να έχουν πρόγραμμα που να ελέγχει στο συμβάν να δώσουν τιμή ή να πάρουν τιμή (ενώ οι απλές μεταβλητές δεν το έχουν αυτό, θα πρέπει να χρησιμοποιήσει συναρτήσεις ή τμήματα μέσα στις ομάδες). Επειδή είναι ομάδες και οι ιδιότητες μπορούν να έχουν και αυτές ιδιότητες, αλλά και τμήματα και συναρτήσεις.

8.2 Τελεστές. στις ομάδες. Μπορούμε να ορίσουμε τελεστές και εν τέλει πράξεις που θα γίνουν με τις ομάδες μεταξύ τους. Π.χ. μπορούμε να ορίσουμε συγκρίσεις για μεγαλύτερο/μικρότερο. Είναι πολύ εύκολο στη χρήση! Ειδικά αυτή η λειτουργία των τελεστών ανέβασε ένα 0.1 την έκδοση, και από 8.3 γύρισε στο 8.4
Εδώ είναι ένα παράδειγμα στα αγγλικά (με το οποίο έκανα δοκιμές όταν έφτιαχνα τον κώδικα της γλώσσας). Κάθε τελεστής είναι μια συνάρτηση της οποίας η εξαγωγή  θα γίνει στο σωρό. Αν δεν κάνουμε εξαγωγή τότε δίνει ο διερμηνευτής ένα δείκτη στο αντικείμενο, και αυτό αν δεν χρησιμοποιηθεί σβήνεται. Αν όμως θέλουμε να δώσουμε κάτι μπορούμε να βάλουμε στο σωρό (με τη Βάλε ή Push). Στο παράδειγμα βλέπουμε να λειτουργούν οι τελεστές σε ομάδες που είναι σε πίνακες. Σε πίνακες έχουμε κλειστά αντικείμενα, ή αντικείμενα σε θέση, σε αντίθεση με τα επώνυμα αντικείμενα, όπου βρίσκονται σε ένα τμήμα και "πεθαίνουν" μαζί του, ενώ ο πίνακας μπορεί να μπεί στο σωρό για επιστροφή, άρα να πάρει και το κλειστό αντικείμενο. Και είναι πράγματι κλειστό το αντικείμενο γιατί για αν χρησιμοποιηθεί πρέπει να ανοίξει, να γίνει επώνυμο. Αυτό το κάνει αυτόματα ο διερμηνευτής. Στη γραμμή με το For Α(1) {This+=5} μέσα στις αγκύλες το αντικείμενο στο Α(1) είναι ανοικτό, απλά δεν βλέπουμε το όνομα...και για το λόγο αυτό χρησιμοποιούμε την This ή Αυτό. Μπορούμε όμως να συνδέσουμε ένα όνομα με την εντολή Ένωσε η οποία αποδίδει "αναφορές" σε νέα ονόματα (δεν μπορεί να δώσει στο ίδιο όνομα δεύτερη αναφορά).

                              Class alfa {
                                    x, y
                                    Module GetXY { Read ? .X, .Y }
                                    Operator "++" {
                                          .X++
                                          .Y++
                                    }
                                    Operator "=" {
                                         Read N
                                         push .X=N.X and .Y=N.Y
                                    }
                                    Operator ">" {
                                         Read N

                                         push .X<N.X and .Y<N.Y
                                    }
                                    Operator "+=" {
                                          Read N
                                          .X+=N
                                          .Y+=N
                                    }
                                    Operator "+" {
                                           Read M
                                          .X+=M.X
                                          .Y+=M.Y
                                    }
                                    Operator "*" {
                                           Read M
                                          .X*=M.X
                                          .Y*=M.Y
                                    }
                              }
                              alfa=alfa()
                              alfa.GetXY 100,300
                              Dim A(10)=alfa()

                              a(1).GetXY 1,30

                              For a(1) {This+=5}
                              Print a(1).x
                              a(2)=a(1)
                              Print a(1).x,a(2).x
                              Print a(1).x*(a(1).x+a(2).x),$(3),"6*(6+6)"
                              a(4)=a(1)*(a(1)+a(2))
                              a(5)=a(1)*(a(2)+a(1))
                              Print $(0), A(4)>A(5)
                              Print A(4)=A(5)
                              Print A(4).x, A(5).x

Γενικά δεν υπάρχουν προβλήματα με τα νέα καλούδια αλλά χρειάζεται λίγο ακόμα έλεγχος και δοκιμές. Οπότε μέσα στη βδομάδα θα ανέβουν οι αναθεωρήσεις και μαζί και τα παραδείγματα.
Στην τρέχουσα έκδοση 8.7 στο Α(4)>Α(5)  το Διάβασε Ν διαβάζει το Α(4) και όχι το Α(5), ενώ τρέχει ο τελεστής στο Α(5).