Σκοπός του διερμηνευτή της Μ2000 δεν είναι η ταχύτητα εκτέλεσης, αλλά η σωστή εκτέλεση όλων αυτών που μπορεί να κάνει η Μ2000.
Από την αρχή επιλέχθηκε ο κώδικας να είναι όσο πιο απλός γίνεται. Ασφαλώς αυτό δεν ισχύει σήμερα. Με τις προσθήκες έχει γίνει τεράστιος! Υπήρξαν στάδια που "ξεχείλωναν" το πρόγραμμα!
Η πρώτη ιδέα του σωρού τιμών ήταν να βρίσκεται σε ένα αλφαριθμητικό αριθμοί και αλφαριθμητικά μαζί. Σε δεύτερο χρόνο ο σωρός τιμών έγινε ένα αντικείμενο που κουβαλάει άλλα αντικείμενα σε μια συλλογή. Επίσης σε τρίτο χρόνο φτιάχτηκε μια δεξαμενή αντικειμένων απ΄ όπου τραβάει ο οποιοσδήποτε σωρός ελεύθερα αντικείμενα, και ρίχνει πίσω ότι ελευθερώνεται, Αυτός ο τρόπος αύξησε την ταχύτητα γιατί δεν χρειάζονταν να δημιουργούνται νέα αντικείμενα, ούτε να διαγράφονται. Και οι δυο ενέργειες, δημιουργίας και διαγραφής κοστίζουν σε χρόνο. Αν δεν έχει άλλα η δεξαμενή να δώσει δημιουργούνται νέα. Με μια αρχική τιμή μερικών χιλιάδων σπάνια να χρειαστούν άλλα!
Το αντικείμενο σωρός είναι στο αρχείο mStiva.cls (το cls σημαίνει κλάση).
Όταν καλούμε μια δική μας συνάρτηση τότε όλα εκείνα που δίνουμε ως τιμές παραμέτρων (τα ορίσματα δηλαδή) πάνε στο σωρό τιμών της συνάρτησης που θα κληθεί, ο οποίος είναι νέος σωρός όταν η συνάρτηση καλείται σε έκφραση. Εξαιρούνται οι στατικές συναρτήσεις (θα δούμε για αυτές αργότερα).
Ο σωρός αρχικά μπορούσε να πάρει αριθμούς και γράμματα. Όμως μπορεί να πάρει και αντικείμενα. Πχ μπορούμε να βάλουμε ένα πίνακα (είναι αντικείμενο στη Μ2000). Γενικά το γράψιμο στο σωρό είναι με τιμή "πάντα". Από την 5η έκδοση της γλώσσας είχε μπει ο τρόπος να περάσουμε αναφορές.
Οι μεταβλητές απαιτούν δυο δομές: Έναν πίνακα τιμών, και ένα "λεξικό" που στη Μ2000 λέγεται κατάσταση τιμών. Ο πίνακας είναι τύπου Variant (παίρνει οτιδήποτε) και μπορεί να αυξομειώνεται. Το λεξικό δουλεύει με δυο πίνακες, ο ένας έχει για κάθε στοιχείο του μια ομάδα τιμών (UDT ή user defined type, κατά μια έννοια κάτι όπως το struct της C), και ο άλλος είναι πιο απλός, λέγεται πίνακας Κατακερματισμού (Hash Table), λέει πχ στη θέση Κ ότι έχει το στοιχείο Μ του πρώτου πίνακα.
Ενδιαφέρον παρουσιάζει εδώ να κατανοήσει κανείς πως μεγαλώνουν αυτοί οι πίνακες και πώς χρησιμοποιούνται από τη Μ2000 για να βρίσκει τις μεταβλητές. Οι μεταβλητές διαγράφονται με σειρά ανάποδη από τη σειρά που δημιουργούνται. Ο πίνακας κατακερματισμού "αφαιρεί" πχ τρεις μεταβλητές άμεσα, γιατί ξέρει που είναι στο πίνακα Hash, οπότε "καθαρίζει" και απλά ένας δείκτης μειώνεται κατά 3. Η αναζήτηση στο πίνακα Hash γίνεται άμεσα! Το χρονοβόρο είναι το μέγεθος του ονόματος. Μια συνάρτηση Hash (χρησιμοποιείται εδώ η κλασική του συστήματος των Windows, που είναι πάντα φορτωμένη στη πιο γρήγορη μνήμη του επεξεργαστή), λέγεται HashData. Παλαιότερα είχα δική μου συνάρτηση γιατί τα ονόματα των μεταβλητών "ξεχείλωναν" με το πρόθεμα τους (που σχετίζεται με το που δημιουργήθηκαν), οπότε αντί να διάβαζα όλα τα γράμματα έριχνα το βάρος στο όνομα της μεταβλητής και έπαιρνα λιγότερα στοιχεία από το πρόθεμα. Στις τελευταίες εκδόσεις τα προθέματα έχουν γίνει σαν "συντομεύσεις" με ένα γράμμα και έναν αριθμό, οπότε το κλειδί για τον HashData δεν είναι μεγάλο. Για να δουλέψει ο πίνακας κατακερματισμού πρέπει να έχουν φτιαχτεί δυο κλειδιά. Το πρώτο βγαίνει από το όνομα ως ένας 32bit αριθμός. Το δεύτερο βγαίνει βάσει του μεγέθους του πίνακα κατακερματισμού, και δείχνει τη θέση στο πίνακα. Οπότε στο βοηθητικό πίνακα με τα UDT υπάρχει πεδίο που φυλάσσεται το πρώτο κλειδί για το λόγο ότι αν αλλάξει ο πίνακας HASH μέγεθος τότε πρέπει να υπολογιστούν τα δεύτερα κλειδιά από τα πρώτα. Αν έχουμε πενήντα μεταβλητές τότε αυτό σημαίνει ότι θα πάρουμε 50 αριθμούς των 32bit, θα βγάλουμε το υπόλοιπο (mod) βάσει του μεγέθους του πίνακα και βρήκαμε τις θέσεις. Ο πίνακας κατακερματισμού είναι μεγαλύτερος από τον πίνακα με τα UDT, αλλά ενδέχεται να έχουμε "σύγκρουση" δηλαδή δύο στοιχεία να έχουν το ίδιο τελικό κλειδί. Αυτό λύνεται ως εξής. Όταν στο δεύτερο διαπιστωθεί ότι υπάρχει ήδη κάποιο στο πίνακα HASH τότε παίρνουμε από εκεί τον δείκτη που δείχνει στο πίνακα των UDT και τον βάζουμε σε πεδίο στο νέο στοιχείο και θα βάλουμε το δικό του "νούμερο" ή θέση στον πίνακα των UDT, στη θέση που δείχνει το κλειδί για τον HASH πίνακα. Άρα αν φτιαχτούν διαδοχικά δυο ας πούμε Γενικές μεταβλητές με όνομα Α, τότε και οι δύο βγάζουν τον ίδιο κωδικό HASH, αλλά στο πίνακα HASH πρώτα εμφανίζεται η τελευταία που μπήκε. Δηλαδή για ίδια ονόματα έχουμε το LIFO, το τελευταίο που μπήκε θα βγεί πρώτο (στην αναζήτηση αλλά και στη διαγραφή). Αυτός είναι και ο μηχανισμός σκίασης!
Στο σημείο αυτό ας δούμε και κάτι ακόμα για τις μεταβλητές. Είδαμε ότι οι δυο πίνακες του Λεξικού (ή Κατάσταση) δεν είναι ίδιες σε αριθμό στοιχείων. Ακριβώς το ίδιο συμβαίνει και με το πίνακα μεταβλητών (που κρατάμε τις τιμές τους) και τον πίνακα UDT. Όμως ο λόγος που συμβαίνει είναι διαφορετικός. Μπορούμε να έχουμε πχ τρεις τιμές στο 0, 1 και 2 του πίνακα τιμών και τέσσερα ονόματα Α, Β, Γ, Δ όπου δυο από αυτά να δείχνουν σε μια τιμή, έστω στην 2. Υπάρχει ένα πεδίο στο UDT που λέει ότι το όνομα είναι "αναφορά". Κανονικά όταν διαγράφουμε όνομα από το λεξικό μηδενίζουμε και τη τιμή του. Αν όμως έχουμε "σήμα" ότι το όνομα είναι αναφορά θα αφήσουμε την τιμή ως έχει. Εξ ορισμού μια μεταβλητή που είναι αναφορά δεν παίρνει άλλη αναφορά, έτσι πάντα η αρχική μεταβλητή βρίσκεται σε "παλαιότερη" θέση. Αν αλλάζαμε τιμές θα γίνονταν "χαμός", δεν θα μπορούσε να λειτουργήσει σωστά το σύστημα! Θα δούμε αργότερα ότι υπάρχουν μεταβλητές που λέγονται δείκτες και αλλάζουν αυτό που δείχνουν. Όμως αυτά που δείχνουν δεν βρίσκονται στο χώρο των μεταβλητών!
Με απλά λόγια ο χώρος των μεταβλητών είναι αυτός που σχετίζεται με τα ονόματα. Οι τιμές είτε μένουν σε αυτόν το χώρο είτε αντί τιμής να υπάρχει δείκτης σε αντικείμενο, όπου το αντικείμενο έχει δικό του χώρο. Κατά μια έννοια, αλλά χωρίς να είναι αντικείμενο, συμβαίνει και στα αλφαριθμητικά να έχουμε ένα δείκτη στο χώρο μεταβλητών και ο χώρος που γράφονται τα γράμματα να είναι αλλού. Εδώ αξίζει να σημειωθεί ότι τα αλφαριθμητικά είναι μιας εγγραφής. Δηλαδή, όταν θέλουμε να προσθέσουμε δυο αλφαριθμητικά Α$ και Β$ (δείτε το $ είναι απαραίτητο για τον διερμηνευτή της Μ2000), δηλαδή να τα συνδέσουμε σε ένα, και να τα βάλουμε στο Α$ τότε η Μ2000 φτιάχνει ένα νέο αλφαριθμητικό, από την έκφραση A$+B$ και μετά πάει σε αυτό που έχει το Α$ και κάνει αλλαγή των δεικτών, ώστε εκείνο που φτιάχτηκε να μην διαγραφεί αλλά να διαγραφεί στη θέση του το παλιό του A$. Παλαιότερα έβγαινε ένα αντίγραφο του A$+B$ ως νέο αλφαριθμητικό για το A$ και μετά διαγράφονταν αυτό της έκφρασης, δηλαδή κάποια στιγμή υπήρχαν δυο αλφαριθμητικά A$+B$. Με την βελτιστοποίηση να γίνεται αλλαγή δεικτών (swap), κέρδισε σε ταχύτητα ο διερμηνευτής!
Στις πρώτες εκδόσεις της γλώσσας οι προγραμματιστικές δομές με όνομα ήταν δυο: Τα τμήματα και οι συναρτήσεις. Η διαφορά τους ήταν ως προς το τρόπο κλήσης εσωτερικά. Μερικές διαφορές
- Τα τμήματα δεν έχουν αναδρομή, ενώ οι συναρτήσεις έχουν.
- Τα τμήματα δεν ξεκινούν με δικό τους σωρό τιμών αλλά δέχονται τον "γονικό". Αυτό σημαίνει ότι στη κορυφή του σωρού (ειδική στοίβα, μπορεί κανείς να τη λέει και στοίβα), θα υπάρχουν οι τιμές που περάσαμε και μετά θα ακολουθεί ότι ήδη υπάρχει. Άρα μπορούμε να αφήσουμε κάτι. Τα τμήματα μπορούν να γυρίσουν τιμές στο σωρό τιμών.
- Οι συναρτήσεις μπορούν να περαστούν με αναφορά
- Τα τμήματα έχουν μια ειδική λειτουργία που μπορούν κατά τη κλήση να αλλάξουν εσωτερικά τμήματα πρόσκαιρα (για τη κλήση αυτή)
- Και τα τμήματα και οι κανονικές συναρτήσεις (λέγονται κανονικές γιατί υπάρχουν και άλλες), έχουν δικό τους όνομα χώρου. Δηλαδή όταν δημιουργούμε μια μεταβλητή, πχ την Α τότε θα δώσει ο διερμηνευτής ένα πρόθεμα σχετικό με το χώρο που δημιουργήθηκε, και τη σειρά δημιουργίας του χώρου.
- Ότι όνομα (αναγνωριστικό) δημιουργούμε θα διαγραφεί στο τέλος εκτέλεσης.
- Κάθε "μονάδα" είτε είναι τμήμα είτε κανονική συνάρτηση, έχει δικό του ένα αντικείμενο τύπου Basetask. Επειδή ο διερμηνευτής είναι ένα σύνολο συναρτήσεων όπου καλούνται η μία μεσα στην άλλη, μεταφέρεται μαζί με βασικές παραμέτρους και το αντικείμενο τύπου Basetask. Σε αυτό υπάρχει ο δείκτης προς τον "τωρινό" σωρό τιμών, καθώς επίσης και ο δείκτης για το αντικείμενο εξόδου (πχ η κοσνόλα, ή ένα επίπεδο πάνω στη κονσόλα, ή μια φόρμα του γραφικού περιβάλλοντος που μπορούμε να δημιουργήσουμε, ή ο εκτυπωτής που έχουμε επιλέξει). Οι εντολές εξόδου είναι ίδιες για οποιοδήποτε αντικείμενο εξόδου (εκτός από κάποιες εντολές που δεν υποστηρίζονται, όπως πχ μια εντολή να καθαρίσουμε το αντικείμενο εξόδου όταν αυτό είναι ο εκτυπωτής - απλά δεν γίνεται, απαιτείται εντολή αλλαγής σελίδας και επιλογή προσανατολισμού, οριζόντιου ή κάθετου).
- Και τα τμήματα και οι συναρτήσεις μπορούν να έχουν στατικές μεταβλητές. Δηλαδή μεταβλητές που μετά την αρχικοποίησή τους, θα έχουν τιμές που θα τις ξαναβρούμε σε επόμενες κλήσεις.
- Σημείωση (πχ REM η ΣΗΜ η ' ή // ή \\)
- Όνομα χωρίς να ακολουθεί τελεστής και χωρίς παρενθέσεις
- Όνομα χωρίς να ακολουθεί τελεστής με παρενθέσεις
- Γνωστό όνομα δομής (είτε για ορισμούς είτε για αλλαγή ροής εκτέλεσης)
- Όνομα (με $ ή με % στο τέλος ή χωρίς κάτι από αυτά) με τελεστή
- Όνομα (με $ ή με % στο τέλος ή χωρίς κάτι από αυτά) με παρενθέσεις και με τελεστή
- Κενή γραμμή
- Όνομα με το : στο τέλος χωρίς να ακολουθεί άλλο εκτός από κενό, αλλαγή γραμμής ή σημείωση.
- Αριθμός μέχρι πέντε ψηφία το 01 και το 00001 είναι το ίδιο το 1
- Αγκύλη { ή }
- Σύμβολο : (σημαίνει αλλαγή εντολής οριζόντια)
- Αλλαγή γραμμής (σημαίνει αλλαγή εντολής κάθετα).
Το (2) μπορεί να είναι εντολή πχ Τύπωσε 10 ή ένα όνομα τμήματος. Για το λόγο αυτό αν δώσουμε κάτι άγνωστο, πχ ΑΦΧΨ μας επιστρέφει μήνυμα ο διερμηνευτής ότι δεν υπάρχει τέτοιο τμήμα.
- Οι ρουτίνες δεν έχουν όνομα χώρου. Οπότε αν θέλουμε να ορίσουμε νέα μεταβλητή πρέπει να τη δηλώσουμε ως τοπική
- Οι ρουτίνες έχουν υποχρεωτικά παρενθέσεις ακόμα και αν δεν δηλωθούν παράμετροι. Εκτελούνται με τη Διαμέσου ή χωρίς. Αν υπάρχει πίνακας με ίδιο όνομα τότε ο διερμηνευτής θα "πιστέψει" ότι είναι πίνακας και θα βγάλει λάθος επειδή λείπει τελεστής!
- Η έξοδος από τη ρουτίνα γίνεται με το Τέλος Ρουτίνας ή το Έξοδος Ρουτίνας. Η έξοδος από ένα τμήμα γίνεται στο τέλος του κώδικά του, ή με την έξοδος. Ομοίως για τη Συνάρτηση, η έξοδος γίνεται όπως και στο τμήμα, και όχι με την επιστροφή τιμής.
- Οι ρουτίνες επειδή βλέπουν ό,τι έχει το τμήμα ή η συνάρτηση που βρίσκονται μπορούν να τα χρησιμοποιήσουν. Έτσι μπορούν να καλέσουν τον εαυτό τους. Οι ρουτίνες έχουν αναδρομή.
- Οι ρουτίνες δεν έχουν δικό τους σωρό τιμών αλλά μπορούμε να δηλώσουμε Σωρός Νέος { } και μέσα στο μπλοκ να έχουμε ένα καθαρό σωρό.
- Στο σωρό τιμών μπορούν να περαστούν μεταβλητές με τιμή ή με αναφορά. Γενικά με αναφορά δεν βολεύει αφού υπάρχει θέαση σε όλο το τμήμα, εκτός και αν έρχεται από κάπου αλλού!
- Ενώ ένα τμήμα είναι δυναμικό, δηλαδή μπορεί να αλλάξει κώδικα με νέο ορισμό, οι ρουτίνες δεν είναι δυναμικές, αλλά στατικές στο τμήμα ή τη συνάρτηση που βρίσκονται.
- Στα τμήματα και τις κανονικές συναρτήσεις οι ορισμοί βρίσκονται πριν την χρήση τους, ενώ στις ρουτίνες και τις απλές συναρτήσεις οι ορισμοί βρίσκονται στο τέλος του τμήματος ή της συνάρτησης που φτιάχνονται.
- Μια ρουτίνα μπορεί να καλέσει μια "αδελφή" ρουτίνα (έχουν και οι δύο τον ίδιο γονέα, το τμήμα ή τη συνάρτηση που ανήκουν), ενώ ένα τμήμα δεν αναγνωρίζει "αδέλφια" αλλά μόνο αυτό (υο παιδί) στο οποίο είναι απευθείας γονικό, και σε ότι είναι γενικό. Ένα τμήμα Α αν ορίζει ένα τμήμα Β και το Β ένα τμήμα Γ τότε το Α δεν βλέπει ο Γ. Αν καλέσουμε από το Α το Β και τερματίσει το Β τότε δεν θα υπάρχει Γ στο σύστημα, επειδή ο ορισμός του έγινε στο Β στην επιστροφή από το Β θα διαγραφεί. Υπάρχει μηχανισμός που κρατάει σε πακέτα τις στατικές μεταβλητές και τις φορτώνει στην επόμενη κλήση της Β. Έτσι οι στατικές μεταβλητές σχετίζονται με το γονέα βάσει κλήσης. Ένα τοπικό τμήμα καλείται από ένα μόνο τμήμα. Αν γενικό τμήμα μπορεί να κληθεί από άλλα όσο δεν τερματίζει το τμήμα που το δημιούργησε. Σε κάθε περίπτωση κλήσης του γενικού τμήματος, οι τυχόν στατικές μεταβλητές θα διαφέρουν βάσει του ποιου τμήματος έγινε η κλήση. Έτσι αν το ΑΑ είναι γενικό και έχει στατικές μεταβλητές και για τα τοπικά Β, Δ ενός τμήματος Ζ, το ΑΑ θα έχει δυο σετ στατικών, ένα για τη σειρά κλήσεων Ζ μετά Β μετά ΑΑ και ένα για τη σειρά Ζ μετά Δ μετά ΑΑ. Στις κανονικές συναρτήσεις οι στατικές στην αναδρομή είναι ίδιες για όλο το βάθος αναδρομής. Οι στατικές στην έξοδο γίνονται πακέτο και μπαίνουν στη συλλογή στατικών του προηγούμενου Basetask. Στην αναδρομή σε συναρτήσεις βγαίνει νέο αντικείμενο τύπου Basetask και σε αυτό απλά γράφεται ο δείκτης στην ίδια συλλογή στατικών με αυτό που έχει το πρώτο Basetask, στη πρώτη κλήση της συνάρτησης.
- Μια ρουτίνα δεν μπορεί να ορίσει ρουτίνες ή απλές συναρτήσεις. Ένα τμήμα και μια κανονική συνάρτηση μπορούν να ορίζουν άλλα τμήμα και συναρτήσεις καθώς και ρουτίνες και απλές συναρτήσεις. Σε μια ρουτίνα μπορούμε να ορίσουμε τμήματα και συναρτήσεις, και θα είναι ορατά μέχρι να τερματίσει η ρουτίνα. Αν όμως έχουμε ίδια ονόματα με τμήματα και συναρτήσεις που είναι ήδη ορισμένα και δεν είναι "τελικά", τότε θα αλλάξουμε το κώδικά τους!
- Μια ρουτίνα (όπως και οι απλές συναρτήσεις) δεν έχουν δικό τους αντικείμενο τύπου Basetask, άρα δεν έχουν και δικές τους στατικές. Αν υπάρχουν τις δημιουργούν. Οι στατικές δεν μπορούν να περαστούν με αναφορά σε ρουτίνες ή απλές συναρτήσεις. Μπορούν να περαστούν με αναφορά σε κλήσεις συναρτήσεων και τμημάτων
Τμήμα Γενικό χρήσηΣτατικής (ΝαΚαθαρίσω){
Αν ΝαΚαθαρίσω = Νέες_Στατικές τότε Καθαρό
Τύπωσε Γράμμα$
Στατική Κ=100
Συνάρτηση Κάππα(&Μ) {
=Μ^2
Μ++
}
Τύπωσε Κάππα(&Κ)
Τύπωσε Κάππα(&Κ)
Τύπωσε Κάππα(&Κ)
}
Τμήμα Αλφα {
Στατική Επιγραφή$="Από το τμήμα Άλφα"
χρήσηΣτατικής Νέες_Στατικές, Επιγραφή$
χρήσηΣτατικής Ως_Έχουν_Στατικές, Επιγραφή$ + " συνέχεια"
}
Τμήμα Βήτα {
Στατική Επιγραφή$="Από το τμήμα Βήτα"
χρήσηΣτατικής Νέες_Στατικές, Επιγραφή$
χρήσηΣτατικής Νέες_Στατικές, Επιγραφή$
}
Άλφα
Βήτα
- Όπως τα τμήματα και οι συναρτήσεις, οι ρουτίνες σβήνουν ότι έχουν δημιουργήσει με το πέρας εκτέλεσης, είτε το κανονικό στο Τέλος Ρουτίνας, είτε με έξοδο με το Έξοδος Ρουτίνας, είτε με κάποιο λάθος που μπορεί να συμβεί.
- Μπορούμε να καλέσουμε ότι υπάρχει μέσα στο τμήμα ή τη συνάρτηση, πχ άλλα τμήματα ή συναρτήσεις ή ρουτίνες ή απλές συναρτήσεις καθώς και ότι είναι γενικό.
Τύπωσε @όνομα(3)#Αθρ()=36, @όνομα(3)#Τιμη(1)=27
(κ, λ)=@όνομα(3)
Τύπωσε κ=9, λ=27
Συνάρτηση όνομα(χ
=χ**2, χ^3
Τέλος Συνάρτησης
για ι=1 έως 30
διαμέσου ετικέτα
επόμενο
Τέλος
ετικέτα:
κ=20
200αν κ<10 τότε 400
τύπωσε κ
κ--
διαμέσου ΔεςΑυτότοΛ()
αν Λ>100 τότε προς ετικέτα
προς 200
400τύπωσε "ΟΚ - Επιστροφή από:"; ι
Επιστροφή
Ρουτίνα ΔεςΑυτότοΛ()
Λ=Τυχαίος(95, 103)
Τέλος Ρουτίνας
- Το όνομα έχει παρένθεση, θα είναι πίνακας ή ρουτίνα, παράκαμψη...Α
- Υπάρχει εντολή του Execute, στη λίστα εντολών, δίνει έναν αριθμό και αυτός πάει σε μια On X Goto....και άμεσα γίνεται άλμα στο σημείο του Execute που είναι ο κώδικας της εντολής. Οι εκτέλεση εντολών εδώ γίνεται χωρίς άλμα έξω από το Execute.
- Υπάρχει εντολή και μαζί μας δίνεται και μια διεύθυνση που θα καλέσουμε το πρόγραμμα για να εκτελεστεί η εντολή και να επιστρέψουμε στο Execute.
- Κοιτάμε αν έχουμε τελεστή εκχώρησης ή αλλαγής τιμή, αν ναι τότε έχουμε μεταβλητή
- Κοιτάμε αν έχουμε τμήμα, αν ναι καλούμε το τμήμα
- Συναρτήσεις γράφονται σε δεξιές ή αριστερές εκφράσεις
- Ότι έχουμε δεξιά από ένα σύμβολο εκχώρησης ή αλλαγής τιμής είναι δεξιά έκφραση.
- Αριστερή έκφραση είναι ο δείκτης ενός πίνακα: πχ Α(δεξιάΈκφραση1)=δεξιάΈκφραση2, αριστερή έκφραση είναι το Α(δεξιάΈκφραση1), εδώ θα εκτελεστεί πρώτα η αριστερή και μετά η δεξιά έκφραση. Όμως στην εντολή Στη (Let) θα γίνει το ανάποδο θα εκτελεστεί η δεξιά έκφραση, και μετά η αριστερήΈκφραση.
- Δεξιά έκφραση είναι και οι εκφράσεις εντός ρουτίνας: πχ Α(δεξιάΈκφραση)
- Δεξιά έκφραση είναι και οι εκφράσεις σε ένα τμήμα: πχ Α δεξιάΈκφραση, ΆλληΈκφραση... και σε μια συνάρτηση ή απλή συνάρτηση.
Αδειασε
Τμήμα ΜΜ {
Σωρός
Αδειασε
}
ΜΜ 100, "α"+"β"="αβ"
ΜΜ "α"+"β"="αβ", 100
ΜΜ 100,"αβ"= "α"+"β"
ΜΜ "αβ"="α"+"β", 100
}
ΔοκιμήΑ
πόσα=μήκος(α$)
α$=φίλτρο$(α$,"*")
=α$
πόσα-=μήκος(α$)
}
Τόσα=0
Τύπωσε ΑφαίρεσεΑστέρια$("***ΑΒ***ΓΔΕ***Ζ", &Τόσα), Τόσα
Σωρός
Διάβασε α$, &πόσα
πόσα=μήκος(α$)
α$=φίλτρο$(α$,"*")
=α$
πόσα-=μήκος(α$)
}
Τόσα=0
Βάλε ΑφαίρεσεΑστέρια$("***ΑΒ***ΓΔΕ***Ζ", &Τόσα)
Τύπωσε Γράμμα$, Τόσα
- Ο κώδικας είναι εδώ χρωματισμένος από τον διορθωτή της Μ2000.
- Όταν αντιγράφουμε κώδικα από το διορθωτή της Μ2000 φτιάχνονται δυο αντικείμενα στο πρόχειρο, ένα απλού Unicode κειμένου (UTF16), και ένα HTML κειμένου (UTF8). Στο δεύτερο έχουν μπει και οδηγίες (tags) για το χρώμα. Η επικόλληση στο blogger δίνει το HTML κείμενο, άρα αυτό με το χρώμα. Αν επιλέξουμε το απλό κείμενο θα πάρει το απλό κείμενο.
- Επειδή στο διορθωτή χρησιμοποιούμε είτε το TAB (εξορισμού το TAB) είτε το Διάστημα για να βάζουμε εσοχές, κατά την αντιγραφή σε HTML αν δει ο διερμηνευτής τον χαρακτήρα TAB τότε εισάγει οδηγίες για κείμενο Monospace (με ίδιο πλάτος γράμματος για κάθε γράμμα). Αυτό όμως στο Blogger δεν κάνει αναδίπλωση λέξεων, οπότε δεν βγαίνει μαζεμένο σε περίπτωση που έχουμε μικρό πλάτος σελίδας. Οπότε υπάρχει η οδηγία στη κονσόλα Διακόπτες "-nbs" όπου το nbs σημαίνει (non break space), και αλλάζονται όλα τα TAB (στην αρχή των παραγράφων με διαστήματα. Στην HTML το NBS το θέλουμε γιατί αλλιώς χάνουμε τις εσοχές εκτός και αν έχουμε ανοίξει το κείμενο για Monospace κείμενο!
- Το πλάτος του TAB το καθορίζουμε με τη εντολή Σ ή Συγγραφή ή Edit αλλά αντί για όνομα (που θα άνοιγε τον διορθωτή, δίνουμε θαυμαστικό και νούμερο. Έτσι το Σ ! 2 κάνει το TAB να εμφανίζεται με δυο χαρακτήρες (μόνο στον διορθωτή και στην εξαγωγή HTML όταν αλλάζουμε τα TAB εσοχής με NBS, δείτε στο παράδειγμα κάτω ότι έχουμε δυο διαστήματα στην εσοχή!).
- Αν δεν θέλουμε να χρησιμοποιούμε TAB τότε δίνουμε το διακόπτες "-tab" (η εντολή παίρνει πολλούς μαζί γι' αυτό είναι στον πληθυντικό. Πχ διακόπτες "-tab -nbs".
- Ακόμα και αν χρησιμοποιούμε TAB, μπορούμε με το shift TAB να βάλουμε εσοχή με διάστημα. Αν σε ένα μπλοκ δεν υπάρχει εσοχή με TAB αλλά υπάρχει έστω και μια εσοχή με διάστημα τότε αν μαρκάρουμε πολλές γραμμές το πλήκτρο TAB βάζει εσοχές με διαστήματα.
- Με το F10 στο διορθωτή αλλάζουμε την εμφάνιση, μια φορά δείχνει χαρακτήρες που δεν φαίνονται, όπως διαστήματα (μια ειδική τελεία) και TAB (βελάκι), NBS (παραμένει ως διάστημα), το διάστημα αριθμών, καθώς και το τέλος παραγράφου, ενώ μια άλλη φορά το κανονικό κείμενο. Και στις δυο εμφανίσεις μπορούμε να διορθώνουμε κείμενο!
Για ι=1 έως 3 {
Τύπωσε Χαρκωδ(Μεσ$(Α$, ι)),
}
Τύπωσε ' αλλαγή γραμμής