Παρασκευή 12 Φεβρουαρίου 2016

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

Τι γλώσσα είναι η Μ2000

Η Μ2000 είναι προστακτική γλώσσα, το ζητούμενο αποτέλεσμα περιγράφεται με εντολές. 

Η γλώσσα ανήκει σε δυο κατηγορίες, στις διαδικαστικές γλώσσες και στις αντικειμενοστραφείς.

Προγραμματιστικά Παραδείγματα
Η γλώσσα Μ2000, τρέχει σε δικό της περιβάλλον (μια εικονική μηχανή) και μπορεί να χρησιμοποιηθεί για Τμηματικό Προγραμματισμό,  Διαδικαστικό ή Δομημένο Προγραμματισμό, Συναρτησιακό Προγραμματισμό, Αντικειμενοστραφή Προγραμματισμό, Καθοδηγούμενος από Γεγονότα Προγραμματισμό, Πολυδιεργασία με Νήματα. Επίσης μπορεί να δημιουργεί χώρο μνήμης (διάρθρωση λέγεται στην γλώσσα ή Buffer στα αγγλικά), για δυο λόγους, ένα για να γράφει δεδομένα, και να παίρνει αποτελέσματα, που χρησιμοποιούνται σε κλήσεις εξωτερικών συναρτήσεων τύπου C ή Standard (dll), καθώς επίσης και για εκτελέσιμο κώδικα απευθείας σε γλώσσα μηχανής, Προς το παρόν δεν υπάρχει ενσωματωμένος Assembler, αλλά σε επόμενη έκδοση θα έχει για x86).

Μπορεί κανείς για αρχή να παραβλέψει τα αντικείμενα αλλά έχουν ενδιαφέρον. Υπάρχουν δυο διαφορετικές οικογένειες αντικειμένων στη Μ2000. Στην πρώτη οικογένεια ανήκουν:
  • το Έγγραφο (Αλφαριθμητικό σε παραγράφους), 
  • το Γεγονός (λίστα συναρτήσεων που καλούνται ομαδικά),
  • Ο Πίνακας ως αντικείμενο (δουλεύει με δείκτη σε πίνακα, υπάρχει και σε μορφή με παρενθέσεις),
  • η Λάμδα συνάρτηση,
  • η Κατάσταση (λίστα με κλειδί με χρήση εσωτερικά συνάρτησης κατακερματισμού),
  • η Διάρθρωση (χώρος στη μνήμη με δομές για απευθείας εγγραφή και ανάγνωση αριθμών και αλφαριθμητικών),
  • ο Σωρός (λίστα με προσθήκη στο τέλος ή και στην αρχή και αφαίρεση από την αρχή, χρήση FIFO ή LIFO) 
  • η Ομάδα (συλλογές μεταβλητών/πινάκων και τμημάτων/συναρτήσεων καθώς και άλλων ομάδων, με επιλογή για ιδιωτική/δημόσια χρήση, για τελική μορφή μεταβλητών/συναρτήσεων/τμημάτων, μπορεί να έχει ιδιότητες, τελεστές και τιμή, σαν ιδιότητα). Η ομάδα είναι τύπου τιμής, δηλαδή αντιγράφεται σε νέα και συγχωνεύεται σε υπάρχουσα.
  • Η Υπερκλάση, μια ομάδα κοινή σε ομάδες, με μοναδικές ιδιότητες, μεταβλητές τις οποίες χρησιμοποιούν οι ομάδες 

Στη δεύτερη  οικογένεια ανήκουν:
  • Το εξωτερικό αντικείμενο, όπως το αντικείμενο Word, Excel (Τύπου COM) στο οποίο μπορεί να δίνει και να παίρνει στοιχεία μέσω της Dispatch διεπαφής (interface) η οποία υποστηρίζει την δυναμική σύνδεση,  (late binding for OLE Automation), υποστηρίζονται και γεγονότα από τα εξωτερικά αντικείμενα.
  • Τα στοιχεία του ενσωματωμένου γραφικού περιβάλλοντος του χρήστη (GUI)
  • Οι Καταστάσεις, Σωροί, Διαρθρώσεις, και πίνακες ως αντικείμενα είναι επίσης τύπου COM εσωτερικά και μπορούν να δοθούν σε script γλώσσες όπως η javascript  και η vbscript (οι γλώσσες αυτές συνδέονται ως εξωτερικά αντικείμενα), για ανταλλαγή στοιχείων. 
  • Έχουν προστεθεί δυο εσωτερικά COM αντικείμενα, το Πληροφορίες και το Μαθηματικά. Το πρώτο δίνει εκτεταμένες πληροφορίες για το σύστημα, και το δεύτερο εκτελεί πράξεις με διανύσματα (και πίνακες διανυσμάτων που ορίζουμε σε διαρθρώσεις μνήμης).
Περιβάλλον Μ2000 (ή εικονική μηχανή Μ2000)
Το περιβάλλον της γλώσσας περιέχει εκτός από τον διερμηνευτή και όλα τα απαραίτητα, όπως τον διορθωτή που χρωματίζει τις εντολές καθώς και την ενσωματωμένη βοήθεια. Το περιβάλλον υποστηρίζει εικόνες, ήχους, μουσική (με χρήση ενσωματωμένου συστήματος για εκτέλεση κομματιών (νότες) που δίνουμε ανά φωνή και ορίζοντας όργανο ανά φωνή), καθώς και μουσική απευθείας από αρχείο, όπως και βίντεο με δυνατότητα να σταματάμε σε καρέ με εντολές, Επίσης έχει ενσωματωμένο αναλόγιο (browser) για εμφάνιση και συλλογή στοιχείων από σελίδες Html (δεν δουλεύει σωστά σε Wine σε Linux, λόγω προβλημάτων του Wine). Χειρίζεται δε παράθυρα με απλές εντολές, τα οποία εμφανίζονται ίδια σε κάθε λειτουργικό (Windows και Linux). Τέλος μπορούμε να αλλάζουμε το Τοπικό (Locale) σε αυτό που θέλουμε ώστε πχ οι αριθμοί να εμφανίζονται με κόμμα ή τελεία, αλλά όλο το περιβάλλον δουλεύει σε Unicode, και οι φόρμες. Για το κώδικα οι αριθμοί με δεκαδικά δίνονται πάντα με τελεία.

Λεξιλόγια
Η γλώσσα έχει διπλό λεξικό, αγγλικά και ελληνικά. Δεν υπάρχει διαχωρισμός πεζών και κεφαλαίων, και για τα ελληνικά οι τόνοι δεν παίζουν ρόλο (οι λέξεις εσωτερικά χρησιμοποιούνται χωρίς τόνους), εκτός από τα ονόματα ετικετών (labels), όπου οι τόνοι παίζουν ρόλο. 

Ένα αναγνωριστικό χρήστη έχει προτεραιότητα σε σχέση με το αντίστοιχο ίδιο του λεξιλογίου. Τα ονόματα εντολών μπορούν να δοθούν με το σύμβολο @ στην αρχή και αυτό σημαίνει ότι θα επιλεχθεί εντολή γλώσσας. Με αυτόν τον τρόπο παλιότερα προγράμματα με μεταβλητές με ίδια με ονόματα εντολών που προστέθηκαν σε νεότερες εκδόσεις εξακολουθούν να τρέχουν.

Μαθηματικές Εκφράσεις
Κάθε πράξη έχει προβλέψιμο αποτέλεσμα, επειδή δεν αλλάζει εσωτερικά η σειρά εκτέλεσης. Ως προς τον τύπο αριθμού, η πιο πρόσφατη έκδοση χρησιμοποιεί σύστημα που προάγει τον αριθμό με προβλεπόμενο τρόπο. Οι μεταβλητές όταν ορίζονται με έναν τύπο διατηρούν τον τύπο τους με άμεση μετατροπή κατά την εκχώρηση (μπορεί να βγει λάθος αν δεν είναι δυνατή η μετατροπή λόγω υπερχείλισης). Εσωτερικά το σύστημα δουλεύει με Variant, δηλαδή με τύπο που δέχεται όλους τους τύπους και κάνει πράξεις ανάλογα με το τι δίνουμε, δηλαδή αν προσθέσουμε δυο Currency θα γίνει πρόσθεση που θα δώσει Currency χωρίς εσωτερική μετατροπή. Μπορούμε να ορίσουμε άμεσα αριθμητικές σταθερές με τύπο, πχ το 1.23123@ είναι Decimal ή Αριθμός, το 1.232~ είναι Single ή Απλός, το 1.1221#  είναι Currency ή Λογιστικό, το 1212& είναι Long ή Μακρύς.
Οι συγκρίσεις δίνουν  Boolean ή Λογικό, ενώ τα Αληθές (True) και Ψευδές (False) για λόγους συμβατότητας είναι -1 και 0 Διπλος ή Double. Αριθμός χωρίς να σύμβολο στο τέλος του είναι Διπλός ή Double. Οι συκρίσεις γυρνούν πάντα boolean ή Λογικό, εκτός από τον τελεστή <=> που γυρίζει Integer (16bit).Μπορούμε να δημιουργούμε απευθείας λογικό:

Κάνε λογικό α=Αληθές
Τύπωσε α
α~    ' αναστροφή
Τύπωσε α


Η εντολή Κάνε (Def) ορίζει τοπικές μεταβλητές με τύπο και επιπλέον γυρίζει λάθος αν υπάρχει ήδη τοπική με ίδιο όνομα, ακόμα και αν έχει τον ίδιο τύπο. Υπάρχουν και άλλοι τρόποι να ορίσουμε μεταβλητές: α) με απευθείας εκχώρηση τιμής, β) με την Τοπική η οποία σκιάζει υπάρχουσα μεταβλητή με ίδιο όνομα και θέαση στο τρέχον σημείο, γ) Γενική η οποία σκιάζει τυχόν γενική με ίδιο όνομα. Ειδικά οι δυο τελευταίες ορίζουν και πίνακες με την ίδια δυνατότητα σκίασης. Για τους πίνακες υπάρχει η Πίνακας ή Dim, αλλά όπως θα δούμε υπάρχει τρόπος να δημιουργήσουμε αυτόματο πίνακα, ο οποίος γυρίζει δείκτη σε πίνακα, πχ το Α=((1,2),(3,4)) φτιάχνει έναν πίνακα με στοιχεία δυο άλλους πίνακες.

Από την 9.3 έκδοση και οι Integer 16bit, υποστηρίζονται ως επιλογή, με το % στο τέλος του  αριθμού, ο 100% είναι ακέραιος 16bit. Οι σταθερές δεκαεξαδικών αριθμών γράφονται με 0χ ή 0x στην αρχή, και αν ακολουθεί μετά το & ή το % δίνει Long ή Integer. Η διαφορά είναι ότι χωρίς το σύμβολο μετά τον αριθμό επιστρέφεται θετική τιμή ή μηδέν, με τύπο διπλό, ως προσομοίωση ακεραίου χωρίς πρόσημο. Έτσι το 0xFFFF% είναι το -1 με τύπο ακέραιο (integer) ενώ το 0xFFFF είναι το 65535 με τύπο διπλό (double) και το 0xFFFF& είναι το 65535 σε τύπο μακρύ (Long).
Για τον έλεγχο τύπου μεταβλητής χρησιμοποιούμε την Τύπος$(). Για έκφραση φτιάχνουμε μια συνάρτηση πχ Συνάρτηση ΔείξεΤύπο$(χ) {=Τύπος$()} η οποία παίρνει στην χ ότι τύπο δώσουμε και μας επιστρέφει τον τύπο του!

Αλφαριθμητικά
Η γλώσσα απαιτεί οι μεταβλητές και οι συναρτήσεις που επιστρέφουν αλφαριθμητικό να το δηλώνουν στο όνομά τους, με το σύμβολο $. Για σταθερές χρησιμοποιούνται τα διπλά εισαγωγικά και οι αγκύλες {}. Με τις αγκύλες δίνουμε και αλλαγές γραμμών εσωτερικά.
 (Οι αγκύλες χρησιμοποιούνται και στα μπλοκ εντολών. Ο χρωματιστής στον ενσωματωμένο διορθωτή βρίσκει πότε ένα μπλοκ είναι μπλοκ εντολών και χρωματίζει το εσωτερικό του, και αυτό το κάνει καθώς γράφουμε - ο χρωματισμός δεν περιέχεται στο κώδικα, βγαίνει αυτόματα στον διορθωτή)

Πεδίο Εφαρμογής

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

  • Στα γραφικά περιέχονται και οι διαφάνειες (sprites), εικόνες, wmf/emf αρχεία, και εντολές για περιστροφή και μεγέθυνση. 
  • Στις βάσεις δεδομένων έχουμε ερωτήματα SQL (ο χειρσμός γίνεται ή με απλό τρόπο - με περιορισμούς- ή με προχωρημένο με χρήση του ADO αντικειμένου).
  • Στα πολυμέσα έχουμε εντολές που παίζουν μουσική με φωνές/όργανα, και σύνθεση φωνής. 
Οι εντολές για όλα αυτά υπάρχουν στο βασικό λεξιλόγιο της Μ2000.

Δυναμικός Τύπος Γλώσσας

Η Μ2000 είναι δυναμικού τύπου γλώσσα. Ένα 129+"αβγ" είναι λάθος, γιατί έχουμε αριθμό και γράμματα στη παράσταση, και αυτά δεν μπορούμε να τα προσθέσουμε, και θα βγει λάθος κατά την εκτέλεση. Αυτό συμβαίνει γιατί η Μ2000 εκτελεί καθώς μεταφράζει και όχι σε δυο στάδια, π.χ. πρώτα μετάφραση-μετά εκτέλεση.

Αυτό που "εκτελεί" προγράμματα στην Μ2000 είναι ο διερμηνευτής, ένα επίσης πρόγραμμα γραμμένο σε Visual Basic 6 (αν και παλιά 32 bit  γλώσσα,  συνθέτει τελικό πρόγραμμα ως γλώσσα μηχανής εφάμιλη με τη C, και είναι πολύ γρήγορη και επιπλέον τρέχει σε Windows 10, με την χρήση μιας βιβλιοθήκης -dll- που έχουν τα Windows ήδη εγκατεστημένο). Για το λόγο αυτό επιμέρους εντολές όπως η ταξινόμηση παραγράφων σε έγγραφο, ή η περιστροφή εικόνας, γίνεται γρήγορα με κώδικα που έχει μεταφραστεί σε γλώσσα μηχανής (και περιέχεται στο κώδικα του διερμηνευτή που επίσης είναι σε γλώσσα μηχανής, όπως έγινε από τον μεταφραστή της VB6).

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

Ισχυρός Τύπος & Ασθενής Τύπος Περάσματος
Υπάρχει η δυνατότητα ελέγχου τύπου (Ισχυρός Τύπος) κατά το πέρασμα μεταβλητής με αναφορά. Ο έλεγχος γίνεται για τους απλού τύπους, καθώς και για τους ειδικούς όπως Ομάδα, Πίνακας, Κατάσταση, Σωρός, Διάρθρωση, με ελληνικά και τα αντίστοιχα αγγλικά και για οποιοδήποτε άλλο αντικείμενο με το όνομα του αντικειμένου όπως επιστρέφει από την Τύπος$().
Από τις πρώτες εκδόσεις της γλώσσας ο τύπος ήταν και παραμένει αν θέλουμε Ασθενής, δηλαδή να περάσουμε οτιδήποτε με αναφορά και να δούμε στο κώδικα του καλούμενου τι έχουμε πάρει και να το χειριστούμε ανάλογα.

Στο πέρασμα με τιμή, υπάρχει διαχωρισμός μόνο ως προς το αν είναι αριθμός ή αλφαριθμητικό, οπότε για αυτά ισχύει ο Ισχυρός Τύπος, ενώ ο τελικός τύπος εξαρτιέται από το αν έχουμε δηλώσει τύπο ή όχι, και αν όχι θα πάρουμε τον τύπο της έκφρασης που περάσαμε. Αν έχουμε αντικείμενο στη θέση αριθμητικής μεταβλητής, τότε θεωρείται Αριθμός εκτός από αυτά τα αντικείμενα που δηλώθηκαν με ονόματα αλφαριθμητικού (επειδη σε αυτά γίνεται κάτι τέτοιο). Οι δείκτες αντικειμένων πάντα προηγούνται ως τύποι, και εμφανίζουν το όνομα του αντικειμένου ως τύπο. Τα αντικείμενα τύπου COM γυρνούν αριθμό 0 ως Double όταν έχουν όνομα και ένα δείκτη αντικειμένου, το οποίο όμως το χειρίζεται η γλώσσα. Έτσι αν προσθέσουμε πχ δυο δείκτες σε πίνακες θα πάρουμε το 0 και το δείκτη του τελευταίου πίνακα και αν το αποτέλεσμα πάει σε μεταβλητή τότε θα έχει το αντικείμενο! Από την στιγμή που η μεταβλητή έχει αντικείμενο δεν μπορούμε να δώσουμε αριθμό. Ανάλογα το αντικείμενο η εκχώρηση σε νέα μεταβλητή ή σε ίδιου τύπου δημιουργεί αντίγραφο ή δείκτη στο αντικείμενο.

Πίνακες με Διάφορα είδη στοιχείων
Αν και οι πίνακες μπορούν να έχουν στο όνομα τα % και $ που δηλώνουν, το μεν πρώτο ότι στρογγυλοποιούν τις εκχωρήσεις αριθμητικών τιμών, και το δεύτερο ότι λαμβάνουν και δίνουν αλφαριθμητικά, στην ουσία έχουν στοιχεία εσωτερικά τύπου Variant, και μπορούν να έχουν οτιδήποτε. Το όνομα του πίνακα απλά είναι η διεπαφή (interface). Μπορούμε να συνδέσουμε στον ίδιο πίνακα άλλο όνομα, έτσι με ένα όνομα γράφουμε αριθμούς ενώ με άλλο αλφαριθμητικά, στον ίδιο πίνακα. Μπορούμε να έχουμε οποιοδήποτε αντικείμενο. Τα αντικείμενα που ορίζουμε με την Όρισε (εξωτερικά ή ειδικά τύπου Com), γράφονται με έμμεσο δείκτη που σημαίνει ότι αν το τμήμα που τα όρισε τερματίσει τότε οι έμμεσοι δείκτες γίνονται άμεσα μη έγκυροι.

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

Οι ομάδες μπορούν να αυξήσουν τα μέλη τους, ή να πάρουν πρόσκαιρα κάποια μέλη αλλά δεν μπορούν να διαγράψουν μέλη. Οι συναρτήσεις, τα τμήματα, οι τελεστές μπορούν να οριστούν τελικά ώστε να μην αλλάζουν. Μπορούμε να έχουμε ιδιωτικά μέλη που δεν είναι προσπελάσιμα έξω από την ομάδα. 

Οι ομάδες θεωρούνται "τιμές", αλλά μπορούμε να φτιάχνουμε δείκτες σε ομάδες (από την έκδοση 9.3), οι οποίες αντί για τη τελεία μεταξύ ομάδας και μέλους, υπάρχει αυτό: =>

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

Προγραμματισμός με Γεγονότα


Στη Μ2000 δημιουργούμε παράθυρα και βάζουμε στοιχεία που καλούν συναρτήσεις εξυπηρέτησης γεγονότων. Τα παράθυρα μπορούν να οριστούν ως πίνακας παραθύρων και τα στοιχεία τους ως πίνακας στοιχείων.

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

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


Χρήση Κονσόλας/Επιπέδων εμφάνισης

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

Πρόγραμμα σε Μ2000

Ένα πρόγραμμα γραμμένο στη γλώσσα Μ2000 είναι μια περιγραφή του τι θα κάνει ο διερμηνευτής! Μπορούμε να καλούμε ένα αρχείο gsb και να περιέχει εντολές εκτέλεσης (που καλούν κάποιο τμήμα ή μια σειρά τμημάτων), και να ξεκινήσουν με διπλό κλικ. Δεν υπάρχει περιορισμός για το πόσα τέτοια αρχεία μπορούμε να εκτελέσουμε ταυτόχρονα. Δηλαδή μπορούμε ταυτόχρονα να τρέχουμε πολλά προγράμματα - ανεξάρτητα το ένα από το άλλο, σε δικό τους διερμηνευτή.

Τρόπος ανάπτυξης προγράμματος


Κατά το σχεδιασμό της γλώσσας, το βασικό στοιχείο επιλέχθηκε να λέγεται Τμήμα. Κάθε τμήμα μπορεί να είναι ένα πρόγραμμα. Υπάρχει απομόνωση μεταξύ των τμημάτων, έτσι ώστε η εμβέλεια των αναγνωριστικών να περιορίζεται σε αυτό (lexical scope), τόσο προς τα πάνω (σε αυτό που περιέχεται ένα τμήμα) όσο και στα κάτω (σε αυτά που περιέχει ένα τμήμα και περιέχουν δικά τους αναγνωριστικά). Τα τμήματα μπορούμε να τα λογαριάζουμε για Διαδικασίες, αν και στην Μ2000 μπορούν να επιστρέψουν τιμές, σε ένα κοινό χώρο, μια στοίβα που εδώ λέγεται Σωρός Τιμών.

Τα τμήματα μπορούμε να τα δούμε ως μια έκταση κειμένου σε τρία μέρη:
  • Οι ορισμοί τμημάτων/συναρτήσεων (μπορούν να φορτώνονται), 
  • Το κυρίως πρόγραμμα με εντολές και δομές ροής
  • Οι ρουτίνες, κώδικας που καλεί το τμήμα και σε αυτές υπάρχει κοινή θέαση των περιεχομένων του τμήματος.
Ορισμούς μπορούμε να δίνουμε και σε οποιοδήποτε μέρος, και με νέο ορισμό να αλλάζουμε του παλιούς! Ομοίως μπορούμε να σκιάζουμε μεταβλητές, και αυτό αποτελεί έναν τρόπο δυναμικής εμβέλειας (Dynamic Scope).
Επιπλέον τμήματα και συναρτήσεις μπορούν να διαθέτουν οι ομάδες. Εκεί υπάρχει επιπλέον η εμβέλεια των μελών της ομάδας. Έτσι σε ένα τμήμα σε μια ομάδα μπορούμε να βλέπουμε τα ιδιωτικά μέλη της ομάδας, ότι υπάρχει ορισμένο τοπικά, μπορούμε να βλέπουμε τα μέλη της υπερκλάσης όπου ανήκει η ομάδα, καθώς και δημόσια μέλη που έχουν ομάδες που ανήκουν στην ομάδα. Οι ομάδες μπορούν να έχουν περιεχόμενες ομάδες αλλά τα τμήματα/συναρτήσεις στις περιεχόμενες ομάδες δεν έχουν θέαση στις ιεραρχικά πάνω από αυτές, με την εξαίρεση μιας λειτουργίας ένωσης σε τοπικό αναγνωριστικό για μεταβλητές/πίνακες του αμέσως προηγούμενου, που πρέπει να δοθεί με εντολή.

Περί Ομάδων και η θέση τους στο κώδικα.

Το ενδιαφέρον με τις ομάδες είναι ότι λειτουργούν σαν μεταβλητές. Δηλαδή αντιγράφονται. Οι ομάδες από την 9.3 δίνουν δείκτες σε αυτές. Όλα τα αντικείμενα καταχώρησης πολλών στοιχείων, όπως ο πίνακας, η κατάσταση, ο σωρός μπορούν να δέχονται ομάδες. Έτσι έχουμε την έννοια της ανώνυμης ομάδας, που έχει θέση σε κάποιο αντικείμενο καταχώρησης και όχι όνομα. Οι ομάδες μπορούν να έχουν και αυτές δικά τους αντικείμενα καταχώρηση, άρα πρακτικά μια ομάδα μπορεί να περιέχει μεγάλο αριθμό ομάδων σε κάποιο μέλος της! Αντί να χρησιμοποιούμε δείκτη, ως διεύθυνση στη μνήμη για ομάδα, χρησιμοποιούμε το δείκτη/κλειδί του αντικειμένου καταχώρησης. Παλαιότερα ίσχυε αυτό "Ποτέ λοιπόν μια ομάδα δεν μπορεί να υπάρχει σε δυο θέσεις". Από την έκδοση 9.3 μπορούμε να έχουμε δείκτες σε ομάδες άρα πρακτικά μπορεί μια ομάδα να βρίσκεται σε δυο ή περισσότερους δείκτες. Οι δείκτες σε ομάδες μπορούν να βρίσκονται οπουδήποτε, σε πίνακες, καταστάσεις και σωρούς.

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

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

Συναρτήσεις Εξωτερικών Βιβλιοθηκών (System call dll, C call dll)

Μπορούμε να συνδέσουμε εξωτερικές βιβλιοθήκες σε C και να δώσουμε δεδομένα και να πάρουμε αποτελέσματα, πολύ γρήγορα. Μάλιστα υπάρχει παράδειγμα όπου μέσα από ένα πρόγραμμα της Μ2000 φτιάχνουμε με χρήση του gcc compiler άμεσα τη βιβλιοθήκη ρουτινών (dll) και τη χρησιμοποιούμε (σε ένα τρέξιμο του κώδικα, κάνουμε το compiling και το linking σε dll, του c πηγαίου προγράμματος, και φορτώνουμε το dll, αποδίδοντας σε συναρτήσεις χρήστη τις συναρτήσεις του dll).

H M2000 είναι Com Αντικείμενο


Και η Μ2000 είναι ένα  dll (dynamic-link library), τύπου COM,  που καλείται από ένα μικρό πρόγραμμα m2000.exe (όλα τα προγράμματα είναι ανοικτά για να μπορεί κανείς να διαβάσει τι ακριβώς κάνουν. H M2000 δηλαδή είναι ένα αντικείμενο που μπορεί να κληθεί από άλλα προγράμματα που υποστηρίζουν COM. Mπορούμε να καλέσουμε άλλες script γλώσσες όπως javascript και vbscript, και να παραχωρήσουμε αντικείμενα στη javascript και πίνακες στην vbscript για να μας γυρίσουν αποτελέσματα.


Βασικοί τύποι μεταβλητών

Οι βασικοί τύποι είναι ο αριθμός, ο ακέραιος και τα γράμματα (αλφαριθμητικά).
  • Οι αριθμοί μπορεί να είναι  Double, Single, Decimal, Currency, Long, Boolean, Integer
  • Οι ακέραιοι (με % στο τέλος του ονόματος μεταβλητής) μπορεί να είναι Double, Single, Decimal, Currency, Integer και Long.
  • Τα γράμματα (αλφαριθμητικά με το $ στο τέλος του ονόματος)
Τα σύμβολα $ και % χρειάζονται οι συναρτήσεις που φτιάχνουμε αν θέλουμε η επιστροφή να είναι του ανάλογου τύπου. 
Μια συνάρτηση Α$() ξέρουμε ότι θα δώσει αλφαριθμητικό, ενώ μια συνάρτηση Α%() ξέρουμε ότι θα δώσει ακέραιο. Αν βάλουμε αριθμό σε ακέραιο θα γίνει μετατροπή σε ακέραιο, βάσει της μισής μονάδας, ανεξάρτητα με τον τύπο εσωτερικά.
Επειδή η Μ2000 χειρίζεται αντικείμενα συμβαίνει σε παραστάσεις (εκφράσεις με πράξεις) να γυρνούν η αριθμό ή αλφαριθμητικό, ή αντικείμενο. Το τελευταίο έρχεται μαζί με αριθμό/αλφαριθμητικό και ο διερμηνευτής το αναγνωρίζει ή το περιμένει ανάλογα σε κάποιες περιπτώσεις εκχώρησης, και σε αυτές δίνει λάθος αν το αντικείμενο δεν είναι συμβατό με τον τύπο που έχει ήδη μια μεταβλητή. Πχ μια Α=(1,2,3) θα φτιάξει τον δείκτη σε πίνακα, οπότε το Α=200 δεν μπορεί να δοθεί, θα βγει μήνυμα λάθους. Υπάρχει η συνάρτηση Τύπος$() που δίνει το όνομα τύπου σε μια μεταβλητή αν ξέρουμε ότι υπάρχει περίπτωση να περαστεί άλλος τύπος, και κάτι θέλουμε να κάνουμε τότε!
Στατικές Μεταβλητές
Οι βασικοί τύποι γίνονται και στατικές μεταβλητές σε τμήματα και συναρτήσεις. Στατική σημαίνει ότι θα υπάρχει και στην επόμενη κλήση. Οι στατικές γράφονται χωριστά και δεν μπορούν να δοθούν με αναφορά. Δεν μπορούμε να έχουμε τοπική και στατική με το ίδιο όνομα. Σε μέλη ομάδων αντί στατικών πιο σωστό είναι να χρησιμοποιούμε μεταβλητές των ομάδων, ομοίως σε συναρτήσεις λάμδα μπορούμε να ορίσουμε κλεισίματα, δηλαδή μεταβλητές που θα πηγαίνουν μαζί με την λάμδα, και στην εκτέλεση της συνάρτησης, και στην αντιγραφή (με αντιγραφή τιμών, ή δεικτών αν έχουμε αντικείμενο καταχώρησης, πχ πίνακα).
Στη νεότερη έκδοση οι αριθμητικές στατικές μπορούν να έχουν τύπο αριθμού και παίρνουν και δείκτη σε καταχωρητές, όπως πίνακες, καταστάσεις, σωρούς, αλλά όχι δείκτες σε ομάδες, πρέπει να πάρουν έμμεσα με δείκτη σε καταχωρητή που περιέχει δείκτη σε ομάδα.

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


Σταθερή α ως λογικός=Αληθές
Τύπωσε α

Έλεγχος Παράστασης

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

Κατάσταση Α=1,2,3,4,5
Τύπωσε Α ' τυπώνει  τα κλειδιά, γιατί δεν έχουν τιμές και τα θεωρεί τιμές

Τοπικές-Γενικές

Ορίζουμε τρεις μεταβλητές (στα τμήματα είναι τοπικές)
α=10 : β%=30 : γ$="γράμματα και άλλα σύμβολα 1@#$%"

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

Τοπικές α1, β1%, γ1$  

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

Γενικές α1, β1%, γ1$

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

Από την κοσνόλα (γραμμή εντολών του περιβάλλοντος) εκτελείται ο ειδικός διερμηνευτής και αυτός δημιουργεί πάντα γενικές μεταβλητές και στις αριθμητικές μπορεί να αλλάζει τύπους (εκτός αν είναι Μακρύς ή Long, ο οποίος δεν αλλάζει, εσκεμμένα).

Έχει αποφευχθεί το παλαιό πρόβλημα με τις γενικές:

Γενική α=10
Τμήμα Αλφα(α) {
      α+=10
      Τύπωσε α
}
Αλφα 500
Τύπωσε α

Παλαιότερα η a που διάβαζε στο τμήμα η εντολή Διάβασε (ο διερμηνευτής αλλάζει την (α) σε Διάβασε α και την βάζει ως πρώτη εντολή στο σώμα του τμήματος) ήταν η γενική α, επειδη το Διάβασε έβρισκε την α και την χρησιμοποιούσε, χωρίς να φτιάξει νέα, και έτσι άλλαζε την γενική σε 510, ενώ τώρα παραμένει 10.
Σε ένα τμήμα ομάδας το (.χ) σημαίνει το Αυτό.Χ της ομάδας, άρα εκεί θέλουμε να μην φτιάχνει νέα χ. Πώς λοιπόν ξεχωρίζει ο διερμηνευτής ότι αυτό το .Χ δεν θα αλλάξει ενώ το α στο παράδειγμα θα αλλάξει;  Η λύση δόθηκε με τη προσθήκη στο σύστημα εύρεσης ονόματος ενός πεδίου που δηλώνει αν το όνομα είναι γενικό, και στην δήλωση Γενικό που ενημερώνει το σύστημα εύρεσης, στη καταχώρηση νέου ονόματος ότι είναι γενικό.
Στις παλαιότερες εκδόσεις θα έπρεπε να οριστεί η τοπική α πριν την Διάβασε ή να χρησιμοποιηθεί η Διάβασε Τοπικά που όπως και να είχε αναζητούμε μόνο τοπικές (του τμήματος), αλλά αυτό δεν θα έδινε τις μεταβλητές μιας ομάδας, που όντως είναι θεατές από το τμήμα (που είναι μέλος της ομάδας) αλλά δεν είναι τοπικές στην ομάδα!



Ειδικοί τύποι μεταβλητών

Υπάρχουν τύποι μεταβλητών που αναβαθμίζονται, ή μεταλλάσσονται. Ένας από αυτούς είναι το Έγγραφο. Είναι ένα ειδικό αλφαριθμητικό κομμένο σε παραγράφους. Μπορούμε να το δούμε και ως κανονικό. Η διαφορά είναι ότι το Α$="αλφα" θα κάνει προσθήκη στο τέλος. Υπάρχουν εντολές που διαγράφουν παραγράφους, που παρεμβάλουν, που ταξινομούν, κ.α. Ένα αλφαριθμητικό μπορεί να αναβαθμιστεί σε έγγραφο, όπως και ένα στοιχείο πίνακα αλφαριθμητικών, αλλά όχι ένας πίνακας αλφαριθμητικών. Ομοίως ένα αριθμός μπορεί να μεταλλαχθεί σε Μακρύς (Long) δηλαδή αριθμός των 32bit. Η δομή επανάληψης Για υποστηρίζει αριθμό, ακέραιο και μακρύ, και από την 9.2 υποστηρίζει και σε κάθε τύπο αριθμού. Ο μακρύς χρησιμοποιείται για κλήσεις εξωτερικών ρουτινών (dll).
Μπορούμε να χρησιμοποιήσουμε το MessageBox των Windows. Η όρισε εκτός από σύνδεση εξωτερικών ρουτινών ορίζει και αντικείμενα, τύπου Com όπως το Word, όπως και άλλα αντικείμενα - έχει ένα τρόπο η Μ2000 να δείξει λίστα με αντικείμενα για δημιουργία και να δείξει και λίστα μεθόδων και ιδιοτήτων τους. Επίσης χρησιμοποιείται για τις φόρμες της Μ2000 (ιδιωτικά  αντικείμενα τύπου Com, ο κώδικάς τους είναι εντός του διερμηνευτή)

(Το user32 είναι ένα dll, και η MessageBoxW είναι μια Unicode ρουτίτα - δηλαδή παίρνει γράμματα για όλες τις γλώσσες)
Όρισε MessageBox Από "user32.MessageBoxW" {Μακρυς το_παράθυρο, κειμενο$, περιγραφή$, Μακρυς τυπος}
Τύπωσε MessageBox(Παράθυρο, "Γειά Χαρά", "Γιώργος", 2)

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

            Ν=Λάμδα Χ=1 ->{
                  Τόσο=1
                  Διάβασε ? Τόσο
                  =Χ*Τόσο
                  Χ++
            }
            Κατάσταση Αλφα = "Ν1":=Ν, "Ν2":=Ν, 100:=Ν, "αλφα":="οκ"
            Για Ι=1 έως 10
                  Τύπωσε Αλφα("Ν1")(), Αλφα("Ν1")(), Αλφα(100)(5), Αλφα("Ν2")(200), Αλφα$("αλφα")
                  Τύπωσε Αλφα("Ν1")(), Αλφα("Ν1")(), Αλφα(100)(5), Αλφα("Ν2")(200)
            Επόμενο ι

  • η Κατάσταση (δείκτης σε αντικείμενο Κατάσταση, θα έχει και εμφάνιση ως πίνακας αριθμητικός και ως πίνακας αλφαριθμητικός, για να δίνουμε κλειδί και να παίρνουμε τιμή, αντίστοιχα, αριθμητική ή αλφαριθμητική - ή αντικείμενο)
  • το αντικείμενο Σωρός (είναι δείκτης σε σωρό τιμών)
  • το αντικείμενο Πίνακας (χωρίς παρενθέσεις, δίνει πάντα δείκτη, μπορούμε να το ενώσουμε με όνομα με ή χωρίς $ και παρενθέσεις, για να αλλάξουμε τρόπο χειρισμού - interface)
  • η Διάρθρωση και η Δομή (ορίζουμε δομές διάρθρωσης μνήμης και τις εφαρμόζουμε σε ορισμούς διαρθρώσεων).
  • το Αντικείμενο COM που ορίζουμε με την όρισε (η Όρισε εκτός από σύνδεση με εξωτερικές συναρτήσεις κάνει και συνδέσεις με εξωτερικά αντικείμενα), 
  • Μεταβλητές που είναι ιδιότητες των αντικειμένων COM, και τις οποίες ορίσαμε με την εντολή Με (διαφορετική από την Με στην δομή Επίλεξε Με). Αυτές μπορούν να έχουν παρενθέσεις και να παίρνουν ορίσματα, και μπορούν να γυρνούν αλφαριθμητικό αν έχουν το $ στο όνομα.
Στο παράδειγμα που ακολουθεί η Αλφα είναι ένα αντικείμενο Wscript.Shell από το λειτουργικό των Windows.

Συνάρτηση MsgBox {
      Διάβασε Δειξε_Αυτό$, Χρόνος, Πλήκτρα, οΤίτλος$
      Όρισε Αλφα "WScript.Shell"
      Μέθοδος Αλφα, "Popup", Δειξε_Αυτό$, Χρόνος, οΤίτλος$, Πλήκτρα ως αποτέλεσμα
      Όρισε Αλφα Τίποτα
      =
αποτέλεσμα
}
α$={ένα κείμενο
με δύο γραμμές
}

Τύπωσε MsgBox(α$,4, 64+4, "Γεια Χαρά")


Στους ειδικούς τύπους προστέθηκε η συνάρτηση λάμδα. Δυο χαρακτηριστικά έχει, ότι υπάρχει ως μεταβλητή και ως συνάρτηση. Εδώ το Α είναι ως μεταβλητή η λάμδα, και ως Α() η συνάρτηση. Αν θέλουμε το αποτέλεσμα της Α() τότε καλούμε την συνάρτηση, αν θέλουμε την Α τότε την έχουμε ως ξεχωριστή μεταβλητή. Μπορούμε να φτιάξουμε και αλφαριθμητική λάμδα π.χ. Α$=λάμδα$ ->"οκ"

Α=λάμδα ->100
Τύπωσε Α() \\ 100
Κ=10
Α=λάμδα Κ -> Κ*αριθμός
Τύπωσε Α(10) \\ 100
Κ+=30
Τύπωσε Κ, Α(10) \\ 40, 100


Συνάρτηση Διπλή {
      Διάβασε απλή
      = Λάμδα απλή -> απλή(απλή(αριθμός))
}
Α=λάμδα -> Αριθμός**2
\\ βάζουμε μια λάμδα και παίρνουμε μια λάμδα
Β=Διπλή(Α)
Τύπωσε Β(2) \\16


Μετά το βελάκι -> μπορούμε να βάλουμε ότι θα βάζαμε σε μια συνάρτηση, μέσα σε μπλοκ. Αν δεν χρησιμοποιήσουμε μπλοκ τότε αυτόματα βάζει ένα μπλοκ, και εντός ένα = και τη παράσταση. Στο προηγούμενο παράδειγμα η Συνάρτηση Διπλή διαβάζει ένα αντικείμενο λάμδα, και το εισάγει σε μια νέα λάμδα στο χώρο της (δείτε το απλή πριν το ->) και έτσι κάθε φορά που εκτελούμε τη λάμδα αυτή ως παράσταση απλή(απλή(αριθμός)) όπου αριθμός το όρισμα, την "απλή" την βρίσκει σε αυτόν (αυτή είναι η λειτουργία  σύλληψης ή capture, η οποία παίρνει αντίγραφο - εκτός από περιπτώσεις όπου έχουμε αντικείμενα πάντα με αναφορά όπως οι Καταστάσεις)

Το παράδειγμα σχετίζεται και με το παρακάτω (Δυναμικοί Πίνακες). Υποχρεωτικά το λάμδα μέσα λάμδα θα πρέπει να έχει μετά το -> μπλοκ (εδώ το χρειάζεται επίσης γιατί έχει σειρά εντολών, θα μπορούσαμε να τις είχαμε σε πολλαπλές γραμμές). Η Α$() έχει κρύψει την Κ (είναι αντίγραφο της Κ του τμήματος) και την χρησιμοποιεί ως σταθερά. Επιστρέφει ότι μπορεί να επιστρέψει μια συνάρτηση αλφαριθμητικών, ένα αλφαριθμητικό, ή έναν πίνακα, ή μια συνάρτηση λάμδα$

Κ=5
Α$=Λάμδα$ Π$=Λάμδα$ Κ ->{Διάβασε Α$ : Πίνακας Β$(Κ)=Α$:=Β$()} -> Π$(Γράμμα$)
Πίνακας Β$()
Β$()=Α$("Οκ")
Τύπωσε Β$(1), Διάσταση(Β$(),1) \\ Οκ  5




Αντικείμενο Γεγονός

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

Διάρθρωση Μνήμης με χρήση Δομών

Μπορούμε να ορίσουμε δομές βάσει τεσσάρων βασικών δομών, τριών που έχουν να κάνουν με αριθμούς χωρίς πρόσημο των ενός, δυο και τεσσάρων bytes, και με 8 bytes για πραγματικό (double). Οι δομές μπορούν να περιέχουν πίνακες από τις βασικές αλλά και πίνακες δομών που έχουμε φτιάξει. Υπάρχει και λειτουργία ένωσης (union) όπου στον ίδιο χώρο έχουμε διαφορετικά offset, και έτσι έχουμε προσπέλαση με δυο ή περισσότερους τρόπους. Η Διάρθρωση μνήμης μπορεί να αλλάξει μέγεθος χωρίς να καθαρίσει τα δεδομένα, και ορίζεται βάσει μιας δομής (απλής ή σύνθετης) ως πίνακας αυτής. Μπορούμε να καλέσουμε συναρτήσεις C και να περάσουμε την διεύθυνση της διάρθρωσης και έτσι να πάρουμε αποτελέσματα.
Οι δομές δεν παίρνουν μεταβλητές όπως οι ομάδες, στην ουσία μια δομή είναι μια Κατάσταση με θέσεις (offsets) και μάλιστα λειτουργεί σαν κατάσταση, δίνει τις θέσεις όπως δείχνει το παράδειγμα.
Οι διαρθρώσεις (εδώ στο παράδειγμα δεν μηδενίζουμε το χώρο μνήμης, αν θέλαμε με Διάρθρωση Κενή μηδενίζουμε όλα τα bytes).
Τα ονόματα των βασικών δομών είναι ψηφίο (byte), ακέραιος (2 byte), μακρύς (4 byte) και διπλός (8byte  για αριθμό κινητής υποδιαστολής). Μπορούμε να γράφουμε αλφαριθμητικά με ένα ή δυο byte το γράμμα, όπως φαίνεται στο παράδειγμα. Η εντολή Επιστροφή παίρνει μια λίστα θέσεων-τιμών. Η ανάγνωση από την μνήμη γίνεται με τα Εκφρ() και Εκφρ$(). Ο χαρακτήρας ! χρησιμοποιείται για προσθέσεις θέσεων -λογαριάζει το πλάτος στοιχείου ανά θέση- Οπότε το 5!β θα λογαριαστεί ώς Μήκος(Αλφα)*5+Αλφα("β") και η τελική θέση βγαίνει με την προσθήκη της βάσης του Κάπα., της διεύθυνσης του πρώτου στοιχείου του.
Στην έκδοση 9.3 έχουν προστεθεί ο Απλός (Single) και το Γράμμα (String) το οποίο είναι δείκτης σε BSTR τύπου αλφαριθμητικό (τα χρησιμοποιεί και τα διαχειρίζεται το λειτουργικό των Windows), και καταλαμβάνουν μόνο 4 ψηφία (bytes), που είναι ο δείκτης σε αυτά. H M2000 διαχειρίζεται με ασφάλεια αυτούς τους δείκτες, αν και δίνει δυνατότητα μη ασφαλούς χρήσης (μια αποτυχημένη χρήση δείκτη οδηγεί σε κρέμασμα του διερμηνευτή). Όλα τα αντικείμενα με δείκτη στη Μ2000 έχουν ασφαλή χρήση, ο πραγματικός δείκτης είναι κρυφός, και η γλώσσα αναγνωρίζει αν έχει σε μια μεταβλητή αντικείμενο ή αριθμό, επειδή χρησιμοποιεί Variant τύπο καταχώρησης ο οποίος έχει τύπους και ένας από αυτός είναι το αντικείμενο. Στις διαρθρώσεις όμως μνήμης, ο διερμηνευτής, για να πετύχει την "αναγνώριση" ενός δείκτη ότι είναι αλφαριθμητικό, που στην ουσία είναι απλά ένας αριθμός τύπου Μακρύ, κάνει την απλή επιπρόσθετη εργασία να κρατάει μια κατάσταση με τα αλφαριθμητικά με κλειδί το δείκτη τους, έτσι πριν χρησιμοποιήσουμε ένα δείκτη σε αλφαριθμητικό που υποτίθεται είναι σε μια θέση μνήμης, με χρήση της κατάσταση βρίσκει αν είναι πράγματι δείκτης. Η κατάσταση λειτουργεί με πίνακα κατακερματισμού, σε χρόνο Ο(Ν). Όταν δε φτιάχνουμε μια διάρθρωση με έναν αριθμό δεικτών σε αλφαριθμητικά, όλα έχουν αρχική τιμή το κενό αλφαριθμητικό, το καθένα όμως με δικό του δείκτη.
Οι διαρθρώσεις μνήμης δεν είναι απλά χώρος στη μνήμη αλλά αντικείμενο που περιέχει και ένα χώρο στη μνήμη, και προβάλει την διεύθυνση αυτού του χώρου καθώς επίσης και ελέγχει σε κάθε φάση αν πάμε να γράψουμε έξω από αυτόν, ή δίνοντας offset (θέση) εκτός περιοχής ή δίνοντας κάτι που δεν χωράει στην μνήμη. Επίσης οι διαρθρώσεις μπορούν να μεταβάλουν τον χώρο μνήμης, και ίσως να αλλάξουν την βάση τους, την διεύθυνση αρχής. Αυτό όμως προγραμματιστικά δεν μας πειράζει γιατί πάντα χρησιμοποιούμε το αντικείμενο να μας δώσει τη τρέχουσα διεύθυνση.
Από την έκδοση 9.3 μπορούμε να έχουμε διαρθρώσεις κώδικα, και να εκτελούμε κώδικα σε γλώσσα μηχανής x86. (σε νεότερη έκδοση θα μπει και ο x86 Assembler).



Δομή Αλφα {
      α ως ψηφίο*8
      β ως ακέραιος*20 'κάνει για αλφαριθμητικό
      γ ως μακρύς*4
}


Τύπωσε Αλφα("α") \\ θέση 0
Τύπωσε Αλφα("β") \\ θέση 8 (+8 από την αρχή)
Τυπωσε Αλφα("γ") \\ θέση 48 (+48 από την αρχή)
Τύπωσε Μήκος(Αλφα) \\ 64 bytes
Διάρθρωση Κάπα ως Αλφα*20
Τύπωσε Μήκος(Κάπα) \\1280 ή 64*20 bytes
Επιστροφή Κάπα, 5 ! β :="Γιώργος"
Τύπωσε Εκφρ$(Κάπα, 5 ! β, 7*2) \\ 2 byte το γράμμα
Επιστροφή Κάπα, 3 ! β :=γραφή$("Γιώργος"+χαρ$(0)) \\ γράφει 8 bytes
Τύπωσε χαρ$(Εκφρ$(Κάπα, 3 ! β, 8)) \\ 1 byte (ψηφίο) το γράμμα

Αντικείμενο Σωρός

Από την 8.5 μπήκε και το αντικείμενο Σωρός (όπως ο σωρός τιμών της Μ2000). Ο σωρός είναι μια συλλογή τιμών και αντικειμένων, με δυνατότητα να προσθέτουμε στην αρχή ή στο τέλος, να διαβάζουμε από την αρχή, να πετάμε στοιχεία, να τα πηγαίνουμε πίσω και να τα φέρνουμε στην αρχή, και άλλες εργασίες σωρού. Μια μεταβλητή κρατάει αναφορά σε ένα σωρό και μπορεί να αντικαταστήσει το σωρό τιμών στο σημείο που θέλουμε. (κάθε τμήμα/συνάρτηση που εκτελείται συνοδεύεται από έναν σωρό τιμών, όπου μπορούμε να διαβάσουμε ή να γράψουμε. Χρησιμοποιείται και για το πέρασμα τιμών σε ορίσματα. Το αντικείμενο αντικαθιστά τον σωρό τιμών και μπορούμε να μαζέψουμε τιμές και να τις επιστρέψουμε ή μέσω σωρού τιμών ως ένα στοιχείο του ή ως αντικείμενο σωρός σε συνάρτηση.
Και το αντικείμενο σωρός λειτουργεί, όπως η κατάσταση και ο πίνακας με επαναλήπτη (δημιουργούμε αντικείμενο με την Κάθε(), υπάρχει στη βοήθεια, γράψτε ΒΟΗΘΕΙΑ ΚΑΘΕ( ή EACH(. Επίσης με την Τύπωσε εμφανίζει όλα τα στοιχεία σε στήλες.

Δυναμικοί Πίνακες

Οι πίνακες στην Μ2000 είναι δυναμικοί. Μπορούμε όχι μόνο να αλλάξουμε το μέγεθος αλλά και τις διαστάσεις. Επιπλέον ενώ το όνομα προκαθορίζει το τύπο του πίνακα, δεν καθορίζει το τι θα περιέχει το κάθε στοιχείο. Μπορούμε να συνδέσουμε ένα πίνακα αριθμών με έναν αλφαριθμητικών, να δείχνουν ένα πίνακα και να βάζουμε σε άλλες θέσεις αλφαριθμητικά και σε άλλα αριθμούς. Επίσης και αυτό είναι το πιο ενδιαφέρον μπορούμε να βάλουμε σε οποιοδήποτε στοιχείο το βασικό αντικείμενο της Μ2000, την ομάδα. Οι ομάδες παίρνουν πίνακες και άλλες ομάδες, εκτός όλων των άλλων (μεταβλητές, τμήματα, συναρτήσεις, τελεστές). Αν σκεφτεί κανείς ότι οι πίνακες αυτοί επίσης είναι δυναμικοί τότε καταλαβαίνει κανείς ότι μπορεί να φτιαχτεί μια σύνθεση πινάκων που να σχηματίζουν την πολυπλοκότητα μιας πόλης! Π.χ να έχουμε ένα πίνακα 100Χ100 στοιχείων και σε κάθε στοιχείο να έχουμε  ένα αντικείμενο "οικόπεδο" που να έχει ιδιότητες, όπως κτισμένο/άκτιστο, να έχει πίνακα με τα τυχόν διαμερίσματα, και ότι άλλο στοιχείο θέλουμε. Στοιχεία πίνακα μπορούν να είναι ομάδες, συναρτήσεις λάμδα, καταστάσεις, άλλοι πίνακες, εκτός από αριθμούς και αλφαριθμητικά. Από την 8.4 έκδοση υπάρχει και το αντικείμενο πίνακα (χωρίς παρενθέσεις) που κρατάει αναφορά σε πίνακα τα οποία δίνουν επαναλήπτες, αντικείμενα που διατρέχουν τα στοιχεία του αντικειμένου που αναφέρονται. Επιπλέον υπάρχουν τελεστές +=,-= και άλλοι που αλλάζουν απ'ευθείας όλα τα στοιχεία του πίνακα.

Οι πίνακες έχουν βάση 0 εκτός αν αλλαχθεί γενικά με την εντολή Βάση 1 σε βάση 1 ή Βάση 0 σε βάση 0, ή με την εντολή Πίνακας Βάση 1, Α(10) να φτιάξουμε ειδικά έναν πίνακα με βάση 1 (από 1 έως 10).

Η εντολή Α=(1,2,3,4) δημιουργεί αναφορά σε πίνακα τεσσάρων στοιχείων (πάντα με βάση 0 δίνονται οι πίνακες "λίστες" με παρενθέσεις.
Η εντολή Α=((1,2),(3,4)) δημιουργεί πίνακα δυο στοιχείων και κάθε στοιχείο είναι ένας πίνακας δυο στοιχείων (και οι εσωτερικοί είναι πίνακες με αναφορά).
Το παράδειγμα παρακάτω τρέχει σε έκδοση 8.4 και πάνω. Η Τύπωσε  τυπώνει όλα τα στοιχεία σε πίνακες και καταστάσεις, ως έχουν ή και με χρήση επαναλήπτη (αντικείμενο που κρατάει αναφορά στο αντικείμενο που δίνουμε και γνωρίζει αρχή και τέλος, και έχει δικό του δρομέα).


α=((1,2),(3,4))
β=Πρώτο(α) \\ 1,2
γ=Πρώτο(επόμενα(α)) \\ 3,4
Τύπωσε β \\ 1,2
γ+=10
Τύπωσε γ \\ 13, 14
Τύπωσε Πρώτο(επόμενα(α)) \\ έχει αλλάξει και στο Α
Πίνακας Γ1()
Γ1()=γ \\ αντίγραφο του γ
Γ1(1)+=10
Τύπωσε Γ1() \\ 13, 24
Τύπωσε Πρώτο(επόμενα(α)) \\  13, 14
\\ πραγματική αναφορά σε πίνακα Κ()
Ένωσε α στο Κ()
Κ(1)(1)+=100
Τύπωσε Πρώτο(επόμενα(α)) \\  13, 114
Τύπωσε γ \\ 13, 114
\\ Αντίγραφο με ένωση πινάκων
δ=Ενωση(Πρώτο(επόμενα(α)),Πρώτο(α), (5,6,7,8))
Τύπωσε Μήκος(δ) \\ 8
Τύπωσε δ \\ 13, 114, 1,2,5,6,7,8



Οι εντολές τοπικά/τοπικές/τοπική και γενική/γενικές/γενικό δουλεύουν και για πίνακες.
Στο παράδειγμα φαίνεται και μια ομάδα με τρία στοιχεία χ, ψ, ζ

Ομάδα Αλφα {χ,ψ,ζ}
Πίνακας Α(5,5)=Αλφα
Για Α(0,0) {
      =10
      =100
      =-10
}
Α(0,0).χ+=100
Τύπωσε Α(0,0).χ ' 110
Γενικό Β(10)=1 ' γενικός
Για Αυτό {
      Τοπικά Α(2,2)=1000
      Τύπωσε Α(0,0)
}
Τύπωσε Α(0,0).ψ ' 100
Αλφα=Α(0,0)
\\ αντίγραφο στο Αλφα
Για Αλφα {Τύπωσε .χ,,}

Παράδειγμα πίνακα σε πίνακα:

Πίνακας Α(10)
Για Αυτό {
      \\ προσωρινός πίνακας
      Πίνακας Β(10,2)=2
      \\ βγαίνει αντίγραφο
      Α(0)=Β()
}
Α(0)(0,0)++
Τύπωσε Α(0)(0,0) \\ 3

Παράδειγμα Πίνακα σε Κατάσταση Ειδών:

Οι καταστάσεις ειδών έχουν ζεύγη κλειδιών - τιμών (ή σκέτων κλειδιών που δίνονται και ως τιμές).
Τα κλειδιά μπορεί να είναι αριθμοί ή αλφαριθμητικά και η αναζήτηση γίνεται με συνάρτηση κατακερματισμού (hash function). Μπορούμε να ταξινομήσουμε τη λίστα (γίνεται με εσωτερική quicksort), αλλά μια προσθήκη ή μια διαγραφή χαλάει την ταξινόμηση. Η λίστα δουλεύει με πίνακα κατακερματισμού, και έχει προσθήκη, αναζήτηση και διαγραφή σε χρόνο ανεξάρτητο με το μέγεθός της. Έχει δοκιμαστεί να δοθεί το αντικείμενο σε javascript (που καλούμε από την Μ2000) και η javascript μπορεί να την χειριστεί και να γυρίσει τιμές.
Από την έκδοση 8.4 υπάρχει δυνατότητα να έχουμε λίστα με ίδια κλειδιά, αλλά χωρίς δυνατότητα διαγραφής/ταξινόμησης, εκτός από την διαγραφή από τα τελευταία στοιχεία που μπήκαν στην λίστα, και αυτή λέγεται Κατάσταση Ουρά. Σε αυτού του τύπου η κατάσταση η αναζήτηση φέρνει πάντα το τελευταίο στοιχείο με ίδιο κλειδί.

Κατάσταση Αλφα
Για Αυτό {
      \\ προσωρινός πίνακας
      Πίνακας Β(10,2)=2
      Προσθήκη Αλφα, "Κλειδί":=Β(), 100:=Β()

}
Αλφα("Κλειδί")(0,0)++
Τύπωσε Αλφα("Κλειδί")(0,0) \\ 3
Τύπωσε Αλφα(100)(0,0) \\ 2

Ονόματα-Αναγνωριστικά

Μπορούμε να έχουμε ονόματα ίδια π.χ. Α και Α$ (αλφαριθμητικό) και Α% (ακέραιος) και Α (τμήμα) και Α() πίνακας ή συνάρτηση (αν έχουμε και τα δύο τότε υπάρχει τρόπος να ξεχωρίσουν με το @ αμέσως μετά το άνοιγμα παρένθεσης - οπότε είναι συνάρτηση, ο διερμηνευτής δίνει προτεραιότητα στους πίνακες-), και Α() ρουτίνα (αν υπάρχει πίνακας τότε θέλει την εντολή Διαμέσου για να κληθεί, και εδώ ο διερμηνευτής δίνει προτεραιότητα στους πίνακες).  Τα ονόματα εκτός των ονομάτων ρουτινών δεν απαιτούν συμφωνία πεζών-κεφαλαίων-τόνων. Ειδικά οι ρουτίνες μπορούν να έχουν διαφορά στα πεζά-κεφαλαία αλλά πρέπει οι τόνοι να είναι όπως έχουν δηλωθεί:

Άλφα()
άλφα()
Διαμέσου άλφα()
Διαμέσου αλφα
Έξοδος
αλφα:
      Τύπωσε "οκ"
Επιστροφή
Ρουτίνα Άλφα()
      Τύπωσε "οκ"
Τέλος Ρουτίνας

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

Στα ονόματα πρέπει να υπάρχει στη πρώτη θέση γράμμα-ή σύμβολο που δεν χρησιμοποιεί ο διερμηνευτής. Μπορούμε να χρησιμοποιήσουμε το _  (underscore) μετά το πρώτο χαρακτήρα. Οι τελείες στην αρχή του ονόματος δηλώνουν μια ιεραρχία σε μια σειρά Για Αντικείμενο1, Αντικείμενο2...Α...Ν { } ή και φωλιασμένων Για Αντικείμενο { }  (το Για έχει δυο χρήσεις, μια για επαναλήψεις και μια για έμμεση αναφορά π.χ. Για Α { Τύπωσε .Χ } είναι ίδιο με το Τύπωσε Α.Χ
Οι τελείες σε άλλες θέσεις μπορεί ή όχι να σημαίνουν κάτι. Στο Α.Χ σημαίνει κάτι, ενώ αν φτιάξω το Α.Χ.Ζ=3 τότε αυτή θα είναι μεταβλητή με τελείες. Μπορούμε να δώσουμε χαρακτήρες από όποια γλώσσα θέλουμε.

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

Βασικά μέρη της Μ2000

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

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

Ένα  πρόγραμμα της Μ2000 αποθηκεύεται σε UTF-8 και είναι μια σειρά τμημάτων/συναρτήσεων/κλάσεων τα οποία αν φορτωθούν άμεσα από την κονσόλα της Μ2000 θα είναι γενικά (θα βλέπουν το ένα το άλλο), αλλιώς αν φορτωθούν τοπικά (μέσα σε ένα τμήμα και για όσο το τμήμα αυτό τρέχει) τότε θα τα βλέπει μόνο το τμήμα που τα φόρτωσε (υπάρχει τρόπος να φορτώσουμε ένα πρόγραμμα και να μπει σαν γενικό, οπότε να συνεχίσει να υπάρχει η σύνδεση μεταξύ τους). Αν ένα πρόγραμμα μετά τη λίστα τμημάτων/συναρτήσεων/κλάσεων, έχει εντολές τότε αυτές θα εκτελεστούν από την γραμμή εντολών, και έτσι μπορούμε να έχουμε προγράμματα ως αρχεία gsb και με διπλό κλικ να ξεκινούν άμεσα.  Όταν ξεκινάει με αυτό το τρόπο ένα πρόγραμμα σε M2000, τότε η κονσόλα δεν θα ανοίξει εκτός αν έχουμε μια εντολή εισαγωγής, ή αν δώσουμε την εντολή Άναψε. Μπορούμε να ξεκινήσουμε μια εφαρμογή που καλεί εντολές στο σύστημα. Υπάρχουν οι εντολές Σύστημα και Κονσόλα, η πρώτη είναι σαν την Run των windows, και η δεύτερη είναι η γραμμή εντολών των windows (cmd). Σε λειτουργία χρήστη, αυτές οι εντολές δεν δουλεύουν, και ο φάκελος που μπορεί να γράψει κανείς είναι μόνο ο φάκελος χρήστη και οι τυχόν υποφακέλοι του).

Τμήμα ΚάνεΚάτι {
      Διάβασε τόσα
      Συνάρτηση ΔυοΠαράμετροι {
            Διάβασε πρώτο, δεύτερο
            =πρώτο*δεύτερο
      }
      Για ι=1 έως τόσα {
            ΠεςΤο(ι)
      }
      Ρουτίνα ΠεςΤο(χ)
      Τύπωσε "Είμαι ένα τμήμα", ΔυοΠαράμετροι(χ,τόσα)
      Τέλος Ρουτίνας
}
ΚάνεΚάτι 5


Γράφεται και έτσι (οι Διάβασε μπήκαν σε παρενθέσεις δίπλα στο όνομα):
Τμήμα ΚάνεΚάτι (τόσα) {
      Συνάρτηση ΔυοΠαράμετροι (πρώτο, δεύτερο) {
            =πρώτο*δεύτερο
      }
      Για ι=1 έως τόσα {ΠεςΤο(ι)}
      Ρουτίνα ΠεςΤο(χ)
      Τύπωσε "Είμαι ένα τμήμα", ΔυοΠαράμετροι(χ,τόσα)
      Τέλος Ρουτίνας
}
ΚάνεΚάτι 5

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

Αροιθμοί γραμμών

Η Μ2000 δέχεται ως πέντε ψηφία αριθμούς γραμμών (παίρνουν και το 0 μπροστά αν θέλουμε, το 0002 ισοδυναμεί με το 2). Οι αριθμοί στο διορθωτή αυξάνονται αυτόματα ανά 10 εκτός αν υπάρχει το νούμερο οπότε αυξάνονται ανά ένα. Κάθε Τμήμα/Συνάρτηση μπορεί να έχει τι δική του αρίθμηση. Οι αριθμοί μπορούν να χρησιμοποιηθούν και από την Προς (Goto) και από την Διαμέσου (Gosub).
Στο παράδειγμα μετά την Τότε μπορούμε να δώσουμε αριθμό, θα είναι ίδιο με το Προς αριθμό. Οι αριθμοί γραμμών μπορούν να έχουν εντολές δίπλα, ενώ οι ετικέτες μόνο σχόλια.
10 Εισαγωγή "Δώσε Χ, Υ:", Χ, Υ
20 Αν Χ<=Υ Τότε 50
30 Τύπωσε "Ο Χ είναι μεγαλύτερος του Υ"
40 Προς 60
50 Τύπωσε "Ο Υ είναι μεγαλύτερος ή ίσος του Χ"
60 Τέλος

Μπλοκ Κώδικα

Όπου θέλουμε μπορούμε να χρησιμοποιούμε μπλοκ κώδικα σε αγκύλες. Η Μ2000 επιτρέπει το Goto ή Προς και από τέτοια μπλοκ. Κάθε μπλοκ μπορεί να γίνει μπλοκ επανάληψης αρκεί να δώσουμε εντολή που το κάνει αυτό, όπως η Κυκλικά (το σημαδεύει για επανάληψη και το σημάδι χάνεται με την επανάληψη),  η την Ξεκίνα. Στο δεύτερο παράδειγμα το "οκ" θα εμφανίζεται σε κάθε επανάληψη, ενώ στο πρώτο όταν το θα έχουμε  Ζ<=2.  Το Ξεκίνα ισοδυναμεί με το Κυκλικά : Συνέχισε
Μπορούμε να βγούμε εκτός μπλοκ με την Έξοδο ή με απλή Προς (σε ετικέτα ή σε αριθμό γραμμής)
Ζ=10
{
      Τύπωσε Ζ
      Ζ--
      Αν Ζ>2 Τότε Ξεκίνα
      Τύπωσε "οκ"
}
Τύπωσε Ζ


Ζ=10
{
      Τύπωσε Ζ
      Ζ--
      Αν Ζ>2 Τότε Κυκλικά
      Τύπωσε "οκ"
}
Τύπωσε Ζ



 Παράδειγμα με ετικέτα και χωρίς:
αλφα: \ Αυτό είναι σχόλιο
Εισαγωγή "Δώσε όνομα:", Α$
Αν Α$="" Τότε Προς αλφα
Τύπωσε "Ευχαριστώ ";Α$

Επανέλαβε {
      Εισαγωγή "Δώσε όνομα:", Α$
} Μέχρι Α$<>""
Τύπωσε "Ευχαριστώ ";Α$


Ως μπλοκ κώδικα με λειτουργία επανάληψης λειτουργούν και σε εντολές που δέχονται μπλοκ κώδικα. Εκτός τη Έξοδος (Exit) υπάρχει  και η Διέκοψε (Break) που κάνει διακοπή σειράς μπλοκ, μέχρι και το τμήμα/συνάρτηση εκτός αν βρει εντολή με μπλοκ οπότε κάνει διακοπή μέχρι αυτό.

Αντικείμενο Εκτέλεσης

Τα τμήματα/συναρτήσεις εκτός αυτών των  αντικείμενων μπορούν να έχουν στατικές μεταβλητές (όχι πίνακες ή αντικείμενα, μόνο απλές μεταβλητές), οι οποίες αν και αναφέρονται στο τμήμα σχετίζονται με το αντικείμενο εκτέλεσης.  Το αντικείμενο εκτέλεσης είναι εσωτερικό. Κάθε τμήμα, νήμα και κάθε συνάρτηση όταν εκτελείται δημιουργεί ένα αντικείμενο εκτέλεσης. Εκτός α;ό τις στατικές και το σωρό τιμών ένα αντικείμενο εκτέλεσης έχει το σωρό επιστροφών για τις ρουτίνες και το αντικείμενο εξόδου (πχ η Οθόνη ή μια φόρμα του γραφικού περιβάλλοντος). Έτσι νήματα μπορούν να χρησιμοποιούν γραφικά σε διαφορετικά επίπεδα πάνω στην οθόνη ή σε φόρμες στο γραφικό περιβάλλον, ή ακόμα να κάνουν εισαγωγή αριθμού ή αλφαριθμητικών σε διαφορετικό επίπεδο, ανεξάρτητα από το τι γίνεται σε άλλα επίπεδα.
Ειδικά για τις συναρτήσεις οι στατικές παραμένουν σε κάθε αναδρομική κλήση
Συνάρτηση Δοκίμασε {
      Στατική Α=1
      Α++
      Διάβασε Β
      Αν Β=0 Τότε =Α : Έξοδος
      =Δοκίμασε(Β-1)
}

Τύπωσε Δοκίμασε(10) ' δίνει 12  (την επόμενη, αν εκτελέσουμε ξανά την εντολή, θα δώσει 23)
Αν η Δοκίμασε υπάρχει για το τμήμα ΑΛΦΑ και αυτό είναι γενικό, δηλαδή μπορεί να κληθεί από την Α και τη Β τότε επειδή το Α και το Β έχουν άλλο αντικείμενο εκτέλεσης, θα έχουν άλλο σετ στατικών για την Δοκίμασε.

Χρήση λιγότερων παρενθέσεων.

Η Μ2000 μπορεί να εξεργαστεί παραστάσεις με λιγότερες παρενθέσεις, από αυτές που θα χρειάζονταν αν θέλαμε να φαίνεται επ΄ακριβώς η επιλογή του διερμηνευτή.. Π.χ. τα 5*3+2 και 5+3*2 θα  δώσουν τα (5*3)+2 και 5+(3*2), ή 17 και  11.
Το 5+3*2>5/2+20 θα δώσει 0  γιατί θα λογαριαστεί σαν  (5+3*2)>(5/2+20)
Αυτό 5+3*2>5/2+20 ή -1 θα δώσει -1 (αληθές) επειδή το βλέπει έτσι:  ((5+(3*2))>((5/2)+20)) ή -1
Η 5+3*2>5/2+8 και 5+3*2>5/2+2*4 θα δώσει -1  σαν να ήταν ((5+(3*2))>((5/)2+8)) και (5+(3*2))>((5/2)+(2*4)).

Επιλογή Εμφάνισης Υποδιαστολής Συστήματος ή Τελείας.

Εξ ορισμού η Μ2000 εμφανίζει τους δεκαδικούς με τελεία. Μπορούμε με αλλαγή διακόπτη να έχουμε μόνιμη εμφάνιση με τη τρέχουσα υποδιαστολή του συστήματος (πχ στα Ελληνικά είναι το κόμμα). Με το παρακάτω βάζουμε το τρέχουν του συστήματος ως επιλογή υποδιαστολής (με +DEC βάζουμε την τελεία).
Διακόπτες "-DEC"


Επιλογή Προτεραιότητας τελεστών ΚΑΙ , Η, ΑΠΟ (XOR)

Εξ ορισμού έχουμε εκτίμηση της έκφρασης από αριστερά προς τα δεξιά με όλους τους τέλεστές ΚΑΙ, Η, ΑΠΟ (δίνουν αποτέλεσμα 0 ή -1). Έτσι η παρακάτω έκφραση
Τύπωσε Αληθής Η Ψευδής ΚΑΙ Ψευδής
δίνει 0, Ψευδής γιατί εκτελεί το Η, άρα Αληθής και μετά το Αληθής και Ψευδής,
Μπορούμε μόνιμα να το αλλάξουμε αυτό:
Διακόπτες "+PRI"
Τύπωσε Αληθής Η Ψευδής ΚΑΙ Ψευδής
Τώρα τυπώνει -1, γιατί κάνει πρώτα την ΚΑΙ και μετά την Η. Άρα στο Ψευδής ΚΑΙ Ψευδής βρίσκει  το Ψευδής και στο Αληθής Η Ψευδής δίνει το Αληθής.
Προσοχή οι διακόπτες αλλάζουν μόνιμα κάτι. (Το περιβάλλον της Μ2000 είναι ένας εικονικός υπολογιστής)

Αντικείμενα ενός και μόνο τύπου

Τα βασικά αντικείμενα στη Μ2000 λέγονται ομάδες. Μπορούμε να ορίσουμε μια κενή ομάδα.
Ομάδα Άλφα {
}
Μπορούμε να προσθέτουμε ιδιότητες και μεθόδους σε μια ομάδα, όχι να αφαιρούμε. Μπορούμε να δούμε την ιδιότητα ως μεταβλητή αλλά μπορεί να είναι κάτι πιο σύνθετο. Οι ομάδες μπορούν να έχουν εσωτερικά και άλλες ομάδες και κάποιες να έχουν οριστεί ως ιδιότητες -ομάδες που γυρνούν ή δέχονται τιμή ή και τα δύο). Μια ομάδα χωρίς να οριστεί τιμή επιστροφής επιστρέφει ένα αντίγραφο, ως ανώνυμη ομάδα, και αυτό μπορούμε να το θέσουμε σε πίνακα, σε σωρό, σε κατάσταση και να το χειριστούμε από εκεί. Μπορούμε να ορίσουμε τελεστές για πράξεις με ομάδες. Οι ομάδες μπορούν να περιλαμβάνουν εκτός από άλλες ομάδες, μεταβλητές, γεγονότα, λάμδα συναρτήσεις, πίνακες και να ορίσουμε τι θέλουμε ιδιωτικό και τι δημόσιο. Από την έκδοση 8.4 μπήκε και τρίτη παραλλαγή να ορίσουμε τι θα είναι προσωρινό για το πρώτο αντικείμενο ενώ κάθε αντιγραφή δεν θα περιλαμβάνει τα προσωρινά. Οι συναρτήσεις μπορούν να επιστρέφουν ομάδες (επιστρέφουν τα πάντα εκτός από τμήματα και ρουτίνες). Μπορούμε να περάσουμε ομάδες με τιμή ή με αναφορά ή με ισχνή αναφορά (τρόπος ώστε να μην δημιουργηθεί ομάδα με αναφορές στα στοιχεία της ομάδας, αλλά να γίνεται πάντα "επίλυση" αναφοράς κατά τη ζήτηση, άρα μόνο στα στοιχεία που θέλουμε, όταν θέλουμε). Μια ανώνυμη ομάδα όταν χρησιμοποιείται γίνεται εσωτερικά επώνυμη, με αυτόματο όνομα, και στο πέρας της επεξεργασίας αποθηκεύτεται στη θέση που είχε, πχ σε κατάσταση ή σε πίνακα (σε σωρό βγάζουμε ή βάζουμε ομάδες, αλλά δεν μπορούμε να χειριστούμε τις ομάδες σαν να ήταν σε πίνακα).

Ομάδα Άλφα {Χ=10, Υ=30} \\ επώνυμη ομάδα
Άλφα.Χ+=100
Ομάδα Βήτα {Υ=100, Μ=100}
Τύπωσε Άλφα.Χ, Άλφα.Υ \\ 110   30
Πίνακας Μ(10)=Άλφα \\ αντιγράφει την Αλφα σε όλες τις θέσεις
Μ(1).Χ+=100 \\ ανώνυμη ομάδα, έχει μόνο θέση
Τύπωσε Μ(1).Χ \\ 210
Τύπωσε Μ(3).Χ \\ 110
Μ(3)=Μ(1) \\ Αντιγραφή
Τύπωσε Μ(3).Χ \\ 210
Ομάδα Άλφα {Ζ=50} \\ προσθέσαμε μια μεταβλητή
Τύπωσε Άλφα.Ζ
Τύπωσε Έγκυρο(Μ(3).Ζ) \\ 0 δεν είναι
Βήτα=Άλφα \\ σε επώνυμο (Βήτα) γίνεται συγχώνευση
Τύπωσε Βήτα.Ζ \\ πήρε τη Ζ όπως και τη Χ
Τύπωσε Βήτα.Υ \\ άλλαξε τιμή σε 30


Από την έκδοση 9 μπήκαν Γεγονότα στις ομάδες που συνδέονται στατικά με συναρτήσεις σε ένα τμήμα. Αυτό σημαίνει ότι αν περάσουμε την ομάδα με αναφορά θα καλούνται συναρτήσεις σε τμήμα που πέρασε το αντικείμενο με αναφορά.
Θα δούμε τα αντικείμενα αναλυτικά  σε άλλο κεφάλαιο

Συλλογή σκουπιδιών.

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

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






 

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

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

You can feel free to write any suggestion, or idea on the subject.