Δευτέρα, 15 Φεβρουαρίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 3ο

Περιγραφή Βασικών Στοιχείων της γλώσσας Μ2000

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

Χωρίς να βγούμε από την γραμμή εντολών, σώνουμε τιμές σε μεταβλητές (τιμών) και πίνακες (τιμών). Όμως αυτό είναι σαν χρήση ενός πρόχειρου. Θέλουμε πρόγραμμα για να μας σώσει δεδομένα στο δίσκο, ή θέλουμε πρόγραμμα για να αυτοματοποιήσουμε διαδικασίες που μπορούμε να κάνουμε χειροκίνητα (manual mode). Τα προγράμματα γράφονται άμεσα στη μνήμη του διερμηνευτή, και καλούνται με ο όνομά τους. Αν θέλουμε τα σώνουμε στο δίσκο με ένα όνομα αρχείου, ώστε μια άλλη φορά να τα φορτώσουμε ξανά. Η ύπαρξη πολλών προγραμμάτων εντός του διερμηνευτή, μας βοηθάει για να δοκιμάζουμε διαφορετικές εκδοχές του ίδιου προγράμματος, χωρίς να βγαίνουμε από το περιβάλλον του διερμηνευτή.

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

Μια ιδιοτροπία της Μ2000 είναι ότι το τοπικό υπερισχύει του γενικού. Έτσι αν σε ένα τμήμα ορίσουμε το τμήμα Δέλτα και υπάρχει ήδη το γενικό Δέλτα, τότε μια εντολή Δέλτα μετά τον ορισμό του τοπικού Δέλτα καλεί το τοπικό Δέλτα. Αν βάλουμε μια ακόμα εντολή πριν τον ορισμό τότε καλεί την γενική Δέλτα. Ο διερμηνευτής εκτελεί εντολές, και οι ορισμοί τμημάτων είναι και αυτοί εντολές που πρέπει να εκτελεστούν για να καταχωρηθούν τα τμήματα προς εκτέλεση.

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

Η Μ2000 είναι δυναμική γλώσσα επειδή ξεκινάει μόνο με κώδικα και στην πορεία δημιουργεί με ορισμούς ότι θέλουμε. Από την BASIC έχει δανειστεί αρκετά στοιχεία:

  1. Τα ονόματα τμημάτων/συναρτήσεων/μεταβλητών/πινάκων μπορούν να γράφονται όπως θέλουμε σε σχέση με πεζά και κεφαλαία, έτσι τα Άλφα, Αλφα, ΑΛΦΑ είναι ίδια (οι τόνοι αφαιρούνται αυτόματα, τα ονόματα καταχωρούνται με κεφαλαία χωρίς τόνους). Επίσης το $ απαραίτητα πρέπει να υπάρχει στο όνομα όταν επιστρέφει αλφαριθμητική τιμή. Το % αν θέλουμε η τιμή να είναι ακέραια (ανεξάρτητα από το τύπο της τιμής). 
  2. Οι συναρτήσεις επιστρέφουν τιμή χωρίς να έχουμε δηλώσει τύπο με την εξαίρεση του γενικού τύπου (που ξεχωρίζει αριθμο ή αλφαριθμητικού). Αν μια συνάρτηση έχει στο όνομά της το $ στο τέλος τότε σημαίνει ότι γυρνάει αλφαριθμητικό ή αντικείμενο. Αν κάνουμε πως επιστρέφουμε αριθμό θα βγει λάθος. Μια συνάρτηση μπορεί να γυρίσει πίνακα ή μια λάμδα συνάρτηση (ανώνυμη συνάρτηση). 
  3. Οι Λάμδα συναρτήσεις είναι αντικείμενα που αποτελούν και τιμή και συνάρτηση. Ως τιμή μπορούν να περαστούν ως όρισμα, και να επιστραφούν από συνάρτηση. Ως συνάρτηση μπορούν να κληθούν σε εκφράσεις. Εκτός από το σώμα της συνάρτησης οι Λάμδα περιέχουν και μια λίστα "κλεισιμάτων", που φέρουν μαζί τους.
  4. Μπορούμε να ορίσουμε μεταβλητές με απλή εκχώρηση τιμής. Το = χρησιμοποιείται και για εκχώρηση και για ισότητα (υπάρχουν και τα == και <=>). Για γενικές μεταβλητές η εκχώρηση γίνεται με το <=  (αλλιώς το = θα κάνει τοπική μεταβλητή και θα σκιάσει τη γενική).
  5. Δεν μπορούμε να χρησιμοποιήσουμε μεταβλητή χωρίς να έχουμε δώσει τιμή. Εξαίρεση υπάρχει στις μεταβλητές σε ομάδες μεταβλητών όπου αυτόματα δίνει ο διερμηνευτής αρχική τιμή αν δεν έχει δοθεί. Εξ ορισμού η τιμή για αριθμούς είναι το 0 και ο τύπος του είναι double (πραγματικός).
  6. Άλλο ακέραια μεταβλητή και άλλο ακέραιος τύπος αριθμού.  Μπορούμε δηλαδή να ορίσουμε ακέραιες μεταβλητές που εσωτερικά θα έχουν πραγματικό τύπο (double) αριθμού. Το Α%=2.5 θα πάρει μια τιμή τύπου double 2.5 και θα κρατήσει την τιμή 3 επίσης τύπου double. To A%=2.5&   λόγω του & θα απορρίψει χωρίς λάθος το .5 και θα δώσει τον αριθμό 2 τύπου Μακρύς (long) στο Α%. Οι μεταβλητές κατά την πρώτη απόδοση τιμής αν δεν έχουν καθορισμένο τύπο θα πάρουν τον τύπο που είχε η πρώτη τιμή τους. Αν δώσουμε εντός τμήματος το Α%=2.5 : Α%=2.5&: Τύπωσε Α%, Τύπος$(Α%) θα πάρουμε το 2 και double (γιατί πρώτη τιμή πήρε double). Αν το δώσουμε στην γραμμή εντολών τότε το Α% θα είναι Long. αυτό συμβαίνει γιατί οι γενικές, σε αυτές που φτιάχνουμε στη γραμμή εντολών,  δεν κρατάνε τύπο. Ο λόγος που γίνεται αυτό είναι για την σωστή χρήση της υπερχείλισης. Στις τοπικές, και τις γενικές εντός τμημάτων ή συναρτήσεων, θέλουμε η υπερχείλιση να ελέγχεται από το κώδικα, ενώ στις γενικές στη γραμμή εντολών θέλουμε η μεταβλητή να πάρει το αποτέλεσμα όπως και να έχει. Ο εκτιμητής εκφράσεων αλλάζει τύπο για να χωρέσει το αποτέλεσμα, και εντός τμήματος ή συνάρτησης η αλλαγή αυτή δεν θα περάσει σε μια μεταβλητή που δεν το θέλουμε (θα βγει λάθος υπερχείλισης).
  7. Υπάρχουν τα GOTO, GOSUB και δουλεύουν εντός ενός τμήματος ή μιας συνάρτησης για ετικέτες ως αριθμοί (μέχρι 5 ψηφία) ή λέξεις (μπορούμε από το δεύτερο γράμμα να έχουμε αριθμό).
  8. Υπάρχουν οι ρουτίνες, δηλαδή υποπρογράμματα που διαφέρουν ως προς τα τμήματα, διότι ορίζονται, και απλά καλούνται βάσει του ονόματός τους, με αναζήτηση από το τέλος. Δηλαδή οι ρουτίνες υπάρχουν άμεσα για εκτέλεση από την πρώτη εντολή ενός τμήματος ή μιας συνάρτησης, και δεν μπορούν να αλλάξουν κώδικα όπως τα τμήματα. Χωρίζονται σε δυο κατηγορίες, τις απλές ρουτίνες, και τις λεγόμενες ρουτίνες με παρενθέσεις. Οι απλές ρουτίνες επιστρέφουν στο αμέσως επόμενο σημείο από εκεί που κλήθηκαν με μια εντολή Επιστροφή. Οι εντολές εκτελούνται σαν να μην υπήρχε κλήση ρουτίνας. Στις ρουτίνες με παρενθέσεις η επιστροφή γίνεται με το Τέλος Ρουτίνας ή το Έξοδος Ρουτίνας, και οτιδήποτε νέο έχει δημιουργηθεί κατά την κλήση διαγράφεται. Και οι δυο τύποι βλέπουν και αλλάζουν μεταβλητές του τμήματος που ανήκουν. Όπως φαίνεται η διαφορά τμημάτων και ρουτινών είναι ως προς την θέαση των μεταβλητών του "γονέα". Τα τμήματα δεν βλέπουν ονόματα (ή ορισμούς) από το γονέα (είναι καθαρά υποπρογράμματα).
  9. Η εξαγωγή γίνεται με την Τύπωσε ή Print και τα σύμβολα "," και ";" χρησιμεύουν για την διευθέτηση του δρομέα. Το κόμμα χρησιμοποιείται για να μετακινήσει το δρομέα στην επόμενη στήλη, ενώ το ερωτηματικό αφήνει το δρομέα εκεί που είναι και απλά γράφει από εκεί.
  10. Η εισαγωγή από το πληκτρολόγιο γίνεται με το Εισαγωγή ή Input. Μπορούμε να χρησιμοποιήσουμε και τα Ενκομ$ ή inkey$ για να κοιτάξουμε αν πατήθηκε κάποιο πλήκτρο (χωρίς αναμονή), ή το Κομ$ ή Key$ για να περιμένουμε να πατηθεί ένα πλήκτρο.
  11. Η βάση των πινάκων είναι εξ ορισμού το 0, έτσι το Πίνακας Α(10) θα έχει στοιχεία από το Α(0) έως το Α(9).  Μπορούμε να δηλώσουμε με το Βάση 1 ή Base 1 να γίνεται χρήση του 1 ως βάση. Αυτό μπορεί να γίνει απ΄ευθείας με εντολή, ή μέσα στη Πίνακας. Έτσι το Πίνακας Βάση 1, Α(10) θα φτιάξει τα στοιχεία από Α(1) έως Α(10). Επίσης μπορούμε να δώσουμε το Πίνακας Α(-5 έως 5) και να φτιάξουμε τα στοιχεία από το Α(-5) έως το Α(5) και θα υπάρχει και το Α(0). Μέγιστος αριθμός διαστάσεων είναι οι δέκα διαστάσεις. Οι πίνακες μπορούν να οριστούν ξανά και έτσι να περιορίσουμε τα στοιχεία τους ή να τα αυξήσουμε, χωρίς να διαγράψουμε τιμές στα στοιχεία που είχαν τιμή και παραμένουν στον πίνακα.
  12. Στις δομές επιλογής και επανάληψης υπάρχουν ομοιότητες αλλά και διαφορές οπότε δεν θα αναφερθούν εδώ.

Στοιχεία της Μ2000 που δεν υπάρχουν στην BASIC.

  1. Ενώ τα ονόματα συναρτήσεων και τμημάτων και ρουτινών (με παρενθέσεις) παρέχονται με αυτό που λέμε λίστα παραμέτρων, ειδικά στην Μ2000 η λίστα αυτή είναι χαλαρή, δηλαδή μπορούμε και από τα τρία αυτά στοιχεία (συναρτήσεις, τμήματα, ρουτίνες) να διαβάζουμε τα ορίσματα που στέλνονται κατά τη κλήση όχι άμεσα με τη κλήση αλλά σε άλλο χρόνο, και μπορούμε προαιρετικά να έχουμε  έλεγχο του τι στέλνεται με τη χρήση κατάλληλου κώδικα, ώστε να αποφασίσουμε τι θα κάνουμε στη συνέχεια. Δηλαδή αντί να έχουμε πολλαπλούς ορισμούς με το ίδιο όνομα και διαφορετική "υπογραφή" λίστας παραμέτρων, έχουμε ένα σημείο που καλούμε με ένα όνομα και σε αυτό επιλέγουμε βάσει των ορισμάτων που δόθηκε στη κλήση του τι θα κάνουμε τα ορίσματα αυτά. Η ανάγνωση παραμέτρων (και συνάμα δημιουργία αν δεν έχουν ήδη δημιουργηθεί) γίνεται με την ΔΙΑΒΑΣΕ.
  2. Οι συναρτήσεις επιστρέφουν τιμή χωρίς να έχουμε δηλώσει τύπο με την εξαίρεση του γενικού τύπου (που ξεχωρίζει αριθμο ή αλφαριθμητικού). Αν μια συνάρτηση έχει στο όνομά της το $ στο τέλος τότε σημαίνει ότι γυρνάει αλφαριθμητικό ή αντικείμενο. Αν κάνουμε πως επιστρέφουμε αριθμό θα βγει λάθος. Μια συνάρτηση μπορεί να γυρίσει πίνακα ή μια λάμδα συνάρτηση (ανώνυμη συνάρτηση). 
  3. Οι Λάμδα συναρτήσεις είναι αντικείμενα που αποτελούν και τιμή και συνάρτηση. Ως τιμή μπορούν να περαστούν ως όρισμα, και να επιστραφούν από συνάρτηση. Ως συνάρτηση μπορούν να κληθούν σε εκφράσεις. Εκτός από το σώμα της συνάρτησης οι Λάμδα περιέχουν και μια λίστα "κλεισιμάτων", που φέρουν μαζί τους.
  4. Στη Μ2000 το πέρασμα εξ ορισμού είναι με τιμή, έτσι είτε δώσουμε το Αλφα Χ είτε το Αλφα 5 θα έχουμε στο τμήμα Αλφα μια Διάβασε Κ όπου το Κ θα πάρει είτε τη τιμή του Χ είτε το 5 αντίστοιχα.
  5. Το πέρασμα με αναφορά πρέπει να δηλωθεί με το & πριν το όνομα μεταβλητής και στην αντίστοιχη Διάβασε η μεταβλητή πρέπει να έχει το & πριν και δεν πρέπει να υπάρχει ήδη (μια μεταβλητή ως αναφορά μιας άλλης μεταβλητής δεν μπορεί να πάρει άλλη αναφορά, για άλλη μεταβλητή). Έτσι αν υπάρχουν οι Α και Β και καλέσουμε είτε την Αλφα &Α είτε την Αλφα &Β τότε θα υπάρχει στη Αλφα μια Διάβασε &Κ όπου στην μια περίπτωση το Κ θα έχει συνδεθεί με το Α και στην δεύτερη περίπτωση το Κ θα έχει συνδεθεί με το Β (κάθε φορά που η Αλφα τερματίζει διαγράφει τη Κ και έτσι κάθε Διάβασε &Κ θα συμβαίνει για ένα νέο Κ)
  6. Μπορούμε να περάσουμε με αναφορά και στοιχείο πίνακα. Εδώ ο διερμηνευτής χρησιμοποιεί το σύστημα copy in, copy out. Κατά τη κλήση έχουμε μια Αλφα &Α(3) και στην Αλφα μια Διάβασε &Κ όπου η Κ θα έχει την τιμή της Α(3) αλλά χωρίς άμεση σύνδεση, και στο τέλος εκτέλεσης της Αλφα το Α(3) θα πάρει την τιμή που έχει το Κ την δεδομένη στιγμή.
  7. Δεν μπορούμε να ζητάμε αναφορά και να στείλουμε τιμή από έκφραση, πρέπει να στείλουμε αναφορά μεταβλητής
  8. Μπορούμε να περάσουμε με αναφορά έναν πίνακα πχ το Αλφα &Α() θα περάσει τον πίνακα Α() και στην Αλφα μια Διάβασε &Κ() δημιουργεί έναν νέο όνομα το Κ το οποίο δείχνει τον πίνακα που δείχνει το Α().
  9. Υπάρχει και η αναφορά συνάρτησης. Δηλαδή Αν το Α() είναι συνάρτηση τότε το Αλφα &Α() θα περάσει αναφορά συνάρτησης και το Διάβασε &Κ() θα δημιουργήσει μια συνάρτηση ίδια με την Α(). Αν η συνάρτηση ανήκει σε μια "επώνυμη" ομάδα, τότε και η αναφορά της θα ανήκει στην ίδια ομάδα. Με αυτόν τον τρόπο υλοποιούμε αυτό που λέμε "call back" ή κλήση προς τα πίσω, γιατί η συνάρτηση μιας ομάδας έχει θέαση (άρα μπορεί να χρησιμοποιήσει) μεταβλητών της ομάδας, που υπάρχουν πριν την κλήση της Αλφα, και μπορούμε να κάνουμε αλλαγές μέσα από την Αλφα με την κλήση της Κ() που είναι συνάρτηση συνδεδεμένη με την ομάδα έξω από την Αλφα.
  10. Υπάρχει το αντικείμενο Γεγονός που κρατάει μια λίστα αναφορών σε συναρτήσεις. Είναι το μόνο στοιχείο που πρεπει να δίνουμε στον ορισμό του απαραίτητα μια καθορισμένη λίστα παραμέτρων (δεν μπορούμε να δώσουμε παραπάνω στοιχεία, ή διαφορετικού τύπου). Μια κλήση με ορίσματα σε ένα Γεγονός θα καλέσει όλες τις συναρτήσεις με τα ίδια ορίσματα. Αν κάποιο από αυτά είναι με αναφορά τότε θα έχουμε διαδοχικά σε κάθε συνάρτηση πέρασμα της ίδιας αναφοράς.
  11. Οι ομάδες είναι τα αντικείμενα χρήστη (καθορίζονται από το χρήστη). Οι ομάδες έχουν ιδιωτικά και δημόσια μέλη. Μπορούν να έχουν όνομα ή να έχουν θέση σε στοιχείο πίνακα ή άλλου τύπου καταχωρητή. Υπάρχουν δυο ακόμα τύποι, οι ομάδες που είναι δείκτες σε ομάδες, και οι υπερκλάσεις (δεν θα αναφερθούμε εδώ σε αυτές). Για τις επώνυμες ομάδες μπορούμε να έχουμε και πράξεις μεταξύ τους με ορισμό τελεστών. Απ' όλους τους τύπους πάντα ο διερμηνευτής φτάνει σε μια επώνυμη ομάδα, ακόμα και αν χρειάζεται να δώσει αυτόματο όνομα σε μια ανώνυμη ομάδα, κατά τη χρήση μελών τις ομάδας, αν η ομάδα δεν είναι επώνυμη. Τα μέλη μιας επώνυμης ομάδας είναι συνάμα και μαζί με την ομάδα και χώρια. Έτσι μπορούμε μέλη της ομάδας να περαστούν με αναφορά (εκτός από τα τμήματα). Τις ιδιωτικές συναρτήσεις, στις οποίες έχουμε πρόσβαση μόνο από συναρτήσεις ή τμήματα που επίσης αποτελούν μέλη, πρώτα πρέπει να τις ενώσουμε με αναφορές σε νέες τοπικές συναρτήσεις και μετά αυτές τις τοπικές να τις περάσουμε με αναφορά σε κλήσεις.
  12. Οι πίνακες στη Μ2000 είναι καταχωρητές στοιχείων, και αρχικά έχουν το στοιχείο "Empty" το οποίο αριθμητικά δίνει το 0 και αλφαριθμητικά το "". Εκτός από αριθμούς (διάφορους τύπους) και αλφαριθμητικά, μπορούμε να έχουμε αντικείμενα (και οι καταχωρητές είναι αντικείμενα επίσης).
  13. Τύποι καταχωρητών είναι: Πίνακας με παρενθέσεις, Δείκτης σε Πίνακα, Δείκτης σε Κατάσταση (λίστα με κλειδιά και τιμές, ή μόνο κλειδιά που επιστρέφουν το κλειδί ως τιμή), Δείκτης σε Σωρό Τιμών (Ειδική στοίβα, μια συνδεδεμένη λίστα τιμών, όπου εύκολα παρεμβάλουμε και διαγράφουμε στοιχεία).
  14. Σταθερές. Μπορούμε να ορίζουμε σταθερές. Οι τιμές μπορούν να προκύπτουν από έκφραση. Δεν μπορούμε να αλλάξουμε τιμή σε μια σταθερή.
  15. Απαριθμήσεις. Μπορούμε να ορίσουμε ένα σύνολο σταθερών, και μεταβλητές που λαμβάνουν τιμές από αυτό το σύνολο (αν το σύνολο έχει δυο τιμές πχ το Αλφα=1 και Βήτα=2 τότε μπορούμε να έχουμε μια μεταβλητή που μπορεί να κρατήσει τις τιμές 1,2, -1, -2, δηλαδή και τις αρνητικές τιμές). Η μεταβλητή τύπου απαρίθμισης κρατάει μια τιμή από αυτές της απαρίθμησης και ένα πρόσημο. Το πρόσημο χρησιμοποιείται για να δώσει την τελική τιμή.
  16. Εκτός από τις ομάδες μεταβλητών έχουμε και τις δομές τιμών (ή άλλων δομών). Η διαφορά εδώ είναι ότι οι δομές χρησιμοποιούνται για διαρθρώσεις μνήμης (και δεν έχουν μεθόδους, δηλαδή τμήματα και συναρτήσεις). Μια διάρθρωση μνήμης είναι ένας μονοδιάστατος πίνακας μιας δομής (ή ενός απλού στοιχείου δομής). Στις διαρθρώσεις μπορούμε να έχουμε αριθμούς χωρίς πρόσημο και μπορούμε να διαβάζουμε με πολλούς τρόπους την ίδια μνήμη (μπορούμε να έχουμε δομή με ενώσεις - Unions). Μικρότερο απλό στοιχείο δομής είναι το ψηφίο ( ένα byte).
  17. Υπάρχουν αντικείμενα-βιβλιοθήκες όπως μια ειδική για μαθηματικά που κάνει πολλαπλές πράξεις με τετραδόνια, παρέχοντας διάρθρωση μνήμης με δομές τετραδονίων (τέσσερις αριθμούς τύπου double). Η χρήση της φαίνεται στο τμήμα demo1, για 3d γραφικά, στο αρχείο με διάφορα τμήματα που λέγεται info.gsb και παρέχεται στην εγκατάσταση της γλώσσας.

Διορθωτής (ή Συντάκτης Μ2000)

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

Στην γραμμή ενδείξεων εμφανίζεται εδώ το όνομα Τμήμα (διορθώνουμε τμήμα), το όνομά του, η θέση του δρομέα 30, η γραμμή 4, το σύνολο των γραμμών 5, το σύνολο των παραγράφων 5 (οπότε αν έχουμε διαφορά στο σύνολο γραμμών από το σύνολο παραγράφων, έχουμε αναδίπλωση και έχει συμβεί και οι γραμμές είναι περισσότερες από τις παραγράφους). Μετά δείχνει την κατάσταση των F6, F7, F8 (είναι οι σελιδοδείκτες, δηλαδή πατάμε κάπου το F6 και καταχωρεί παράγραφο και θέση στη παράγραφο, και αν είμαστε κάπου αλλού με F6 μας πάει στη θέση αυτή, ακόμα και αν έχουμε προσθέσει παραγράφους στο ενδιάμεσο, αφού κρατάει το μοναδικό αριθμό παραγράφου και όχι τον αριθμό σειράς παραγράφου). Εδώ οι ρόμβοι δηλώνουν ότι είναι άδειοι οι σελιδοδείκτες. Οι σελιδοδείκτες αν βγούμε από τον διορθωτή και ξαναμπούμε θα είναι εκεί, αλλά αν αλλάξουμε τμήμα για διόρθωση δεν σώνονται. Αμέσως μετά βλέπουμε τη γλώσσα πληκτρολογίου. 
Η προβολή μπορεί να αλλάξει για να δείχνει τους κρυφούς χαρακτήρες:
Η Μ2000 αναγνωρίζει τρια διαφορετικά διαστήματα και ανάλογα τα εμφανίζει. Μπορούμε να συνεχίσουμε να διορθώνουμε έτσι!
Επίσης μπορούμε να μεταθέτουμε πολλές γραμμές με το tab δεξιά και με το shift-tab αριστερά. Αυτόματα οι επόμενες γραμμές παίρνουν τα ίδια διαστήματα στην αρχή της προηγούμενης γραμμής. Επίσης αν έχουμε ξεκινήσει αρίθμηση τότε μπαίνει αυτόματα το επόμενο νούμερο, ανά δέκα αύξηση, ή αν υπάρχει μπαίνει ανά μονάδα.
Υπάρχει αναζήτηση προς τα άνω ή κάτω εκείνου που σημειώνουμε (με κλικ πάνω σε λέξη, ή μεταβλητή σημειώνεται όλη) με τα F2 και F3, ενώ μπορούμε με τα Shift F2 και Shift F3 να ορίσουμε λέξη, ή φράση για αναζήτηση. Μπορούμε να επιλέξουμε μια λέξη να αλλάξουμε κάποια γράμματα από πεζά σε κεφαλαία ή το ανάποδο και με F4 να τα αλλάξουμε όλα στο κείμενο. Με F5 κάνουμε αλλαγές σε όλο το κείμενο, μαζικές, οι οποίες όμως έχουν αναστροφή, ανά μια όμως με ctrl+z (undo). Υπάρχει και το ανάποδο ctrl+Y (redo). Το drag (σύρσιμο) είναι αρχικά κλειδωμένο, αλλά μπορεί κανείς να το ξεκλειδώσει από το αναδυόμενο μενού. Το drop (να αφήσουμε κάτι) δουλεύει συνέχεια, μπορούμε από την βοήθεια με επιλογή - ξεκινάει όταν τον κρυφό δρομέα στη βοήθεια τον εμφανίσουμε σε μια άδεια γραμμή με κλικ- να πάρουμε τα παραδείγματα που μας δείχνει και να τα ρίξουμε άμεσα στο κείμενο του διορθωτή.
Μπορούμε με το F9 να πάρουμε τον αριθμό των λέξεων στο κείμενο. Το cfrl+F1 και με επιλεγμένη μια εντολή μας δίνει την βοήθεια γι΄αυτήν (δεν έχει τελειώσει ακόμα το αρχείο της βοήθειας για όλες τις εντολές). Το F12 μας δίνει λίστα με ότι έχουμε στη λίστα τμημάτων/συναρτήσεων και με κλίκ σε ένα όνομα μας το εμφανίζει, αλλά χωρίς χρωματισμό, έτσι ώστε να μην χρειάζεται να φύγουμε από τον διορθωτή αν θέλουμε να αντιγράψουμε κάτι από άλλο τμήμα.
Το F10 βγάζει/βάζει το χρωματισμό. Ο χρωματισμός γίνεται μόνο στον διορθωτή, ενώ στη λίστα τμημάτων/συναρτήσεων τα προγράμματα είναι απλά αλφαριθμητικά. Είναι πολύ γρήγορος- δεν υπάρχει καθυστέρηση, ενώ αν ανοίξουμε ένα τεράστιο πρόγραμμα πχ 50000 γραμμών γίνεται τμηματικά καθώς εμφανίζουμε γραμμές οπότε δεν αργεί ούτε σε αυτή τη περίπτωση. Δεν υπάρχει πρακτικά όριο για τον αριθμό γραμμών/παραγράφων.
Μπορούμε να χρησιμοποιήσουμε οποιαδήποτε γραμματοσειρά (παίρνει αυτή της κονσόλας) και έχει ακριβώς το ίδιο διάστιχο (μπορούμε να το ορίσουμε από τις ρυθμίσεις (εντολή ρυθμίσεις) ή με την εντολή Φόρμα να ορίσουμε αυτόματα και το διάστιχο, πχ. Φόρμα 80,25 δίνει άλλο διάστιχο από την Φόρμα 80,50)
Ο διορθωτής δέχεται και τόνους ξεχωριστούς πάνω από γράμματα, και μπορεί να δείξει οποιαδήποτε γλώσσα (είναι Unicode στοιχείο).
Η ολίσθηση άνω και κάτω γίνεται ή με την κρυφή κάθετη μπάρα ολίσθησης στα δεξιά (αν κατεβάσουμε την μπάρα θα ωθήσουμε τις γραμμές προς τα πάνω άρα θα πάμε στο τέλος του κειμένου), ή με πάτημα και κράγημα του αριστερού πλήκτρου του ποντικιού και ώθηση.(ώθηση προς τα πάνω ωθεί τις γραμμές προς τα πάνω). Η ολίσθηση δεν αλλάζει τη θέση του δρομέα, θα πρέπει να την μεταφέρουμε με κλικ πάνω σε γραμμή ή κείμενο. Η θέση του δρομέα αλλάζει με τα βελάκια, με την αλλαγή σελίδας πάνω και κάτω, τα Home και End, Backspace, Enter αλλά και με το ροδελάκι στο ποντίκι - κάνει αλλαγή σελίδας, εκτός αν δεν μπορεί, δεν έχει άλλη σελίδα, και τότε αλλάζει γραμμές).


1.1. Τρόπος Σημειώσεων
Σημειώσεις μπαίνουν με \ ή ' ή την λέξη Σημ. Η χρήση της ' δεν κάνει αν θέλουμε να εξάγουμε το πρόγραμμά μας σε φόρουμ όπου δεν μπορούμε να περάσουμε το κείμενο με την HTML φόρμα του (την φτιάχνει αυτόματα ο διερμηνευτής κατά την αντιγραφή, με χρώματα κανονικά - υπάρχει ρύθμιση στις Ρυθμίσεις για σκοτεινό ή φωτεινό φόντο, δηλαδή για χρήση χρωμάτων βάσει φόντου)
Άρα χρησιμοποιούμε το \ και ίσως πιο ωραία τη διπλή γραμμή \\ ή αυτό \* , ο διερμηνευτής βλέπει μόνο το πρώτο, τα άλλα τα παραβλέπει μέχρι το τέλος της γραμμής.Το χρώμα είναι ενιαίο για όλη τη σημείωση.
Η Σημ έχει μια άλλη χρησιμότητα. Συνήθως την χρησιμοποιούμε με αριθμό και άνω κάτω τελεία. Έχει την ιδιότητα να χρωματίζει το περιεχόμενό της, σαν να ήταν εντολές. Έτσι την χρησιμοποιούμε για να σκιάζουμε εντολές που δεν θέλουμε να τρέξουν, αλλά ίσως την επόμενη φορά θέλουμε να αλλάξουμε, να βάλουμε σε αυτήν που έτρεχε την Σημ και να την αφαιρέσουμε από κάποια  γραμμή πριν ή μετά την μόλις σημειωμένη.

\\ αυτή είναι σημείωση με χρώμα έντονο
Φόρμα 40,20 \\ αυτή είναι σημείωση στο πλάι εντολής
Σημ 1.: Οθόνη 5,0 \\ εδώ έχουμε δυο σημειώσεις μαζί. η εντολή οθόνη δεν θα τρέξει

Αντί της αφαίρεσης της Σημ κάνουμε αυτό, με ένα Enter μετά την άνω κάτω τελεία βάζουμε την Οθόνη ως κανονική εντολή.
Σημ 1.:
Οθόνη 5,0

1.2. Ορισμοί
  • Ορίζω στη Μ2000 σημαίνει δίνω στο διερμηνευτή όνομα ή αριθμό ή μορφή σε κάτι το οποίο θα το ξεχωρίζει μέχρι ένα σημείο όπου θα διαγράφεται
  • Προγραμματίζω σημαίνει χειρίζομαι αυτά που ορίζω. Άρα αν δεν ξέρω πώς να φτιάξω ένα πρόγραμμα, τότε σίγουρα δεν ξέρω τι να ορίσω! 
Παλιά ορίζαμε μόνο μεταβλητές (ενώ τώρα ορίζουμε αντικείμενα και μετά σκεπτόμαστε τι και πως θα κρατάνε κάτι). Δηλαδή παλιά ορίζαμε το χώρο που θα γραφτούν πράγματα για επεξεργασία, με ονόματα που δίναμε. Μάλιστα το πρώτο που μάθαινε κανείς ήταν ο χάρτης μνήμης, σαν ένα οικόπεδο αλλά για την μνήμη, όπου έλεγε από που έως που γράφονται οι μεταβλητές. Η χρήση τους δηλαδή είχε και ένα άγχος για το αν ο υπολογιστής έχει την απαιτούμενη μνήμη. Για το λόγο αυτό ξεκίναγε η ανάλυση με το προσδιορισμό του απαιτούμενου μεγέθους σε δεδομένα. Όταν τα δεδομένα ήταν υπέρ αρκετά τότε στρέφονταν σε αρχεία, και αυτά με όνομα και έκταση-μέγεθος.

1.2.1 Απεριόριστη Μνήμη! Για την Μ2000 και στους σύγχρονους υπολογιστές η γνώση της μνήμης που απαιτείται για τη καταχώρηση στοιχείων είναι πλεονασμός. Υπάρχει τόση μνήμη που πρακτικά για να την γεμίσει κανείς πρέπει να το κάνει επίτηδες! Για παράδειγμα αν αποφασίσω κάθε λεπτό να περνάω πέντε αριθμούς που θέλουν 100 Bytes...(θέλουν πολύ λιγότερο στην πραγματικότητα), τότε 100.000.000 bytes ισοδυναμούν με 1 εκατομμύριο λεπτά από τη ζωή μας.ή 19 χρόνια χωρίς να κάνουμε τίποτα άλλο! Η Μ2000 μπορεί να χειριστεί 2 Giga Μνήμη ή 20 φορές χώρο που θέλουμε 19 χρόνια να τον γεμίσουμε, δηλαδή δεν μας φτάνει η ζωή για να το γεμίσουμε. Πραγματικά ο τρόπος για να γεμίσει κανείς την μνήμη είναι να ασχοληθεί με βίντεο που έχει μεγάλο όγκο. Η Μ2000 παίζει βίντεο, δεν φτιάχνει βίντεο, ούτε έχει φτιαχτεί για τέτοιους σκοπούς. Εδώ μας ενδιαφέρει ότι η μνήμη του υπολογιστή είναι τεράστια! Άρα δεν υπάρχει θέμα για να ψάχνουμε τον χάρτη μνήμης. Όταν ασχοληθούμε με αρχεία τότε θα πρέπει να προσδιορίζουμε μεγέθη. Ομοίως όταν ασχοληθούμε με εμφάνιση στοιχείων, στην οθόνη ή και στον εκτυπωτή. Γιατί και στα δύο μας ενδιαφέρει που πάει αυτό που έπεται ή και που είναι αυτό που προηγείται.

1.2.2. Προσωρινές Μεταβλητές. Για τις μεταβλητές μας, η σειρά εμφάνισης έχει μια σημαντικότητα όταν μιλάμε για το πού εμφανίζονται, πρώτη φορά, δηλαδή που ορίζονται. Και αυτό γιατί πρέπει να έχουμε μια ιδέα για το χρόνο που θα υπάρχουν. Τα πάντα είναι προσωρινά σε ένα πρόγραμμα! Δηλαδή το πρόγραμμα φορτώνει και χειρίζεται στοιχεία από κάποιες πηγές (ίσως ένα μέρος τους και από το ίδιο) και παράγει αποτελέσματα, τα οποία αν δεν τα πάρουμε σε χαρτί ή σε αρχείο, τότε δεν θα τα ξαναδούμε αν στην επόμενη εκτέλεση δεν έχουμε τα ίδια δεδομένα, και συνήθως δεν έχουμε (ειδικά αν δεν κάνουμε μια απλή εργασία να πάρουμε ένα αρχείο, π.χ. κειμένου και να το τυπώσουμε, που μπορεί να γίνει όσες φορές θέλουμε)

1.2.3. Γενικές-Τοπικές Μεταβλητές/Αναγνωριστικά
Η Μ2000 ξεχωρίζει δυο κύρια διαφορετικά επίπεδα ονομάτων ή αλλιώς αναγνωριστικών που φτιάχνει ο προγραμματιστής. Το γενικό και το τοπικό. Το τοπικό έχει πάντα προτεραιότητα. Μπορούν δυο αναγνωριστικά να συνυπάρχουν σε αριθμητικές εκφράσεις π.χ. Α+Β ενώ το ένα είναι γενικό και το άλλο τοπικό. Τοπικό αναγνωριστικό σημαίνει ότι ανήκει σε ένα άλλο αναγνωριστικό. Ένα γενικό αναγνωριστικό ορίζεται οπουδήποτε. και ισχύει μέχρι ο χώρος που ορίστηκε (το αναγνωριστικό δηλαδή) να τερματίσει. Μπορεί δε να διαβαστεί απ' ό,τι θα οριστεί από το σημείο που ορίστηκε και μετά (και με τρόπο γίνεται και το ανάποδο, να διαβαστεί από ένα σημείο που έτρεχε στο παρελθόν, και είναι σε αναμονή εκτέλεσης). Η επιλογή γενικού-τοπικού συνήθως γέρνει υπέρ του τοπικού, αφού τα προγράμματα έχουν μια πρόσκαιρη χρήση μεταβλητών, άρα οι τοπικές είναι σε πρώτη ζήτηση. Παρόλα αυτά γενικές μπορούν να χρησιμοποιηθούν για λίγα κοινά πράγματα, π.χ. ένα email που θέλουμε να είναι γνωστό παντού στο πρόγραμμα και το έχουμε εισάγει από το χρήστη. Και πάλι όμως η χρήση αρχείων, για αποθήκευση μπορεί να αποτρέψει την χρήση γενικών μεταβλητών (δηλαδή η ιδέα είναι: φύλαξε σε αρχείο την κατάσταση του προγράμματος).

Διάρκεια ζωής μεταβλητής
Οι τοπικές μεταβλητές στη Μ2000 είναι  "αυτόματες", δηλαδή δημιουργούνται και διαγράφονται μετά την εκτέλεση του τμήματος ή της συνάρτησης που τις έφτιαξε. Οι γενικές μεταβλητές είναι και αυτές αυτόματες, αν έχουν δημιουργηθεί μέσα σε τμήματα ή συναρτήσεις. Άρα μια γενική που φτιάχτηκε στο τμήμα Α ανήκει στο Α από άποψη διάρκειας ζωής.

Με απλά λόγια κάθε μεταβλητή έχει μια εμβέλεια (scope) όπου μπορεί να χρησιμοποιηθεί στον κώδικα και μια διάρκεια ζωής. Όταν η μεταβλητή βγει εκτός εμβέλειας στην Μ2000 θα διαγραφεί.

Ο διερμηνευτής όταν εκτελεί κώδικα έχει μια εσωτερική μεταβλητή που ονομάζει Ηere$ στον κώδικά του. Αυτή είναι μια γενική μεταβλητή, σαν ένα είδος program counter, αλλά για τμήματα/συναρτήσεις. Όπως και o program counter, σε έναν επεξεργαστή σώνεται σε σωρό, έτσι και αυτή η τιμή σώνεται όταν χρειάζεται να εκτελεστεί άλλο κομμάτι κώδικα. Μια μεταβλητή τοπική έχει δυο ονόματα, το όνομα που δίνουμε και το όνομα στο Here$. Μια γενική μεταβλητή έχει μηδενικό Here$ (κενό αλφαριθμητικό ""). Η μεταβλητή Τμήμα$ μας δίνει την τρέχουσα τιμή της Here$. Το όνομα όμως που τελικά έχει ένα τμήμα, δεν είναι πάντα αυτό που δίνουμε, αλλά κάποιο που επιλέγει ο διερμηνευτής. Στο κώδικα όμως χρησιμοποιούμε αυτό που εμείς έχουμε επιλέξει!


Τμήμα δ {
      χ=20
      Τμήμα δ {
            χ=30
            Τύπωσε "Εσωτερικό δ", χ \\30
      }
      \\ χωρίς κάλεσε επειδή το δ είναι το όνομα του τμήματος δίνει λάθος ("όχι αναδρομή σε τμήματα")
      \\ η Κάλεσε λειτουργεί διαφορετικά από την απλή κλήση, με το όνομα σκέτο.
      Κάλεσε δ \\ η Κάλεσε καλεί την εσωτερική δ
      \\ Αν δεν υπήρχε εσωτερική δ, θα έκανε αναδρομή, θα καλούσε τον εαυτό της!
      Τύπωσε χ \\ 20
} Κάλεσε δ



Με τη χρήση του νέου διερμηνευτή (έκδοση 9) το παρακάτω δεν δίνει Α[1] αλλά κάτι περισσότερο, ακόμα ένα τμήμα [Χ], όπου Χ ένας αριθμός, όπως αυτόματα επιλέγει ο διερμηνευτής. Και στους δυο τύπους διερμηνευτή το αριθμητικό αποτέλεσμα στο παρακάτω είναι ίδιο, αλλάζει μόνο ο τρόπος που οι μεταβλητές επαυξάνονται στο όνομα, για να καθοριστεί ο "σκοπός" τους
Αν χρησιμοποιήσουμε τον παλιό διερμηνευτή με την Θέσε Διακόπτες "-SEC" τότε ισχύει το παρακάτω (το Θέσε δεν χρησιμοποιείται αν δώσουμε την εντολή από τη γραμμή εντολών της Μ2000):

\\ έστω ότι ο κώδικας αυτός είναι στο τμήμα Α
Τμήμα Αλφα {
      Χ=10
      Α$=Τμήμα$+".Χ"
      Τύπωσε Τμήμα$
      Τύπωσε Εκφρ(Α$)
}
\\ Με κλήση με την κάλεσε το όνομα της Αλφα γίνεται Α[1]
Κάλεσε Αλφα
\\ Τυπωνει Α[1]
\\ Τυπωνει 10
\\ Με κλήση χωρίς την κάλεσε το όνομα παραμένει ΑΛΦΑ (κεφαλαία, αφαιρούνται και οι τυχόν τόνοι)
Αλφα
\\ Τυπωνει ΑΛΦΑ
\\ Τυπωνει 10



1.2.4. Τήματα/Συναρτήσεις/Μεταβλητές
Με το Σ Α που έχουμε μάθει μέχρι τώρα για να ορίσουμε ένα τμήμα, δίνουμε χώρο για να γράψουμε ό,τι θέλουμε και θα ανήκει στο Α. Όμως πρέπει να κατανοήσουμε κάτι σημαντικό για την Μ2000.  Το τμήμα Α είναι ένα κείμενο, που όσο δεν εκτελείται είναι σε ύπνωση! Με το που θα πάρει εντολή να ξεκινήσει (με το όνομά του), τότε σίγουρα θα κατασκευάσει ό,τι χρειάζεται! Όταν τερματίσει θα έχει σβήσει ότι έφτιαξε. (εκτός από αρχεία, και εκτυπώσεις..αυτά είναι οι εξαγωγές, που θεωρούνται μόνιμες). Η εντολή Σ αντιστοιχεί στην Συγγραφή.

Αν στην Α φτιάξουμε δυο τοπικές έστω Α και Β και μια γενική Γ και καλέσει το τμήμα Β τότε η Γ θα φαίνεται στο τμήμα Β ενώ οι Α και Β δεν θα φαίνονται. Η ορατότητα της μεταβλητής καθορίζεται από το αν είναι γενική ή τοπική. Η Γ αν και φτιάχτηκε στο τμήμα Α ορίστηκε ως Γενική. Αν υπήρχε γενική Γ που είχε οριστεί πιο πριν τότε η Γ που θα δημιουργήσει το Α θα είναι νέα και όταν το Α τερματίσει η Γ η παλιά θα είναι και πάλι στο προσκήνιο. Ομοίως αν υπήρχε μια Β γενική και φτιάξαμε στο Α μια Β τοπική τότε η Β γενική δεν θα φαίνεται στην Α αλλά αν καλέσουμε το τμήμα  Γ τότε θα φαίνεται στο Γ.
Παράδειγμα με χρήση γενικής και ορατότητα αυτής
Γενική Γ=100
Τμήμα Β {
      Γ=500
      Τμήμα Ν {
            Τύπωσε Γ, Γ=100
      }
      Τύπωσε Γ, 500
      Ν
      Γενική Γ=200 \\ επειδή έχουμε την τοπική Γ ...
      Ν   \\ στο Ν όμως θα φανεί!
      Τύπωσε Γ, 500 \\ ...εδώ δεν θα φανεί η νέα γενική
}
Τύπωσε Γ, 100
Β
Τύπωσε Γ, 100


Στις γενικές αλλαγή τιμής γίνεται με το <=  (ενώ το = δημιουργεί τοπική)

Όταν ένα τμήμα Α καλέσει ένα άλλο Β τότε το Α μπαίνει σε αναμονή εκτέλεσης, εκτελείται το Β και όταν τερματίσει επιστρέφει το Α σε κανονική εκτέλεση, αμέσως μετά την εντολή κλήσης της Β. Ένα τμήμα δεν μπορεί να καλέσει τον εαυτό του με την κανονική κλήση. Η κλήση του Α στο Α, το ίδιο Α, λέγεται αναδρομή και γίνεται με τρόπο που θα αναφερθεί χωριστά σε άλλο κεφάλαιο.
(Αναδρομή έχουν οι συναρτήσεις - και οι λάμδα συναρτήσεις με όνομα συνάρτησης Λάμδα() ή Λάμδα$() ανάλογα- και οι ρουτίνες τύπου Ρουτίνα/Τέλος Ρουτίνας)

Τα ονόματα μεταβλητών και τμημάτων μπορούν να είναι ίδια.

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

Α=10.23
Α%=-10
Α$="Γεια χαρά!"

Παράδειγμα με  συναρτήσεις Λάμδα

Χ=2
Α=Λάμδα Χ ->Χ**2
Χ=10
Τύπωσε Α(), Χ \\ τυπωνει 4 και 10
Β=Α
Τύπωσε Β(),Χ \\ τυπώνει 4 και 10
Β=Λάμδα Χ ->Χ**2
Τύπωσε Β(),Χ \\ τυπώνει 100 και 10
Α=Β
Τύπωσε Α(), Χ \\ τυπωνει 100 και 10






Εδώ αντιγράφουμε μια λάμδα (την Μ) σε μια νέα Κ, και σε αυτήν αντιγράφεται η τρέχουσα κατάσταση της Μ (η οποία εκτός από την συνάρτηση στο Μπλοκ { } που μπορεί να είναι πολλαπλών γραμμών, δίνει και την μεταβλητή χ που κρατάει στο περιβάλλον της. Η Μ2000 έχει στατικές διαφορετικού τύπου, ανά αντικείμενο εκτέλεσης, ενώ εδώ η χ θα είναι ίδια όπου και αν πάει η Μ ή η Λ. Μπορεί μια συνάρτηση να γυρίσει τιμή την Μ ή την Κ (χωρίς τις παρενθέσεις δίνει το αντίγραφό της, ενώ με παρενθέσεις και ίσως με ορίσματα, δίνει το αποτέλεσμα της συνάρτησης που περιέχει. Η χ είναι μέρος του μηχανισμού σύλληψης, και μπορούμε να βάλουμε οτιδήποτε προς σύλληψη, έναν πίνακα, ή μια ομάδα, και σε όποιο αριθμό θέλουμε. 
Μ=Λάμδα χ=1->{=χ:χ++}
Τύπωσε Μ(), Μ(), Μ() \\ 1,2,3
Κ=Μ
Τύπωσε Μ(), Μ(), Μ() \\ 4,5,6
Τύπωσε Κ() \\ 4
 

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

Αν γυρίσουμε στο χάρτη μνήμης, στη Μ2000 έχουμε το χάρτη τμημάτων με την εντολή ΤΜΗΜΑΤΑ, τον χάρτη μεταβλητών με την εντολή  ΛΙΣΤΑ και τον χάρτη του σωρού με την εντολή ΣΩΡΟΣ.

Με την Σ Α φτιάχνω τμήματα, με Σ Α( τη συνάρτηση Α(), με Σ Α$( τη συνάρτηση αλφαριθμητικών Α$(), την Σ Α%( την συνάρτηση ακεραίων, και με την Τμήματα ? βλέπω τα τμήματα/συναρτήσεις που έχω φτιάξει.
Αν τρέξω ένα τμήμα και σε αυτό έχω γράψει τις μεταβλητές (αν δεν τις ορίσω γενικές, τότε εξ ορισμού είναι τοπικές)
Α=10
Β=20
Λίστα
Θα πάρω τη λίστα των μεταβλητών και του τμήματος και όσων είναι στη μνήμη (ακόμα και αυτών που δεν είναι ορατές από το τμήμα.

Και εκτός τμήματος αναφέρθηκε πιο πάνω ότι μπορώ να έχω μεταβλητές (σε φάση δηλαδή χειροκίνητης λειτουργίας). Μάλιστα μπορώ σε ένα τμήμα να κάνω αυτό  (γράφω Σ Α)
Α=10
Β=20
Βάλε Α+Β
(μετά πατάω ESC και γράφω Α και πατάω enter)
Στην έξοδο από το τμήμα (όταν τερματίσει) γράφω Σωρός και βλέπω το 30
Τώρα μπορώ να το πάρω:
Διάβασε Κ
Λίστα
Τώρα βλέπω μόνο την Κ = 30. Οι Α και Β έχουν διαγραφεί, μόνο η τιμή στο σωρό έμεινε,και αυτή μέχρι να την σηκώσω στην Κ!

Προσθήκη: Στο σωρό βάζουμε και συναρτήσεις λάμδα:

Άδειασε  \\ αδειάζει το σωρό
Χ=2
Α=Λάμδα Χ -> { Διάβασε Υ : =Υ*Χ**2 }
Τύπωσε Α(10) \\ 40
Βάλε Α
Τύπωσε Ταύτιση("Λ") \\ δίνει -1 έχουμε Λάμδα στην κορυφή του σωρού
Σωρός   \\ μας τυπώνει στην οθόνη το σωρό, χωρίς να τον πειράξει
Πάνω \\ διπλασιάζει την κορυφή
Διάβασε Β, Γ
Α=100
Τύπωσε Α , Α(10) \\ 100, 0 δεν δίνει λάθος αλλά δεν υπάρχει πια συνάρτηση Α
Α=Λάμδα->100
Τύπωσε Α , Α(10) \\ 100, 100  τώρα υπάρχει συνάρτηση!
Τύπωσε Β(10), Γ(20) \\ 40, 80


Από την έκδοση 8.5 έχουμε και μεταβλητές τύπου Σωρού.


1.2.6. Φωλιασμένοι ορισμοί τμημάτων
Αντιγράψτε το παρακάτω σε ένα τμήμα Β

Τμήμα Μ {
      Τμήμα Ν {
            Διάβασε Κ
            Τύπωσε Κ
      }
      Ν
}

Μ 20

Το πρόγραμμά μας περιγράφεται έτσι: στον ορισμό Β του τμήματος Β βάλαμε δυο τμήματα (δύο ορισμούς τμημάτων), το Μ και μέσα σε αυτό το Ν. Στο τμήμα Ν θα διαβάσουμε την Κ (από το σωρό) και θα την τυπώσουμε στην οθόνη μας.
Καλούμε τη Β και αυτή ορίζει μόνο το Μ. μετά καλεί το Μ με παράμετρο το 20, το οποίο πάει στη κορυφή του σωρού. 
Εκτελούμε το Μ το οποίο ορίζει το Ν και το εκτελεί.
Εκτελούμε το Ν και εκεί διαβάζουμε το Κ από το σωρό, όπου βρίσκουμε τον αριθμό 20, τον οποίο τελικά  δίνουμε και παίρνουμε με την Τύπωσε στην οθόνη μας!
Συμπέρασμα:
  • Όταν έτρεξε το Β δεν υπήρχε Μ και Ν, ούτε η μεταβλητή Κ
  • Στην εντολή Μ υπάρχει μόνο το τμήμα Μ, και το 20 πάει στο σωρό
  • Όταν έτρεξε το Μ υπήρχε το Β και το Μ και φτιάχτηκε το Ν και εκτελέστηκε αμέσως μετά
  • Όταν έτρεξε το Ν τότε διαβάστηκε το νούμερο από το σωρό, και εμφανίστηκε στην Οθόνη
  • Για το Ν δεν υπάρχει το Μ αλλά υπάρχει το Β γιατί είναι γενικό!
  • Αν βάλουμε το Β μετά τη Κ θα τρέχει πάνω από 10000 φορές μέχρι να πιάσει ένα όριο που έχει τεθεί για να σταματάνε οι κλήσεις σε βάθος. Σταματάει με Esc 
  • Το πλήκρο Esc προκαλεί έξοδο, άρα και σβήσιμο μεταβλητών.
  • Το πλήκτρο Break, μας ρωτάει πρώτα και αν θέλουμε τερματίζει και καθαρίζει τα πάντα!
  • Όταν τερμάτισε το Ν, χάθηκε η Κ
  • Όταν τερμάτισε το Μ, χάθηκε το τμήμα Ν
  • Όταν τερμάτισε το Β χάθηκε και το Μ
  • Μόνο ο σωρός έχει μείνει και αυτός είναι άδειος ή είχε ότι είχε πριν την εκτέλεση του Β

Τα προγράμματα σβήνουν με την Νέο, οι μεταβλητές σβήνουν από τα τμήματα όπως είδαμε, ενώ όσες μεταβλητές/πίνακες ορίσαμε γενικά στην γραμμή εντολών με Καθαρό σβήνουν. Τέλος η Άδειασε αδειάζει το Σωρό τιμών.

Προσθήκη: Μπορούμε να φτιάξουμε ένα τμήμα με το όνομα εντολής, με την νέο επανέρχεται η εντολή. Οι εντολές με @ καλούνται ανεξάρτητα αν υπάρχουν τμήματα με ίδιο όνομα!
Στην έκδοση 8.4 μπήκε η προσωρινή αλλαγή, η οποία επαναφέρει την εντολή στο πέρας εκτέλεσης του τμήματος που την άλλαξε. Επιπλέον στα τμήματα που καλούμε δεν φαίνεται η αλλαγή.

Τμήμα Τύπωσε {
\\ εδώ δεν είναι γνωστή η νέα Τύπωσε
      Ενώ όχι κενό {
            Τύπωσε Αριθμός+1,
      }
      Τύπωσε   \\ αλλαγή γραμμής
}
\\ εδώ είναι γνωστή η νέα Τύπωσε
Τύπωσε 10,3,4 \\ δίνει 11, 4, 5
\\ Μπορώ να χρησιμοποιήσω την παλιά
@Τύπωσε 10,3,4 \\ δίνει 10, 3, 4



Συνοπτικά με το τμήμα έχουμε έναν μικρο υπολογιστή όπου ο σωρός είναι το κανάλι εισόδου και εξόδου.

1.2.7. Συναρτήσεις
Οι συναρτήσεις έχουν και αυτές σωρό αλλά ξεκινούν με φρέσκο όπου στην κορυφή βρίσκονται τα ορίσματα και τα οποία μπορεί να είναι αποτελέσματα εκφράσεων, ή να είναι ισχνές αναφορές (αλφαριθμητικά), με τα οποία η Διάβασε θα φτιάξει τις μεταβλητές που θέλουμε και θα τις ενώσει με αυτά που δείχνουν οι ισχνές αναφορές.
Σ Α(
(ανοίγει ο διορθωτής, μπορούμε να δώσουμε και το Σ Α() και γράφουμε)
Διάβασε Χ,Υ
=Χ**Υ
(πατάμε Esc)
Από την γραμμή εντολών:
Τύπωσε Α(10,5)
    1000000

Μπορούμε σε ένα τμήμα να έχουμε και συναρτήσεις!
Με την εντολή ΔΙΑΓΡΑΦΗ διαγράφουμε το τελευταίο τμήμα/συνάρτηση.
Αλλά εδώ με Νέο και Σ Β γράφουμε τα παρακάτω:

Τμήμα Μ {
      Συνάρτηση Α {
            Διάβασε Χ,Υ
            =Χ**Υ
      }
      Τύπωσε Α(10,Αριθμός)
}
Μ 5


Δείτε εδώ ότι δεν έχω παρενθέσεις στον ορισμό της συνάρτησης. Καλώ την Μ και δίνω στο σωρό το 5. Το διαβάζω με την Αριθμός. Η Αριθμός διαβάζει και βγάζει από την κορυφή του σωρού τον αριθμό στην κορυφή. Αν δεν είναι αριθμός ή έχω άδειο σωρό τότε θα πάρω λάθος.
(θα δούμε σε άλλο κεφάλαιο πως θα γλιτώσουμε από τέτοιες περιπτώσεις)

Μπορούμε να βάλουμε τη λίστα (Χ,Υ)  δίπλα από το όνομα της συνάρτησης - με διαχωριστικό διάστημα. Αυτή θα γίνει Διάβασε Χ, Υ όταν ο διερμηνευτής θα πάρει το κείμενο στις αγκύλες, και θα βάλει στην πρώτη γραμμή το Διάβασε Χ, Υ και θα μεταγράψει την συνάρτηση σε μια νέα θέση στη λίστα τμημάτων-κατατάσεων.

Τμήμα Μ {
      Συνάρτηση Α (Χ,Υ){
            =Χ**Υ
      }
      Τύπωσε Α(10,Αριθμός)
}
Μ 5

Τέλος να ξεκαθαρίσουμε αυτή την περίπτωση (ας την βάλουμε σε μια φρέσκια Β, Νέο και Σ Β)

Τμήμα Μ {
      Συνάρτηση γενική Α {
            Διάβασε Χ,Υ
            =Χ**Υ
      }
      Τμήμα Ν {
            Τύπωσε Α(10,Αριθμός)
      }
      Ν
}
Μ 5
Στο τμήμα Ν καλώ τη συνάρτηση Α() γιατί είναι γενική (μόνο στο τμήμα Μ και παρακάτω). Αν δεν την είχα γενική η Ν δεν θα μπορούσε να δει Α.
Η Β δεν βλέπει την Α() και το τμήμα Ν γιατί δεν υπάρχουν, θα φτιαχτούν όταν εκτελεστεί η Μ, Μάλιστα αν εκτελούσαμε πέντε φορές διαδοχικά την Μ τότε πέντε φορές θα ορίζαμε τη γενική Α, το τμήμα Ν και θα καλούσαμε το Ν και επίσης πέντε φορές θα διαγράφαμε τις Α() και το τμήμα Ν.

Για να έχω σε ίδιο επίπεδο τμήματα/συναρτήσεις να βλέπουν το ένα το άλλο, ή θα είναι γενικά, ή θα είναι στη λίστα τμημάτων που μας δίνει η Τμήματα, ή θα είναι μέλη ομάδας!

Προσθήκη: Οι συναρτήσεις λάμδα έχουν ότι και μια συνάρτηση. Το επιπλέον είναι ότι έχουν χώρο για να συλλάβουν μεταβλητές, πίνακες, αντικείμενα, και ότι αυτός ο χώρος, είναι ένα αντικείμενο Λάμδα που αποτελεί μια μεταβλητή.

Συνάρτηση Μια {
      Διάβασε Χ
      =Χ*2
}
Α=Λάμδα ->{
      Διάβασε Χ
      =Χ*2
}


Τύπωσε Μια(10), Α(10) \\ 20, 20
\\ μπορούμε να αλλάξουμε ορισμό
Συνάρτηση Μια {
      Διάβασε Χ
      =Χ^2 \\ Χ**2 είναι το ίδιο, ύψωση στην δύναμη
}
Α=Λάμδα ->{
      Διάβασε Χ
      =Χ^2
}
Τύπωσε Μια(10), Α(10) \\ 100, 100
\\ Το επιπλέον στην Λάμδα είναι ότι μπορεί να δώσει μια νέα Λάμδα
Β=Α
Τύπωσε Β(10) \\ 100
Α=-Λάμδα Β -> Β(30)
\\ Αλλά επίσης μπορεί να συλλάβει άλλη μεταβλητή, ακόμα και λάμδα
Τύπωσε Α() \\ 900
Β=100 \\ μπορούμε την Β να την κάνουμε απλή μεταβλητή
Τύπωσε Β, Α() \\ 100, 900  στην Α() παραμένει το αντίγραφο τη Β


1.2.8 Διαφορά συναρτήσεων - τμημάτων
Όπως έχει γίνει φανερό μέχρι τώρα οι συναρτήσεις καλούνται μέσα από εκφράσεις ή όπως λέμε παραστάσεις, αριθμητικές ή αλφαριθμητικές ανάλογα δηλαδή το αποτέλεσμα που περιμένουμε. Το Α+Β είναι αριθμητική έκφραση ενώ το Α$+Β$ είναι αλφαριθμητική και σημαίνει ότι θα επιστρέψει ένα αλφαριθμητικό που θα έχει στην αρχή ό,τι έχει το Α$ και αμέσως μετά ό,τι έχει το Β$ ως αντίγραφο αυτών (οι τιμές των Α$ και Β$ θα παραμένουν σε άλλο χώρο, απείραχτες). Σε αντίθεση τα τμήματα καλούνται ως επόμενη εντολή! Δηλαδή αν έχω το τμήμα Α και το τμήμα Β και στο τμήμα που θέλω να τα καλέσω υπάρχουν σαν ονόματα (είναι ή τοπικά ή γενικά) τότε το Α : Β σημαίνει εκτέλεσε το Α και μετά εκτέλεσε το Β. Περιφραστικά το "Α : Β" σημαίνει "Εκτέλεσε το τμήμα Α, επόμενη εντολή, Εκτέλεσε το τμήμα Β". Τώρα όπου ":" μπορεί να είναι αλλαγή γραμμής. Άρα το παρακάτω:

Α
Β

Σημαίνει περιφραστικά το ίδιο με πριν, Εκτέλεσε το τμήμα Α, επόμενη εντολή, Εκτέλεσε το τμήμα Β".
Στις συναρτήσεις αν μια Α(Χ) δίνει το Χ**2 (Χ στο τετράγωνο ή Χ*Χ, μπορούμε να χρησιμοποιήσουμε και το χαρακτήρα ^ για ύψωση σε δύναμη)  τότε μπορούμε να έχουμε το εξής:

Τύπωσε Α(Α(2))

Δηλαδή περιφραστικά λέμε: "Τύπωσε  (χμ..βλέπω αριθμητική παράσταση)..αποτίμηση της παράστασης: Βρήκα το "Α(" είναι συνάρτηση, (χμ..βλέπω αριθμητική παράσταση) Βρήκα το "Α(" είναι συνάρτηση, (χμ..βλέπω αριθμητική παράσταση), Βρήκα το 2 επιστρέφω το 2, Βρήκα το ") άρα εκτελώ την "Α(", επιστρέφω το 4, Βρήκα το ")" άρα εκτελώ την "Α(", επιστρέφω το 16, άρα η Τύπωσε τυπώνει το 16

Εντελώς διαφορετική η σειρά που εκτελούνται φωλιασμένες συναρτήσεις από αυτή των τμημάτων σε σειρά! Θα μπορούσαμε να είχαμε μια παράσταση Α(2)+Α(4) οπότε θα εκτελούνταν το Α(2) μετά το "+" το οποίο θα περίμενε παράσταση, μετά το Α(4) και τέλος το νούμερα θα αθροίζονταν και θα επιστρέφονταν!

Κατά μια έννοια και τα τμήματα που καλούν άλλα τμήματα έχουν την κλήση σε βάθος όπως λέμε, όπου πάντα εκτελείται αυτό που είναι στο βάθος και επιστρέφουμε για τη συνέχεια μέχρι τελικά ένα πρόγραμμα να γυρίσει στο αρχικό σημείο, στην γραμμή εντολών, αν από εκεί ξεκίνησε.



(Στο επόμενο τεύχος τα περί ομάδων).


Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου