Τρίτη 18 Ιουνίου 2019

Revision 28 Version 9.8

A syntax color fix
line:
                  maze$(INT((currentx% oldx%) / 2), ((currenty% oldy%) / 2)) = " "
See at the end, at /2)) the two parenthesis now have the proper different color.

This is the Maze module in info.gsb (included in m2000 installation file)



Module Maze {
      width% = 40
      height% = 20
      \\ we can use DIM maze$(0 to width%,0 to  height%)="#"
      \\ so we can delete the two For loops
      DIM maze$(0 to width%,0 to height%)
      FOR x% = 0 TO width%
          FOR y% = 0 TO height%
              maze$(x%, y%) = "#"
          NEXT y%
      NEXT x%

      currentx% = INT(RND * (width% - 1))
      currenty% = INT(RND * (height% - 1))

      IF currentx% MOD 2 = 0 THEN currentx%++
      IF currenty% MOD 2 = 0 THEN currenty%++
      maze$(currentx%, currenty%) = " "

      done% = 0
      WHILE done% = 0 {
          FOR i% = 0 TO 99
              oldx% = currentx%
              oldy% = currenty%
              SELECT CASE INT(RND * 4)
                  CASE 0
                      IF currentx% + 2 < width% THEN currentx%+=2
                  CASE 1
                      IF currenty% + 2 < height% THEN currenty%+=2
                  CASE 2
                      IF currentx% - 2 > 0 THEN currentx%-=2
                  CASE 3
                      IF currenty% - 2 > 0 THEN currenty%-=2
              END SELECT
              IF maze$(currentx%, currenty%) = "#"  Then {
                  maze$(currentx%, currenty%) = " "
                  maze$(INT((currentx% + oldx%) / 2), ((currenty% + oldy%) / 2)) = " "
             }
          NEXT i%
          done% = 1
          FOR x% = 1 TO width% - 1 STEP 2
              FOR y% = 1 TO height% - 1 STEP 2
                  IF maze$(x%, y%) = "#" THEN done% = 0
              NEXT y%
          NEXT x%
      }


      FOR y% = 0 TO height%
          FOR x% = 0 TO width%
              PRINT maze$(x%, y%);
          NEXT x%
          PRINT
      NEXT y%
}
Maze

Πέμπτη 13 Ιουνίου 2019

Αναθεώρηση 26 Έκδοση 9.8


1. Μια μικρή διόρθωση για τον χρωματιστή κώδικα όταν έχουμε μετά από TOTE και ΑΛΛΙΩΣ ετικέτα τύπου αριθμός (είναι σαν να υπάρχει η ΠΡΟΣ πριν τον αριθμό). Εδώ στο παράδειγμα το 100 και το 120 έχουν ενδιάμεσα το else και χρωματίζεται μπλε (αναγνωριστικό της Μ2000).
Module TestMe {
 090 if random(1,2)=1 then 100 else 120
 100 Print "100"
 110 End
 120 Print "120"
 130 End
}
For i=1 to 10 : TestMe : Next

2. Προχωράει ο Ast Interpreter.
Για την ώρα δεν εκελείται ο μεταφρασμένος κώδικας. Αυτό που κάνει το παρακάτω πρόγραμμα είναι να εμφανίζει με ? τη λίστα από το lexical analyzer, που έχει ήδη φτιαχτεί με "γνώση" όπως ξέρει τα σταθερά (πχ το 100 ή το "ασδασδ") δηλαδή ποιοι είναι αριθμοί, ποια είναι αλφαριθμητικά, και επιπλέον έχει εξαφανίσει διαστήμα (white space), και σημειώσεις. Επιπλέον έχει υπολογίσει ποια είναι tuple (πχ το (1,2,3,4) είναι tuple), έχει υπολογίσει για κάθε ανοικτή παρένεθεση που είναι το επόμενο σύμβολο μετά το κλείσιμο παρένθεσης. Ομοίως έχει υπολογίσει για τις αγκύλες { }.

Αυτό που με ενδιαφέρει τώρα είναι να κάνω όλες τις δομές (πχ το Αν Τέλος Αν, το οποίο δουλεύει με Αν { } δηλαδή με μπλοκ και χωρίς μπλοκ) να έχουν προυπολογίσει τα σημεία "εξόδου" ή όπως φαίνονται στο κείμενο του AST ως skip number

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


Ο τρόπος που δουλεύει ο lexical analyzer μοιάζει με εκείνο του χρωματιστή κώδικα. Η διαφορά είναι ότι ο χρωματισμός γίνεται πιο "σοβαρός" από το χρωματιστή κώδικα, γιατί θέλουμε περισσότερα αποτελέσματα και όχι απλά να φαίνεται χρωματισμένος κώδικας. Για το λόγο αυτό υπάρχει το αντικείμενο κλάσης Lexar το οποίο φορτώνει κώδικα και καλεί γεγονότα. Εντός της Lexar υπάρχει το αντικείμενο Document το οποίο σπάει το κείμενο σε παραγράφους και στέλνει κάθε γραμμή για χρωμάτισμα με γεγονότα στην Lexar. Ενδέχεται μια γραμμή να χρωματίσει και επόμενες, έτσι η Document αν βλέπει ήδη μια γραμμή χρωματισμένη την αφήνει. Υπάρχει μια κλάση CodeBlock η οποία δημιουργεί την κλάση Lexar και συνδέει τα γεγονότα της με αυτήν. Έτσι το τελικό διαμορφώνεται από τις τρεις κλάσεις, με γεγονότα από το Document στο Lexar και μετά στο CodeBlock. Προς το παρόν το CodeBlock έχει μια μέθοδο που κάνει εμφάνιση γραμμών στην κονσόλα της Μ2000, με σταμάτημα σε κάθε 3/4 του ύψους της κονσόλας. Αυτό με βοηθάει να εξετάζω το αποτέλεσμα. Έτσι πριν προχωρήσω στην εκτέλεση του αποτελέσματος θέλω να είμαι σίγουρος ότι κάνει όλα αυτά που θέλω να κάνει (και είναι πάρα πολλά, προφανώς θα έχω να διορθώνω αρκετά, αν δεν πετύχω μια ευνοική κωδικοποίηση στο AST). Αν και το λέμε tree είναι ένα πίνακας στοιχείων όπου όμως υπάρχει πεδίο για σύνδεση με άλλο σημείο. και αυτό ήδη το εκμεταλλεύομαι για να σημαδεύω σε μια αρχή παρένθεσης ή μπλοκ το τέλος του. Εσωτερικά το Lexar έχει και έναν σωρό τιμών (τον χρησιμοποιώ σαν στοίβα) για να μπορώ να κλείνω σωστά τα μέρη κώδικα.
Υπάρχουν μερικά Stop στο κώδικα της VB6 για να με βοηθούν να βλέπω πότε συμβαίνουν πράγματα που δεν θέλω!

Εδώ είναι το αρχείο με το κώδικα ως τώρα (θα το ανανεώνω τακτικά) AST Interprerter

MODULE Pythagoras_tree {
 CLS 5, 0  ' MAGENTA, NO SPLIT SCREEN
 PEN 14   ' YELLOW
 \\ code from zkl/Free Basic
 LET w = scale.x, h = w * 11 div 16
 LET w2 = w div 2, diff = w div 12
 LET TreeOrder = 6
 pythagoras_tree(w2 - diff, h -10, w2 + diff, h -10, 0)
 
 SUB pythagoras_tree(x1, y1, x2, y2, depth)
 
     IF depth > TreeOrder THEN EXIT SUB
 
     LOCAL dx = x2 - x1, dy = y1 - y2
     LOCAL x3 = x2 - dy, y3 = y2 - dx
     LOCAL x4 = x1 - dy, y4 = y1 - dx
     LOCAL x5 = x4 + (dx - dy) / 2
     LOCAL y5 = y4 - (dx + dy) / 2
     MOVE x1, y1
     DRAW TO x2, y2
     DRAW TO x3, y3
     DRAW TO x4, y4
     DRAW TO x1, y1
     pythagoras_tree(x4, y4, x5, y5, depth +1)
     pythagoras_tree(x5, y5, x3, y3, depth +1)
 
 END SUB
}
Pythagoras_tree

Στην κλάση CodeBlock υπάρχει αυτό:
Private Type ast
    codepos As Long
    codetype As Integer
    codehelp As Integer
    codevar As Long
End Type

Δηλαδή κάθε εγγραφή έχει 4+2+2+4 bytes, και υπάρχει βοηθητικός χώρος για τα αναγνωριστικά (γράφονται μια φορά), για αριθμούς και αλφαριθμητικά. Προς το παρόν το 5 αν υπάρχει δυο φορές θα γραφτεί δυο φορές (δεν το έχω βάλει να κάνει αναζήτηση σε πίνακα, δηλαδή ξοδεύω μνήμη, η οποία όμως έχει γρηγορότερη προσπέλαση). Ομοίως για τα αλφαριθμητικά.

Στην εμφάνιση αλλάζει κάπως:
Το πρώτο νούμερο είναι ο αριθμός του στοιχείου. Το δεύτερο είναι η θέση του στο κώδικα. Ακολουθεί το σύμβολο (μας λέει και τι είναι)

Νεότερη έκδοση!

 0 1 11 Identifier:MODULE
 1 8 161 Identifier:PYTHAGORAS_TREE
 2 25 140 START BRACKET 210
 3 24 0
 4 28 11 Identifier:CLS
 5 32 100  5 Double
 6 33 8 ,
 7 35 100  0 Double
 8 63 0
 9 67 11 Identifier:PEN
 10 71 100  14 Double
 11 83 0
 12 117 11 Identifier:LET
 13 121 161 Identifier:W
 14 123 14 =
 15 125 11 Identifier:SCALE.X
 16 132 8 ,
 17 134 161 Identifier:H
 18 136 14 =
 19 138 161 Identifier:W
 20 140 14 *
 21 142 100  11 Double
 22 145 11 Identifier:DIV
 23 149 100  16 Double
 24 150 0
 25 154 11 Identifier:LET
 26 158 161 Identifier:W2
 27 161 14 =
 28 163 161 Identifier:W
 29 165 11 Identifier:DIV
 30 169 100  2 Double
 31 170 8 ,
 32 172 161 Identifier:DIFF
 33 177 14 =
 34 179 161 Identifier:W
 35 181 11 Identifier:DIV
 36 185 100  12 Double
 37 186 0
 38 190 11 Identifier:LET
 39 194 161 Identifier:TREEORDER
 40 204 14 =
 41 206 100  6 Double
 42 206 0
 43 210 165 Identifier:PYTHAGORAS_TREE( skip to 62
 44 226 161 Identifier:W2
 45 229 14 -
 46 231 161 Identifier:DIFF
 47 235 8 ,
 48 237 161 Identifier:H
 49 239 14 -
 50 240 100  10 Double
 51 242 8 ,
 52 244 161 Identifier:W2
 53 247 14 +
 54 249 161 Identifier:DIFF
 55 253 8 ,
 56 255 161 Identifier:H
 57 257 14 -
 58 258 100  10 Double
 59 260 8 ,
 60 262 100  0 Double
 61 263 19 )
 62 263 0
 63 270 111 SUB
 64 274 165 Identifier:pythagoras_tree( skip to 75
 65 290 161 Identifier:X1
 66 292 8 ,
 67 294 161 Identifier:Y1
 68 296 8 ,
 69 298 161 Identifier:X2
 70 300 8 ,
 71 302 161 Identifier:Y2
 72 304 8 ,
 73 306 161 Identifier:DEPTH
 74 311 19 )
 75 311 0
 76 322 11 Identifier:IF
 77 325 161 Identifier:DEPTH
 78 331 14 >
 79 333 161 Identifier:TREEORDER
 80 343 11 Identifier:THEN
 81 348 11 Identifier:EXIT
 82 353 11 Identifier:SUB
 83 355 0
 84 366 11 Identifier:LOCAL
 85 372 161 Identifier:DX
 86 375 14 =
 87 377 161 Identifier:X2
 88 380 14 -
 89 382 161 Identifier:X1
 90 384 14 ,
 91 386 161 Identifier:DY
 92 389 14 =
 93 391 161 Identifier:Y1
 94 394 14 -
 95 396 161 Identifier:Y2
 96 397 0
 97 405 11 Identifier:LOCAL
 98 411 161 Identifier:X3
 99 414 14 =
 100 416 161 Identifier:X2
 101 419 14 -
 102 421 161 Identifier:DY
 103 423 14 ,
 104 425 161 Identifier:Y3
 105 428 14 =
 106 430 161 Identifier:Y2
 107 433 14 -
 108 435 161 Identifier:DX
 109 436 0
 110 444 11 Identifier:LOCAL
 111 450 161 Identifier:X4
 112 453 14 =
 113 455 161 Identifier:X1
 114 458 14 -
 115 460 161 Identifier:DY
 116 462 14 ,
 117 464 161 Identifier:Y4
 118 467 14 =
 119 469 161 Identifier:Y1
 120 472 14 -
 121 474 161 Identifier:DX
 122 475 0
 123 483 11 Identifier:LOCAL
 124 489 161 Identifier:X5
 125 492 14 =
 126 494 161 Identifier:X4
 127 497 14 +
 128 499 17 ( skip to 133
 129 500 161 Identifier:DX
 130 503 14 -
 131 505 161 Identifier:DY
 132 507 19 )
 133 509 14 /
 134 511 100  2 Double
 135 511 0
 136 519 11 Identifier:LOCAL
 137 525 161 Identifier:Y5
 138 528 14 =
 139 530 161 Identifier:Y4
 140 533 14 -
 141 535 17 ( skip to 146
 142 536 161 Identifier:DX
 143 539 14 +
 144 541 161 Identifier:DY
 145 543 19 )
 146 545 14 /
 147 547 100  2 Double
 148 547 0
 149 555 11 Identifier:MOVE
 150 560 161 Identifier:X1
 151 562 8 ,
 152 564 161 Identifier:Y1
 153 565 0
 154 573 11 Identifier:DRAW
 155 578 11 Identifier:TO
 156 581 161 Identifier:X2
 157 583 8 ,
 158 585 161 Identifier:Y2
 159 586 0
 160 594 11 Identifier:DRAW
 161 599 11 Identifier:TO
 162 602 161 Identifier:X3
 163 604 8 ,
 164 606 161 Identifier:Y3
 165 607 0
 166 615 11 Identifier:DRAW
 167 620 11 Identifier:TO
 168 623 161 Identifier:X4
 169 625 8 ,
 170 627 161 Identifier:Y4
 171 628 0
 172 636 11 Identifier:DRAW
 173 641 11 Identifier:TO
 174 644 161 Identifier:X1
 175 646 8 ,
 176 648 161 Identifier:Y1
 177 649 0
 178 657 165 Identifier:PYTHAGORAS_TREE( skip to 191
 179 673 161 Identifier:X4
 180 675 8 ,
 181 677 161 Identifier:Y4
 182 679 8 ,
 183 681 161 Identifier:X5
 184 683 8 ,
 185 685 161 Identifier:Y5
 186 687 8 ,
 187 689 161 Identifier:DEPTH
 188 695 14 +
 189 696 100  1 Double
 190 697 19 )
 191 697 0
 192 705 165 Identifier:PYTHAGORAS_TREE( skip to 205
 193 721 161 Identifier:X5
 194 723 8 ,
 195 725 161 Identifier:Y5
 196 727 8 ,
 197 729 161 Identifier:X3
 198 731 8 ,
 199 733 161 Identifier:Y3
 200 735 8 ,
 201 737 161 Identifier:DEPTH
 202 743 14 +
 203 744 100  1 Double
 204 745 19 )
 205 745 0
 206 752 11 Identifier:END
 207 756 11 Identifier:SUB
 208 758 0
 209 761 141 END BRACKET 3
 210 761 0
 211 764 161 Identifier:PYTHAGORAS_TREE
 212 778 0
Number Literals: 15
String Literals: 1
Identifiers: 36

Τρίτη 4 Ιουνίου 2019

Αντικείμενα στην Μ2000, απλό παράδειγμα.

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

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

Η πιο απλή δομή για αντικείμενα είναι ο πίνακας. Στο παράδειγμα εδώ κάνουμε χρήση πίνακα. Ειδικά η Μ2000 μπορεί να ορίζει ξανά έναν πίνακα χωρίς να διαγράφει στοιχεία, εκτός και αν τα λιγοστέψουμε, οπότε διαγράφει τα επιπλέον. Κάθε στοιχείο πίνακα μπορεί να πάρει οποιαδήποτε τιμή, έναν αριθμό, ένα αλφαριθμητικό, ένα αντικείμενο. Αν το όνομα του πίνακα έχει το $ τότε ένα Α$(3)=1000 θα βγει λάθος, όχι γιατί δεν μπορεί να γραφτεί ο αριθμός αλλά δεν το επιτρέπει αυτός ο συντακτικός τρόπος. Στο παράδειγμα που ακολουθεί φτιάχνουμε πίνακα 10 στοιχείων ως α$(). Αυτό σημαίνει ότι η Τύπωσε α$() θα πρέπει να εμφανίσει αλφαριθμητικό (αν γίνεται). Μια α$(1)="Πέτρος" θα βάλει αλφαριθμητικό στο α$(1). Οι πίνακες έχουν βάση το 0, αλλά μπορούμε να το αλλάξουμε. Πχ Πίνακας Βάση1, α$(10) θα έχουμε από 1 μέχρι 10 στοιχεία. Ενώ Πίνακας α$(2 έως 11) θα έχουμε βάση το 2 και πάλι δέκα στοιχεία (μπορούμε να δώσουμε και αρνητικούς αριθμούς). Μέγιστο διαστάσεων είναι οι δέκα διαστάσεις, ενώ ελάχιστο είναι το 0, δηλαδή καμία διάσταση.

πίνακας α$(10)
μ=α$() ' το μ είναι δείκτης στο α$()
επιστροφή μ, 3:=100
τύπωσε α$(3) ' δίνει 100 ως αλφαριθμητικό
\\ πιο γρήγορος τρόπος
α$(4):=1000
τύπωσε α$(4) ' δίνει 1000 ως αλφαριθμητικό
Ένωσε α$() στο α() ' κάνει το α() αναφορά του α$()
Τύπωσε α(3)+α(4)=1100


Περί διαστάσεων πινάκων και πως τις διαβάζουμε:
Πίνακας α(), β(0)
Τύπωσε μήκος(α())=0, διάσταση(α())=0
Τύπωσε μήκος(β())=0, διάσταση(β())=0
Πίνακας α(5), β(-2 έως 2)
Τύπωσε μήκος(α())=5, διάσταση(α())=1
Τύπωσε μήκος(β())=5, διάσταση(β())=1
Πίνακας α(2, 5), β(-1 έως 0, -2 έως 2)
Τύπωσε μήκος(α())=10, διάσταση(α())=2
Τύπωσε μήκος(β())=10, διάσταση(β())=2

Τύπωσε διάσταση(β(),1)=2, διάσταση(β(),2)=5
Τύπωσε διάσταση(β(),1,0)=-1, διάσταση(β(),1,1)=0
Τύπωσε διάσταση(β(),2,0)=-2, διάσταση(β(),2,1)=2



Περί Ομάδων

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

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

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

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

Αν δώσουμε σαν τελευταία γραμμή το Μ=Κ τότε το Μ θα γίνει ένα αντίγραφο του Κ. Σε κάποιες γλώσσες δεν έχουμε αντιγραφή αντικειμένου, αλλά αντιγραφή δεικτών. Η Μ2000 έχει και δείκτες σε αντικείμενα ομάδα, αλλά αν δεν είναι απαραίτητοι δεν τους χρησιμοποιούμε.

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

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

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

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

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

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

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

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

Ε'ιτε γράψουμε Συνάρτηση Αλφα {=Αριθμός**2}  (όπου το ** είναι η ύψωση σε δύναμη, όπως και το ^ είναι επίσης η ύψωση σε δύναμη), είτε Συνάρτηση Αλφα(χ) {=χ**2} είτε:
Συνάρτηση Αλφα {
Διάβασε χ : =χ**2
}
Είναι το ίδιο πράγμα (με τη διαφορά ότι στην πρώτη δεν θα φτιαχτεί μεταβλητή, θα διαβαστεί άμεσα ο αριθμός από το σωρό τιμών).

Αρχικοποίηση
Δεν μπορούμε να χρησιμοποιήσουμε μια μεταβλητή αν δεν έχουμε δώσει αρχική τιμή. Δεν ισχύει αυτό στους πίνακες, γιατί η αρχική τιμή τους "Empty" μεταφράζεται αυτόματα σε 0 ή "" ανάλογα με το όνομα του πίνακα (αν έχει $ στο τέλος του ονόματος είναι αλφαριθμητικό)

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

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

Ομάδα Δέλτα {
      χ=5000
      κ=2
      Τμήμα Κάππα {
            Γενική κ=100
            Τμήμα Εσωτερικό {
                  Ομάδα Αλφα {
                        χ=2
                        Συνάρτηση Βήτα (μ){
                              =**μ+κ
                        }
                        Τμήμα ΆλλαξεΧ (μ) {
                              \\ χρειάζεται το .χ είναι της ομάδας
                              <=μ
                        }
                  }
                  Τύπωσε Αλφα.Βήτα(4)=116
                  Τύπωσε Αλφα.χ=2
                  \\ γίνεται να αλλάξει γιατί το Αλφα.χ είναι μια εταβλητή τοπική στο Εσωτερικό
                  Αλφα.χ=3
                  Τύπωσε Αλφα.Βήτα(4)=181
                  Αλφα.ΆλλαξεΧ 5
                  Τύπωσε Αλφα.Βήτα(4)=725
            }
            \\ απλή κλήση
            Εσωτερικό
            \\ μέσω της Κάλεσε
            Κάλεσε Εσωτερικό
      }
}
Δέλτα.Κάππα
\\ υπάρχουν μόνο τρεις, η Δέλτα,  Δέλτα.χ και Δέλτα.κ
Λίστα 





Το παράδειγμα





Τμήμα ΔοκιμήΑ {
      \\ δεν χρειάζεται η παρακάτω, αλλά μπορούμε να την δώσουμε
      Κάνε ι ως ακέραιος, εντάξει ως λογικός
      \\ όσα μέρη μιας κλάσης είναι μετά την ετικέτα Κλάση: δεν περιέχονται στο τελικό αντικείμενο       \\ οι κλάσεις είναι συναρτήσεις (γενικές) που επιστρέφουν αντικείμενο       \\ Μια μέθοδος με το όνομα της κλάσης είναι ο κατασκευαστής, που καλείται αφού πρώτα       \\ φτιαχτεί ένα αντικείμενο με ότι έχουμε στον ορισμό.       \\ η κλήση της Ζώο() μπορεί να γίνει στο κατασκευαστή της Σκύλος() γιατί είναι γενική              \\ Οι ιδιότητες είναι ομάδες (αντικείμενα) που ετοιμάζονται με δυνατότητες όπως:       \\ επιστροφή τιμής αν υπάρχει το πεδίο Αξία. Μπορούμε να ορίσουμε το τρόπο που θα επιστρέφεται η τιμή       \\ αλλαγή τιμής αν υπάρχει το πεδίο Θέσε. Μπορούμε να ορίσουμε το τρόπο που θα διαβάζει μια τιμή       \\ Σε κάθε περίπτωση το $ χρησιμοποιείται όταν η τιμή επιστροφής ή αλλαγής είναι αλφαριθμητικό       \\ μια ιδιότητα μπορεί να έχει μεθόδους και τμήματα όπως όλα τα αντικείμενα, αλλά δεν έχει κατασκευαστή.                     \\ Στο παράδειγμα φτιάχνουμε δυο αντικείμενα τοποθετημένα σε ένα πίνακα       \\ Καλούμε διαδοχικά την τι$() συνάρτηση του κάθε αντικειμένου       \\ και το κάθε αντικείμενο καλεί την δική του συνάρτηση.                     \\ εδώ δεν έχουμε δείκτη σε αντικείμενο. Τα αντικείμενα είναι μοναδικά, και επειδή βρίσκονται σε πίνακα       \\ είναι ανώνυμα. Το κάθε αντικείμενο είναι μια κατασκευή και περιέχει ότι του έχουμε βάλει.       \\ αν δοκιμάσουμε να αλλάξουμε το όνομα$ θα πάρουμε λάθος.              \\ Θέλουμε το κάθε ζώο να έχει έναν αριθμό       \\ θα έχουμε μια γενική μεταβλητή ΑΑ και μια συνάρτηση που θα παράγει την επόμενη ΑΑ       \\ τη γενική συνάρτηση θα την καλούμε στη Ζώο() συνάρτηση (που επιστρέφει αντικείμενο)              Γενική ΑΑ=1              Συνάρτηση Γενική ΝέοςΑριθμός {             =ΑΑ             ΑΑ++       }                            Κλάση Ζώο {       Ιδιωτικό:             \\ η αρίθμηση είναι ιδιωτική, και εδώ είναι και τελική             τελική αρίθμηση=ΝέοςΑριθμός()       Δημόσιο:             \\ όλα τα αντικείμενα χρήστη είναι τύπου Ομάδα (Group)             \\ αν θέλουμε φτιάχνουμε μια μεταβλητή για να μας λέει..             \\ τι τύπος είναι για εμάς.                          \\ η τύπος$ είναι σταθερά για το αντικείμενο             τελικό τύπος$="Ζώο"             \\ ιδιότητα που δίνει μόνο τιμή, δεν δέχεται             Ιδιότητα όνομα$ {Αξία}="χωρίς όνομα"             \\ ιδιότητα που αλλάζει τιμή και δίνει τιμή             \\ το παρακάτω είναι όμοιο με το αμέσως επόμενο             \\ Ιδιότητα Κάνει$ {Αξία, Θέσε} ="Δεν έχει οριστεί"             Ιδιότητα Κάνει$ ="Δεν έχει οριστεί"             \\ αυτή η συνάρτηση δεν είναι τελική και μπορεί να αλλάξει             Συνάρτηση Τελική Ποιο$ {                   =μορφή$("Είμαι το υπ' αριθμόν {0} ζώο",.αρίθμηση)             }             Συνάρτηση Τι$ {                   ="Με λένε "+.όνομα$+" και κάνω "+Κάνει$             }       Κλάση:             Τμήμα Ζώο {                   \\ μπορούμε να θέσουμε στην ιδιωτική της ιδιότητας                   \\ μόνο  μέσα από τμήμα ή συνάρτηση του αντικειμένου                   Διάβασε .[όνομα]$, .[Κάνει]$             }       }       Κλάση Σκύλος {             Συνάρτηση Τελική Τι$ {                   ="Είμαι σκύλος και με λένε "+.όνομα$+" και κάνω "+πεζ$(.Κάνει$)             }       Κλάση:             Τμήμα Σκύλος (ονομα$) {                   \\ ήδη η Σκύλος έχει την τελική Τι$ και δεν θα την αλλάξει                   \\ παρόλο που το Ζώο() του την παρέχει                   Αυτό<=Ζώο(ονομα$,"Γαβ γαβ")             }       }       Κλάση Γάτα {             Συνάρτηση Τελική Τι$ {                   ="Είμαι γάτα και με λένε "+.όνομα$+" και κάνω "+πεζ$(.Κάνει$)       }       Κλάση:             Τμήμα Γάτα (όνομα$) {                   Αυτό<=Ζώο(όνομα$, "Νιάου νιάου")             }       }              \\ δεν δίνουμε αρχική τιμή στα στοιχεία του πίνακα       \\ η αρχική τιμή που γυρνάει η Τύπος$() είναι "Empty"       Πίνακας Βάση 1, α(2)       Τύπωσε τύπος$(α(1))="Empty"   ' Αληθές       \\ βάζουμε στα 1 και 2 από ένα αντικείμενο       α(1)=Σκύλος("Αζόρ"),Γάτα("Ψιψίνα")       \\ Τώρα ο τύπος της α(1) είναι Group (ομάδα)       Τύπωσε τύπος$(α(1))="Group"   ' Αληθές              \\Μπορούμε να καλέσουμε την τι$() από τα δυο στοιχεία του πίνακα       \\ επειδή είναι συνάρτηση βάζουμε τις παρενθέσεις παρόλο που δεν βάζουμε ορίσματα       Για ι=1 έως 2             Τύπωσε α(ι).τι$()       Επόμενο              Δες Εντάξει {             α(1).όνομα$="Μαξ"       }       \\ βγάζει λάθος, λέει ότι χρειάζεται μια ομάδα στη δεξιά έκφραση, επειδή δεν έχει οριστεί πεδίο Θέσε.       Αν όχι Εντάξει τότε Πένα 11 {τύπωσε Λάθος$}              \\ η κάνει$ είναι ιδιότητα που αλλάζει τιμή       α(1).κάνει$="Γαβ γαβ γαβ"              \\ αυξάνουμε το πίνακα κατά 1       Πίνακας α(1 εως 3)       Κλάση ΚάτιΆλλο {             τελική τύπος$="Κάτι Άλλο"       }       α(3)=ΚάτιΆλλο()              Για ι=1 έως 2             Αν α(ι).τύπος$="Ζώο" Τότε                   Τύπωσε α(ι).Ποιο$()                   Τύπωσε α(ι).τι$()             Τέλος Αν       Επόμενο              \\ πιο ωραίος κώδικας, και πιο γρήγορος, γιατί ο διερμηνευτής έχει έτοιμο το α(ι)       \\ για κάθε .κάτι που καλούμε              Για ι=1 έως 2             Για α(ι) {                   Αν .τύπος$="Ζώο" Τότε                         Τύπωσε .Ποιο$()                         Τύπωσε .τι$()                   Τέλος Αν             }       Επόμενο       \\ εδώ τελειώνει ο κώδικας       \\ οι συναρτήσεις, ο πίνακας και οι μεταβλητές Εντάξει και ι θα διαγραφούν       Βάλε α(1) } \\ Δεν χρειάζεται να ορίσουμε το Κ ως ομάδα, αλλά μπορούμε να το κάνουμε Ομάδα Κ \\ καλούμε το τμήμα ΔοκιμήΑ ΔοκιμήΑ \\ Περιμένουμε μια τιμή στο σωρό τιμών, στη κορυφή \\ αν έχουμε ομάδα τότε το ταύτιση("Ο") είναι αληθές Αν ταύτιση("Ο") τότε       Τμήμα Προσωρινό(&α) {             \\ Μπορούμε να προσθέσουμε ένα τμήμα που θα διαβάζει την αρίθμηση             \\ και επειδή η προσθήκη μπήκε στην αναφορά του Κ στο α             \\ δεν θα υπάρχει στο Κ                          \\ αυτό συμβαίνει γιατί το α έχει με αναφορά όλα τα μέλη το Κ,             \\ αλλά το α είναι διαφορετικό αντικείμενο από το Κ             \\ με αυτόν τον τρόπο, ενώ ένα αντικείμενο δεν διαγράφει μέλη             \\ μπορούμε να πάρουμε αντίγραφο με αναφορά στις τιμές             \\ και σε αυτό να φτιάξουμε νέα μέλη             \\ και στην έξοδο από το τμήμα το αντίγραφο θα διαγραφεί             \\ αλλά δεν θα διαγραφούν οι αναφερόμενες τιμές.             Ομάδα α {                   Τμήμα Δείξε_Αρίθμηση {                         Τύπωσε .αρίθμηση                   }             }             α.Δειξε_Αρίθμηση             Τύπωσε Τμήμα(α.Δείξε_Αρίθμηση)=Αληθές       }       \\ και την διαβάζουμε στη Κ (αν η Κ δεν είναι νέα και δεν είναι ομάδα βγαίνει λάθος)       Διάβασε Κ       Τύπωσε Τύπος$(Κ)="Group"       Τύπωσε Κ.τύπος$="Ζώο"  ' Αληθές       Τύπωσε Κ.Κάνει$="Γαβ γαβ γαβ"       Προσωρινό &Κ       Τύπωσε Τμήμα(Κ.Δείξε_Αρίθμηση)=Ψευδές Τέλος Αν