Εκτέλεση (Βασικά)

Για την εκτέλεση

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


Εδώ παραθέτω συνοπτικές οδηγίες και επεξηγήσεις.

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

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

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

Μπορούμε να καθαρίσουμε το κάτω μέρος, με την εντολή Οθόνη ή με τα πλήκτρα Ctrl+C.

Εμφανίζεται το σήμα ">" και ένας δρομέας που αναβοσβήνει (στα Windows) σαν κάτω παύλα _

Αν γράψουμε Τέλος και πατήσουμε πλήκτρο Enter κλείνει το πρόγραμμα.
Με την εντολή Ρυθμίσεις αλλάζουμε στοιχεία του περιβάλλοντος. Ανοίγει μια φόρμα διαλόγου και κάνουμε επιλογές.
Με την Ελληνικά επιλέγουμε τα μηνύματα λαθών να εμφανίζονται στα ελληνικά. Με την Λατινικά επιλέγουμε να βγαίνουν στη δεύτερη γλώσσα (προς το παρόν είναι τα Αγγλικά).


Μπορούμε να δώσουμε άμεσα εντολές.Το ? είναι το Τύπωσε για γρήγορο γράψιμο:
? 2+5*3
πατάμε enter και θα πάρουμε το αποτέλεσμα 17

Αν θέλουμε να δούμε προηγούμενες εντολές πατάμε το άνω ή κάτω βελάκι και κάνουμε κύκλο σε αυτά που έχουμε δώσει ενώ με enter εκτελούμε πάλι την εντολή που έχουμε επιλέξει!

Αν θέλουμε να δούμε όλες τις εντολές γράφουμε Σ  (είναι συντόμευση του ΣΥΓΓΡΑΦΗ ή Edit) και πατάμε enter. Θα ανοίξει ο διορθωτής προγράμματος και μπορούμε να διαγράψουμε ή να βάλουμε γραμμές. Βγαίνουμε με το Esc.

Στη κονσόλα οι εντολές που δίνουμε πάνε στο Μεταφραστή  Γραμμής Εντολών, Μπορούμε να ορίσουμε μεταβλητές. Πχ  (το > εμφανίζεται από το περιβάλλον)
>Α=10
>Τύπωσε Α*3, Α+5, Α/Α
>Α+=100
>?  Α*3, Α+5, Α/Α

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

Μέχρι εδώ είδαμε πως θα δημιουργήσουμε μια αριθμητική μεταβλητή. Μια αλφαριθμητική θέλει στο όνομα το $. Μπορούν να συνυπάρχουν τα Α και Α$.
>Α$="Γιώργος"
>? Μήκος(Α$)=7
Μπορούμε να δούμε τι μεταβλητές έχουμε με την εντολή Λίστα
>Λίστα
Μπορούμε να καθαρίσουμε όλες τις μεταβλητές
>Καθαρό
Μπορούμε να φτιάξουμε πίνακα (η Πίνακας Κ(10) φτιάχνει από Κ(0) έως Κ(9)) και εδώ χρησιμοποιούμε δήλωση των άκρων, του κάτω και του άνω άκρου στην πρώτη διάσταση.
>Πίνακας Κ(1 έως 10)=0
>Κ(1)=100
Μπορούμε να τυπώσουμε ένα στοιχείο του πίνακα
>? Κ(1)
Μπορούμε να τυπώσουμε όλο το πίνακα:
>? Κ()
Μπορούμε να δώσουμε περισσότερες από μια εντολή σε μια γραμμή με την άνω και κάτω τελεία.
>Λίστα : Καθαρό : Λίστα

Οι μεταβλητές είναι ονόματα που συνδέονται με ένα περιεχόμενο. Οι πίνακες είναι ονόματα που έχουν θέσεις αριθμημένες για να βάζουμε περιεχόμενο. Οι πίνακες μπορούν να έχουν διαστάσεις δηλαδή δυο ή περισσότερες αριθμήσεις θέσεων, έτσι ένας πίνακας Α(10,2) έχει δυο διαστάσεις, και συνολικά 10Χ2=20 στοιχεία.

>Πίνακας Α(10,2)
Δείτε ότι με το := δίνουμε πολλά στοιχεία στο πίνακα. Σε έναν δυο διαστάσεων πίνακα όπως ο Α() τα δυο πρώτα στοιχεία είναι στο Α(0,0) και Α(0,1)

>Α(0,0):=1,2
>? Α(0,0)=1, Α(0,1)=2

Το = χρησιμοποιείται και στην εκχώρηση τιμής και σαν  τελεστής ισότητας. Παρόλα αυτά υπάρχει το:

== για τελεστής ισότητας (στους αριθμούς τύπου Double, γίνεται σύγκριση στα 13 ψηφία μετά από στρογγυλοποίηση)
<= για εκχώρηση σε γενικές μεταβλητές (στη κονσόλα όλες οι μεταβλητές είναι γενικές και ισχύει το =), καθώς όπως θα δείτε στο εγχειρίδιο και για εκχώρηση τιμής σε μεταβλητές αντικειμένων σε εντολές που δίνονται σε μέλη αντικειμένων (συναρτήσεις ή τμήματα). Αυτός ο τρόπος έχει επιλεγεί για να μπορούμε να δημιουργούμε τοπικές μεταβλητές με χρήση του =. Αν υπάρχει γενική Χ τότε το Χ=10 φτιάχνει μια νέα τοπική Χ και μέχρι να βγει εκτός σκοπού η τοπική Χ η γενική Χ δεν μπορεί να πειραχθεί.

Αριστερή και Δεξιά Έκφραση
Βασικό στοιχείο στο προγραμματισμό είναι η αναγνώριση της Αριστερής και της Δεξιάς έκφρασης.

Είδαμε ότι το = το χρησιμοποιούμε για εκχώρηση τιμής και για ισότητα. Καταλαβαίνουμε εύκολα, πότε το = είναι ισότητα. Μαθαίνουμε να αναγνωρίζουμε την Αριστερή από Δεξιά έκφραση.
πχ το Τύπωσε 10=15-5 έχει δεξιά έκφραση το Τύπωσε, που είναι εντολή και αριστερή το 10=15-5 που είναι μια λογική έκφραση , εδώ την λέμε σύγκριση, και έχει δυο μέρη το 10 και το 15-5 που αμφότερα είναι αριθμητικές εκφράσεις (ακόμα και η έλλειψη τελεστή πράξης, όπως το 10 δεν αναιρεί την έννοια της έκφρασης). Έτσι εδώ το = είναι σε αριστερή έκφραση, άρα είναι ισότητα.
Δείτε το παρακάτω:

> Β=50

Εδώ έχουμε αριστερή έκφραση το Β= και δεξιά έκφραση το 50. Το Β=, στην αριστερή έκφραση είναι  μια εντολή εκχώρησης = και αν δεν υπάρχει το Β τότε δημιουργείται. Σε κάθε περίπτωση, αφού καθορίσει ο διερμηνευτής τον προορισμό εκτελεί τη αριστερή έκφραση και το αποτέλεσμα το βάζει στον προορισμό.

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

>Βάλε 1,2,3,4
>Σωρός
Εμφανίζει 4   3   2   1 ανάποδα δηλαδή. Η Βάλε ή Push βάζει στην κορυφή του σωρού τιμές. Αν δώσουμε τέσσερις τιμές θα βάλει τη πρώτη στη κορυφή, εδώ το 1, μετά το 2 στη κορυφή άρα επόμενο θα είναι το 1 και έτσι φτάνουμε στο 4 με επόμενα το 3 το 2 και το 1
Η εντολή Σωρός μας δείχνει τι έχει.
Ενώ στις μεταβλητές έχουμε όνομα για μια τιμή, και στους πίνακες έχουμε όνομα και αριθμητικό δείκτη (ή δείκτες αν έχουμε δυο ή περισσότερες διαστάσεις)., στο σωρό τιμών έχουμε θέση σε σχέση με τη κορυφή. Επιπλέον ο σωρός τιμών δεν έχει όριο, μπορεί να καλύψει μέχρι όλη τη μνήμη του υπολογιστή.

Για να πάρουμε από το σωρό μια τιμή τραβάμε πάντα από τη κορυφή, που σημαίνει ότι βγάζουμε ένα στοιχείο. Με την Σωρός ως έχει βλέπουμε τα στοιχεία του σωρού (το ανάλογο της εντολής Λίστα). Βλέπουμε λοιπόν τα 4 3 2 1 και δίνουμε την εντολή:
>? Αριθμός
δίνει το 4
Πατάμε το πάνω βελάκι και επιλέγουμε την εντολή που είχαμε δώσει πριν το ? Αριθμός και πατάμε  enter και το κάνουμε συνέχεια, επιλογή και enter.
Θα πάρουμε διαδοχικά τα 3 2 1 και το μήνυμα λάθους "ο σωρός είναι άδειος" (αφού έχουμε δώσει το Ελληνικά, ή το έχουμε βάλει στις ρυθμίσεις ως την εκ των ρυθμίσεων τιμή).
Ο σωρός έδρασε σαν στοίβα: Τελευταίο Μπαίνει Πρώτο Βγαίνει  (Last In First Out, LIFO)

Τώρα που είναι άδειος ο σωρός θα δοκιμάσουμε την άλλη λειτουργία
>Σειρά 1,2,3,4
> Σωρός
Τώρα βλέπουμε το 1 2 3 4 (δεν έχουν αντίστροφη σειρά όπως πριν). Η Σειρά γράφει κάθε νούμερο στο τέλος ή πυθμένα του σωρού.  Έτσι το πρώτο γράφεται στη κορυφή επειδή είναι άδειος ο σωρός, το δεύτερο γράφεται πίσω από τη κορυφή 1 2, το 3 γράφεται στο τέλος άρα έχουμε 1 2 3, το 4 επίσης στο τέλος άρα έχουμε 1 2 3 4.
Τώρα πατάμε το άνω βελάκι για να βρούμε την εντολή ? Αριθμός και πατάμε Enter και επαναλαμβάνουμε μέχρι να πάρουμε το ίδιο λάθος με πριν "ο σωρός είναι άδειος"
Θα μας δώσει πριν το λάθος τα νούμερα με τη σειρά 1 2 3 4. Αυτή η λειτουργία λέγεται λειτουργία ουράς, ή Πρώτο Μπαίνει Βγαίνει Πρώτο, First In First Out ή FIFO).

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

Συγγραφή Τμήματος
>Σ Αλφα
Ανοίγει ο διορθωτής για να γράψουμε το τμήμα Αλφα.
Στο πρώτο τμήμα θα βάλουμε την εντολή Σωρός να δούμε τι έχουμε κατά τη κλήση.
Αν θέλουμε να διαβάσουμε δυο αριθμούς από το σωρό τιμών, τότε γράφουμε μια Διάβασε Χ, Υ ώστε να μπουν οι τιμές στα Χ και Υ (τα δημιουργεί αν δεν υπάρχουν τοπικά).
Σωρός
Διάβασε Χ, Υ
Τύπωσε Χ*Υ
Πατάμε Esc
> Βάλε "οκ"
> Αλφα  2, 3
Εμφανίζει το σωρό τιμών (μπορούν να μπουν διάφορα είδη τιμών στο Σωρό Τιμών)
2 3 "οκ"   
Δείτε ότι στη κλήση της Αλφα γράψαμε το όνομά της. Αυτή είναι η αριστερή έκφραση.. Δεν υπάρχει τελεστής που ανήκει στους τελεστές αριστερής έκφρασης, οπότε ή είναι εντολή ή κλήση τμήματος. Εδώ είναι κλήση τμήματος. Η δεξιά έκφραση είναι μια λίστα εκφράσεων που μπορεί να έχει πολλά κόμματα διαχωρισμένων εκφράσεων, και εδώ είναι μόνο ένα, άρα έχουμε δυο εκφράσεις με δύο τιμές, το 2 και το 3. Ο διερμηνευτής βάζει σε μια σειρά τα 2 και 3 και μετά τα βάζει στη κορυφή του σωρού τιμών. Σαν να τα βάζει στο τέλος με το Σειρά και να τα μεταφέρει στην κορυφή.
Έτσι η Διάβασε θα πάρει τις τιμές και θα τις βάλει σε δυο νέες μεταβλητές τη Χ και Υ. Αυτές οι μεταβλητές θα διαγραφούν με την επιστροφή από τη κλήση της άλφα. Ο κανόνας εδώ είναι ότι κάθε νέο αναγνωριστικό που φτιάχνουμε σε ένα τμήμα ή μια συνάρτηση θα διαγραφεί με την επιστροφή από τη κλήση.
Μπορούμε να καλέσουμε το Άλφα με την Κάλεσε
>Κάλεσε Άλφα, 2, 3
Τα τμήματα εξ ορισμού δεν έχουν αναδρομή με την απλή κλήση, δεν το αφήνει ο διερμηνευτής. Όμως με τη Κάλεσε γίνεται να έχουμε αναδρομή. Η κλήση της Άλφα μέσα από την Άλφα πρέπει να γίνει με την Κάλεσε για να έχουμε αναδρομή. Οι συναρτήσεις έχουν αναδρομή, όπως και ρουτίνες και οι απλές συναρτήσεις άμεσα.
Τώρα είμαστε στη γραμμή εκτέλεσης και με τη Σωρός βλέπουμε ότι έχουμε μια λέξη.
>? Γράμμα$
οκ
Με την Γράμμα$ κάναμε ότι με την Αριθμός για αριθμούς.

Συγγραφή Συνάρτησης
Ας φτιάξουμε και μια συνάρτηση (δείτε εδώ το = είναι αριστερή έκφραση, μόνο του). Στις συναρτήσεις η έξοδος γίνεται στο τέλος της συνάρτησης όχι στην = σαν εντολή. Αν δεν βάλουμε το = ή αν δεν εκτελεστεί λόγο αλλαγής ροής, γυρίζει μηδενική τιμή 0 ή "" ανάλογα  το όνομα της συνάρτησης. Αν η συνάρτηση έχει το $ στο όνομα γυρνάει αλφαριθμητικό (γράμματα).
Σ Επί2()
Διάβασε Χ
=Χ*2
Πατάμε Esc
>? Επί2(10)=20

Αποθήκευση Προγράμματος
Σώνουμε τα προγράμματα με το Σώσε
Σώσε πρώτο
Διαγράφουμε τα τμήματα με το Νέο, αλλά ο σωρός δεν διαγράφεται
Διαγράφουμε το σωρό τιμών με το Άδειασε
Διαγράφουμε τις μεταβλητές (καθολικές ή γενικές) με το Καθαρό
Τα κάνουμε όλα (εκτός από το σωρό), με την Αρχή
>Αρχή
Τώρα γράφουμε:
>Φόρτωσε πρώτο
Γράφουμε:
>Τμήματα ?
Και βλέπουμε τι έχουμε  (με σκέτο Τμήματα βλέπουμε και τι έχουμε στο δίσκο, σε ονόματα αρχείων). Αν το όνομα θέλουμε να έχει διαστήματα χρησιμοποιούμε εισαγωγικά. Σπάνιο να το χρησιμοποιήσουμε.

Γραφικά στη Κονσόλα
Με το παρακάτω:
>Οθόνη ,0
καθαρίζουμε την οθόνη από την πάνω γραμμή, βάζοντας δηλαδή την ολίσθηση να γίνεται από την πρώτη γραμμή (να μην έχουμε χωριστή οθόνη)
>Οθόνη, -10 
Τώρα καθαρίζουμε τις κάτω 10 γραμμές και πάει ο δρομέας στη πρώτη από αυτές τις γραμμές.
> Θέση 6000. 6000¨: Χάραξε 3000, 2000
Δώσαμε εντολή μετακίνησης του δρομέα γραφικών (Δεν φαίνεται) και μετά χαράξαμε 3000 twips δεξιά και 2000 twips κάτω (σχετικές αποστάσεις).
> Κύκλος 3000 
Δίνουμε έναν κύκλο με ακτίνα 3000 twips και κέντρο το σημείο που βρίσκεται ο δρομέας γραφικών.
Η οθόνη της κονσόλας έχει και γραφικά.


Στην εγκατάσταση της Μ2000 υπάρχει βιβλίο στα ελληνικά για να δει κανείς περισσότερα, και έχει ένα κεφάλαιο για γραφικά!
Τέλος υπάρχει η εντολή Βοήθεια 
>Βοήθεια Όλα 
μας δίνει όλα τα αναγνωριστικά (πάνω από 500) της γλώσσας και για κάθε ένα έχει οδηγίες και προγράμματα για να καταλάβει κανείς την λειτουργία.
>Βοήθεια Τύπωσε


Χρήση του info

Την πρώτη φορά που ξεκινάμε τη Μ2000 μπορούμε να δώσουμε τα παρακάτω
κατάλογος εφαρμογή.κατ$
ή
dir app.dir$

και μετά 
Φόρτωσε info
ή
Load info

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

Πατάμε το F1 για να σωθεί στο κατάλογο χρήστη.
Έτσι δεν χρειάζεται την επόμενη φορά να αλλάζουμε κατάλογο.
Είναι στα αγγλικά άλλα έχει πολλές; πληροφορίες και πολλά προγράμματα και παιχνίδια!


Περί σκοπού μεταβλητών σε σχέση με άλλες γλώσσες.
Πολλές γλώσσες έχουν μια διαδικασία όπου όταν εμφανιστεί ένα αναγνωριστικό έστω Χ σε δεξιά έκφραση τότε αναζητείται στον ορίζοντα του τοπικού σκοπού και αν δεν βρεθεί πάει παραπάνω. Ορίζοντας τοπικού σκοπού είναι το σώμα μιας συνάρτησης ή ενός τμήματος. Όταν το τμήμα τερματίσει όσα αναγνωριστικά ήταν στον τοπικό σκοπό διαγράφονται. Τι γίνεται όμως αν έχουμε διαδοχική κλήση τμημάτων ή συναρτήσεων; Κάποιες γλώσσες έχουν την προδιαγραφή να κοιτούν τους προηγούμενους σκοπούς (ορίζοντες τοπικού σκοπού) ακολουθόντας το μονοπάτι των τρεχουσών κλήσεων. Δηλαδή αν η Χ δεν έχει οριστεί στο τοπικό σκοπό, η αναζήτηση γίνεται στο σκοπό απ' όπου κλήθηκε η τρέχουσα συνάρτηση ή τμήμα (διαδικασία λέγεται το τμήμα σε άλλες γλώσσες). Αυτό ΔΕΝ ισχύει στη Μ2000. Αν μια Χ δεν έχει οριστεί στο τοπικό σκοπό τότε αναζητείται σαν γενική και αν δεν βρεθεί τότε βγαίνει λάθος. Σε αριστερή έκφραση και ειδικότερα στην εκχώρηση, αν ακολουθεί το = τότε αν στην αναζήτηση του ονόματος δεν βρεθεί τοπική θα δημιουργηθεί μια, ανεξάρτητα αν υπάρχει γενική με το ίδιο όνομα. Για να αποφύγουμε τη σκίαση μπορούμε να δώσουμε το <= οπότε θα αναζηθεί γενική, και αν δεν βρεθεί θα βγει λάθος. Δημιουργία γενικών γίνεται μέσα σε τμήματα ή συναρτήσεις με την εντολή (έχει παραλλαγές) Γενική και Γενικές. Αν μπει η δήλωση Γενικές σε επανάληψη θα δημιουργηθεί κάθε φορά μια νέα γενική ενώ η παλιά αν υπάρχει θα παραμένει με την παλιά τιμή. Ομοίως υπάρχει η Τοπική (και ως Τοπικές) η οποία φτιάχνει τοπικές που σκιάζουν τοπικές με το ίδιο όνομα. Αυτό είναι χρήσιμο σε Ρουτίνες όπου είναι μέρη του τμήματος ή συνάρτησης τα οποία έχουν ίδιο σκοπό με το τμήμα ή συνάρτηση αλλά στο τέλος εκτέλεσης διαγράφουν ό,τι έχουν δημιουργήσει.

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

Περί αντικειμένων στη Μ2000 σε σχέση με άλλες γλώσσες
Τα αντικείμενα στη Μ2000 είναι ομάδες με μέλη ό,τι μπορούμε να δημιουργήσουμε στη Μ2000 με όνομα. Σε πολλές γλώσσες ένα αντικείμενο δίνει έναν δείκτη σε ένα όνομα, έστω Α ώστε το Β=Α να παρέχει στο Β τον ίδιο δείκτη στο αντικείμενο. Στη Μ2000 υπάρχουν δείκτες που μπορούν να κάνουν αυτό το πράγμα εφόσον επιλέξουμε να τους χρησιμοποιήσουμε. Μια δήλωση Ομάδας είναι σαν ένα στατικό αντικείμενο (αλλά έχει ζωή όσο ο τοπικός σκοπός όπου δηλώθηκε η ομάδα). Αν φτιάξουμε την Α τότε το Β=Α θα δώσει αντίγραφο της Α στην Β, αν δεν υπάρχει η Β ενώ μια άλλη φορά που θα υπάρχει η Β ως ομάδα, θα γίνει συγχώνευση, όπου μέσα στη Β θα υπάρχει αντίγραφο της Α και ό,τι άλλο είχε. Οι Α και Β αναφέρονται ως Ανοικτά Αντικείμενα ή Επώνυμα Αντικείμενα.  Τα Α και Β μπορούν να περαστούν με τιμή  (Α) ή με αναφορά (πχ &Α) σε κλήσεις τμημάτων.
Μια πιο προχωρημένη χρήση των αντικειμένων είναι να τα βάλουμε σε καταχωρητές αντικειμένων όπως Κατάσταση (λίστα), Σωρό και Πίνακα. Εκεί τα αντικείμενα είναι Κλειστά ή Ανώνυμα. Λέγονται κλειστά γιατί για να τα δουλέψουμε πρέπει πρόσκαιρα να ανοίξουν. Τα κλειστά αντικείμενα διαγράφονται όταν διαγράφεται ο καταχωρητής τους. Πχ το Α είναι ανοικτό αντικείμενο και φτιάχτηκε με την εντολή Ομάδα Α {Χ=10}. Η εντολή Πίνακας Α(10)=Α δημιουργεί ένα πίνακα δέκα στοιχείων από Α(0) έως Α(9) με αντίγραφο του Α σε κάθε θέση. Η εντολή Α(3).Χ++ αυξάνει το Χ στο αντικείμενο στο Α(3) κατά ένα.  Η εντολή Τύπωσε Α(3) είναι Α(4) θα δώσει Ψευδές.επειδή κάθε κλειστό αντικείμενο έχει έναν μοναδικό δείκτη (δεν βγαίνει δεύτερος).
Μπορούμε να φτιάξουμε πολλά διαφορετικά προγράμματα με αντικείμενα με χρήση καταχωρητών όπως ο πίνακας, Σε μια ομάδα μπορούμε να έχουμε πίνακες ως μέλη. Επειδή έχουμε χρήση μοναδικού δείκτη δεν θα υπάρξει πρόβλημα "αυτοαναφοράς" δηλαδή να υπάρχει χρήση ενός αντικειμένου με δείκτη που φυλάμε στο ίδιο αντικείμενο (και το οποίο θα απέτρεπτε το αντικείμενο να διαγραφεί).
Η πιο προχωρημένη χρήση αντικειμένων είναι με δείκτες. Οι δείκτες στη Μ2000 έχουν διπλή υπόσταση. Αν το Α είναι επώνυμη ομάδα και το Β νέο όνομα, τότε το Β->Α θα είναι δείκτης του Α ως όμως ισχνή αναφορά. Δηλαδή κάθε φορά που θα χρησιμοποιούμε το Β πχ Τύπωσε Β=>Χ (δείτε ότι δεν έχουμε τελεία αλλά το => )  το Β θα ανιχνεύεται αν υπάρχει και αν ναι τότε θα δίνεται η τιμή του Α.Χ αλλιώς θα βγαίνει σφάλμα. Αν δώσουμε το Β->(Α) τότε το Β θα πάρει έναν πραγματικό δείκτη από το αντίγραφο του Α (από το κλειστό αντικείμενο σαν το Α, αλλά όχι το Α). Όταν ο δείκτης δείχνει κλειστό αντικείμενο τότε αυτό θα διαγραφεί όταν και ο τελευταίος δείκτης σε αυτό διαγραφεί. Για τη Μ2000 ένα όνομα που είναι δείκτης σε ομάδα μπορεί να δείχνει οποιαδήποτε ομάδα, είτε είναι κλειστή (άρα έχουμε πραγματικό δείκτη) είται ανοικτή (άρα έχουμε ισχνή αναφορά). Σημειώστε ότι δεν γίνεται να έχουμε NULL δείκτη, δεν μπορούμε να βάλουμε 0. Υπάρχει το αντικείμενο NULL το οποίο είναι μια άδεια ομάδα.

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

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

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

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

Η Μ2000 υποστηρίζει συναρτήσεις λάμδα (πρώτης τάξης) που διαφέρουν ως προς τις συναρτήσεις και τις απλές συναρτήσεις. Οι απλές συναρτήσεις είναι όπως οι ρουτίνες στον ίδιο σκοπό, στατικά μέρη κώδικα που βλέπουν τις μεταβλητές παντού στον ίδιο σκοπό και μπορούν να έχουν δικές τους τοπικές., αλλά δεν μπορεί να αλλαχτεί ο κώδικάς τους (βρίσκονται πάντα στο τέλος του κώδικα του τμήματος ή συνάρτησης, καλούνται με @ στην αρχή του ονόματος). Οι συναρτήσεις είναι σαν τα τμήματα, έχουν δηλαδή δικό τους σκοπό, και μπορούν να έχουν δικές τους συναρτήσεις, τμήματα, ρουτίνας και απλές συναρτήσεις. Οι συναρτήσεις όπως και τα τμήματα μπορούν να αλλάξουν κώδικα αν δώσουμε στον ίδιο σκοπό που φτιάχτηκαν νέα δήλωση ορισμού εκτός και αν το έχουμε αποκλείσει στη προηγούμενη δήλωση (λέμε Συνάρτηση Τελική Α(Χ) { σώμα συνάρτησης }) οπότε απλά θα πεταχτεί ο νέος ορισμός.
Οι λάμδα συναρτήσεις είναι μεταβλητές που έχουν διπλή φύση, είναι συνάμα και συναρτήσεις, έτσι το Α=λάμδα (χ)=χ**2 θα κάνει το Α(3) να δώσει 9, αλλά αν μετά δώσουμε το Α=λάμδα (χ)=χ*2 τότε μετά το Α(3) θα δώσει 6. Δηλαδή μπορούμε να αλλάζουμε τη συνάρτηση με εκχώρηση νέας σαν μεταβλητή. Μπορούμε να καταχωρούμε λάμδα συναρτήσεις σε πίνακες, καταστάσεις, σωρούς. Μπορούμε να επιστρέφουμε λάμδα συναρτήσεις ως τιμή επιστροφής σε συναρτήσεις.

Επίσης υπάρχει το αντικείμενο Γεγονός όπου κρατάει μια λίστα συναρτήσεων (δουλεύει σαν τα delegates της C#), όπου μπορούμε να προσθέτουμε ή να αφαιρούμε συναρτήσεις. Η κλήση γίνεται βάσει προκαθορισμένου αριθμού και τύπου παραμέτρων.

Τέλος όπως πολλές σύγχρονες γλώσσες, έτσι και η Μ2000 έχει το tuple. Εδώ η διαφορά είναι ότι το tuple μπορεί να αλλάξει τιμές.  Πχ το (1,2,"οκ",(4,5)) είναι ένας αυτόματος πίνακας (tuple) με τέσσερα στοιχεία, όπου το πρώτο (στοιχείο 0) και το δεύτερο είναι αριθμός, το τρίτο είναι αλφαριθμητικό ενώ το τέταρτο είναι άλλος αυτόματος πίνακας (λέγονται αυτόματοι διότι δεν ορίζονται με δήλωση Πίνακας). 
(γράψτε Σ Α enter, μετά επικόλληση τα παρακάτω, πατάμε ESC και γράφουμε Α enter)

Τ=(1,2,"οκ",(4,5))


Τύπωσε  Τ#Τιμή(3)#Τιμή(1)=5
Τύπωσε Τ#Τιμή$(2)="οκ"
Τύπωσε Τ#Τιμή(1)=2
Τυπωσε Μήκος(Τ)=4
Τύπωσε  Μήκος(Τ#Τιμή(3))=2


Επιστροφή Τ, 3:=(100,200,300)
Τύπωσε  Τ#Τιμή(3)#Τιμή(1)=200
Τύπωσε  Μήκος(Τ#Τιμή(3))=3
Τ=(,)
Τυπωσε Μήκος(Τ)=0
Τ=("Α",)
Τυπωσε Μήκος(Τ)=1

Προσθήκη Τ, (100, 200)
Τύπωσε Μήκος(Τ)=3
Κ=Ένωση(Τ, (1,2,3), Τ)
Τύπωσε Μήκος(Κ)=9
Τύπωσε Πρώτο(Επόμενα(Τ))#Τιμή(0)=100
Τύπωσε Τ ' Α 100 200
Τ=Ένωση(Επόμενα(Τ), Πρώτο(Τ))
Τύπωσε Τ ' 100 200 Α
Τ=Ένωση(Επόμενα(Τ), Πρώτο(Τ))
Τύπωσε Τ ' 200 Α 100

Τ=Ένωση(Τ#Μέρος(0,0),Τ#Μέρος(2))
Τύπωσε Τ ' 200 100



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

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

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