Δευτέρα, 18 Δεκεμβρίου 2017

Αναθεώρηση 26 (Έκδοση 9.0)

(Προσοχή αυτή η αναθεώρηση είχε πρόβλημα με τις λάμδα συναρτήσεις και έχει διορθωθεί)
Σε αυτήν την αναθεώρηση διόρθωσα μερικές ασυμβατότητες μεταξύ 8ης και 9ης έκδοσης. Προς το παρόν δεν υπάρχει ασυμβατότητα, έχουν ελεχθεί πολλά προγράμματα.
Επίσης αναπτύχθηκε καλύτερα η επιστροφή στο λάθος, δηλαδή όταν κάπου στο κώδικα έχουμε λάθος με το Shift + F1 μας πάει ο διερμηνευτής στο κώδικα. Σε άλλες γλώσσες αυτό είναι εύκολο αλλά για να μπορεί να γίνει πράξη ήθελε πολύ δουλειά, και ίσως ακόμα να χρειαστεί δουλειά.

Προστέθηκε η συνάρτηση Τάξη() ή Order() η οποία παίρνει δυο αλφαριθμητικά και τα συγκρίνει με ειδικό τρόπο: Οι αριθμοί εντός του αλφαριθμητικού είναι σημαντικοί, όταν τα γράμματα συμφωνούν. Πχ τα "Αλφα1000" και "Αλφα800" αν τα συγκρίναμε κανονικά θα έπρεπε επειδή το "Αλφα1" είναι μικρότερο από το "Αλφα8" να είχαμε τη σειρά Αλφα1000, Αλφα800, όμως η συνάρτηση Τάξη(), θα βρει πρώτα συμφωνία με τα γράμματα "Αλφα" και μετά θα δει τους αριθμούς ως αριθμούς, και το 800<1000, άρα θα βάλει το Αλφα800 και μετά το Αλφα1000. Δουλεύει ακόμα και αν έχουμε ίσους αριθμούς, μετά ίδια γράμματα και μετά πάλι αριθμούς. Ουσιαστικά κάθε φορά που αλλάζουμε από γράμματα σε αριθμούς είναι σαν να έχουμε άλλο κλειδί!

Η συγκεκριμένη σύγκριση είναι αυτή που κάνει η ταξινόμηση Κατάστασης (κατάλογος κλειδιών-τιμών) στα κλειδιά, όταν επιλέξουμε τη ταξινόμηση (δεν είναι μόνιμη, αλλά συμβαίνει όταν το ζητάμε), και επιλέξουμε "ως αριθμό". Σκέτοι αριθμοί πάνε πριν τα γράμματα, και λέξη αλλά χωρίς αριθμό πάει πίσω από λέξη με αριθμό.


Διόρθωσα την ταξινόμηση στην Κατάσταση Ουρά (παίρνει ίδια κλειδιά), είχε πρόβλημα στην προς τα κάτω ταξινόμηση. Η ρουτίνα είναι πολύ απλή αλλά από λάθος νόμιζα ότι δούλευε μόνο αλλάζοντας πρόσημα στις συγκρίσεις! Η ρουτίνα λέγεται ταξινόμηση με εισαγωγή, και είναι μεν αργή αλλά είναι σταθερή, κάτι που μας ενδιαφέρει για την κατάσταση Ουρά, επειδή θέλουμε τα όμοια κλειδιά να έχουν την ίδια φορά, να μην αλλάξουν, όπως κάνει η γρήγορη ταξινόμηση (αυτή χρησιμοποιεί η βασική Κατάσταση, μια quick sort που είχα φτιάξει με παραλλαγή για να μην έχει πρόβλημα με όμοια κλειδιά).


Ετοιμάζω το "Προγραμματίζοντας με τη Μ2000" 
Ο πίνακας δομών δεδομένων της Μ2000:
  • Τρέχον Σωρός Τιμών
  • Πίνακας με παρενθέσεις  και χωρίς (δείκτης σε πίνακα).
  • Κατάσταση (με μοναδικά κλειδιά) και Κατάσταση Ουρά (ακόμα και με ίδια κλειδιά). (και στις δυο περιπτώσεις έχουμε δείκτη στο αντικείμενο)
  • Αντικείμενο Σωρός Τιμών (δείκτης σε αντικείμενο Σωρός)
  • Διάρθρωση (διάρθρωση μνήμης) πίνακας απλών χωρίς πρόσημο στοιχείων ή δομών. (δείκτης σε Διάρθρωση).
  • Δομή (τύπος για τις διαρθρώσεις), είναι Κατάσταση εσωτερικά.
  • Έγγραφο (αλφαριθμητικό με παραγράφους)
  • Συνάρτηση Λάμδα (μπορεί να περιλαμβάνει κλεισίματα ως δεδομένα, και ίσως κάποια από αυτά να είναι δείκτες σε δομές δομένων)
  • Γεγονός (δεν περιλαμβάνει δεδομένα, αλλά λίστα συναρτήσεων, που μπορεί να έχουν δεδομένα ή να συνδέονται με ομάδες που έχουν δεδομένα)
  • Ομάδα (το κύριο αντικείμενο της Μ2000), μπορεί να περιλαμβάνει όλα τα παραπάνω, δικές της μεταβλητές, ιδιότητες, τελεστές, τμήματα, συναρτήσεις και άλλες ομάδες.
  • Υπερκλάση (ομάδα θεατή και κοινή για ομάδες, και αθέατη έξω από αυτές)
  • Φόρμες Παραθύρων
  • Στοιχεία φορμών παραθύρων.
  • Βάσεις δεδομένων (δομές στο δίσκο)
  • Αρχεία Κειμένου (δομές στο δίσκο)
  • Αρχεία Διαρθρώσεων Μνήμης (Διαρθρώσεις αποθηκευμένες στο δίσκο)
  • Αρχεία Εικόνας (οι εικόνες γράφονται τοπικά σε αλφαριθμητικά)


 Απόσπασμα για  τους επαναλήπτες:
Σημειώσεις εκτός αποσπάσματος για την διευκόλυνση του αναγνώστη:
(Η κατάσταση χρησιμοποιείται στο παράδειγμα χωρίς τιμές, μόνο με κλειδιά, και τότε τα κλειδιά εμφανίζονται ως τιμές, μέχρι σε κάποιο να βάλουμε τιμή, δουλεύει με πίνακα/συνάρτηση κατακερματισμού)
(Οι αυτόματοι πίνακες είναι πίνακες που "κρατάμε" με δείκτη, λέγονται αυτόματοι γιατί δημιουργούνται με παρενθέσεις, το (,) είναι ο κενός πίνακας, και το (1,) είναι ο πίνακας με ένα στοιχείο)
(Ο σωρός είναι εσωτερικά συνδεδεμένη λίστα, δίνει δυνατότητα άμεσης μετακίνησης στοιχείων).
Σε καθένα από τα παραπάνω μπορούμε να βάλουμε σαν στοιχείο οποιοδήποτε από αυτά. Δηλαδή ένας πίνακας μπορεί να έχει πίνακες, καταστάσεις, σωρούς. Επειδή όλα αυτοί οι "καταχωρητές" δουλεύουν με δείκτες υπάρχει τρόπος από το διερμηνευτή να βρίσκει ποια αντικείμενα έχουν μεταξύ τους "δεσμούς", ώστε να τους σπάσει για να τα αφαιρέσει από την μνήμη.
Στη Μ2000 τα αντικείμενα Ομάδα, (το κύριο αντικείμενο) δεν δουλεύει με δείκτη σε αυτό, είναι στην ουσία "τιμές". Οι ομάδες μπορούν να μπουν σε οποιοδήποτε "καταχωρητή", σε πίνακα, σε κατάσταση, σε σωρό. Επίσης οι ομάδες μπορούν να έχουν μέλη, καταχωρητές.






Φωλιασμένοι επαναλήπτες
Εφόσον ο δρομέας του επαναλήπτη είναι "προσωπικός" έχουμε το πλεονέκτημα να εφαρμόζουμε μαζί επαναλήπτες για την ίδια δομή. Υπάρχουν όμως δυο περιπτώσεις. Να έχουμε φωλιασμένους ή παράλληλους επαναλήπτες.
Κατάσταση Κ=1,4,6,8,78
Β=Κάθε(Κ, 1, 5)
Ενώ Β {
      Β1=Κάθε(Κ,5, 1)
      Ενώ Β1 {
                  Τύπωσε εκφρ(Β), εκφρ(Β1)
      }
      Τύπωσε
}



Το παραπάνω πρόγραμμα θα τυπώσει 5Χ5 φορές, ενώ το αμέσως επόμενο θα τυπώσει μόνο 5 φορές (τερματίζει η επανάληψη όταν τερματίσει ο πιο σύντομος επαναλήπτης):
Κατάσταση Κ=1,4,6,8,78
Β=Κάθε(Κ, 1, 5)
Β1=Κάθε(Κ, 5, 1)
Ενώ Β, Β1 {
                  Τύπωσε εκφρ(Β), εκφρ(Β1)
}



Για αυτόματους πίνακες:
Κ=(1,4,6,8,78)
Β=Κάθε(Κ, 1, 5)
Ενώ Β {
      Β1=Κάθε(Κ,5, 1)
      Ενώ Β1 {
                  Τύπωσε Πίνακας(Β), Πίνακας(Β1)
      }
      Τύπωσε
}

Κ=(1,4,6,8,78)
Β=Κάθε(Κ, 1, 5)
Β1=Κάθε(Κ,5, 1)
Ενώ Β, Β1 {
                  Τύπωσε Πίνακας(Β), Πίνακας(Β1)
}



Για Σωρούς Τιμών (η ΤιμήΣωρού() γυρνάει αριθμητική τιμή ή αντικείμενο):
Κ=Σωρός:=1,4,6,8,78
Β=Κάθε(Κ, 1, 5)
Ενώ Β {
      Β1=Κάθε(Κ,5, 1)
      Ενώ Β1 {
                  Τύπωσε ΤιμήΣωρού(Β), ΤιμήΣωρού(Β1)
      }
      Τύπωσε
}

Κ=Σωρός:=1,4,6,8,78
Β=Κάθε(Κ, 1, 5)
Β1=Κάθε(Κ,5, 1)
Ενώ Β, Β1 {
                  Τύπωσε ΤιμήΣωρού(Β), ΤιμήΣωρού(Β1)
}