Παρασκευή 17 Απριλίου 2020

Αναθεώρηση 19, Έκδοση 9.9

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

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

Συνάρτηση Αλφα(χ)
      =χ**2Τέλος Συνάρτησης

Οι απλές ρουτίνες δεν μπορούν να αλλάξουν ορισμό, Οι κανονικές λειτουργούν διαφορετικά, εκτελούμε την εντολή ορισμού τους για να πάρουν κώδικα, και μπορεί αυτό να ξαναγίνει για να αλλάξουμε κώδικα. Επίσης οι απλές ρουτίνες δεν μπορούν να περαστούν με αναφορά. Επίσης ο σωρός τιμών είναι ίιδιος με αυτόν που τις καλεί ενώ οι κανονικές συναρτήσεις έχουν αυτήν την ιδιότητα μόνο όταν τις καλούμε με την Κάλεσε σαν τμήματα. Οι απλές συναρτήσεις δεν μπορούν να κληθούν με την Κάλεσε. Επίσης οι απλές συναρτήσεις βλέπουν οτιδήποτε έχει ένα τμήμα ή συνάρτηση στην οποία την καλούμε. Για το λόφο αυτό πρέπει να φριάχνουμε τοπικές μεταβλητές και πίνακες με την Τοπική ή Τοπικές. Επίσης όπως οι κανονικές συναρτήσεις τα ονόματα τψν απλών συναρτήσεων μπορούν να έχουν το % για επιστροφή ακέραιαςτιμή και το $ για επιστροφή αλφαριθμητικού. Μπορούμε να επιστρέφουμε δυο ή περισσότερες τιμές αλλά η πρώτη τιμή θα πρέπει να είναι αριθμός ή αλφαριθμητικό όπως λέει το όνομα, αλλιώς μπορούμε να γυρίσουμε έναν αυτόματο πίνακα με παρενθέσεις. Έτσι το =1,2,3 δίνει ένα αυτόματο πίνακα όπως και το =(1,2,3) . Για μια τιμή μποορούμε να δώσουμε αυτό =(1,) για να πάρουμε αυτόματο πίνακα (tuple). Ενώ οι συναρτήσεις έχουν δικό τους σκοπό (όνομα χώρου), οι απλές συνατρτήσιες όπως και οι ρουτίνες λειτοργούν με το όνομα χώρου αυτού που τις καλεί, Για το λόγο αυτό δεν μπορούν να έχουν δικές τους στατικές (θα ανοίκουν στο τμήμα ή την συνάρτηση που τις καλεί)

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


Module Alfa {
      Print @alfa(100) ' 200
      Function alfa(x)
            =x*2
      End Function
}
Module Beta {
      static M=10
      Print @alfa(M), ' 20 18 16 14 12 10 8 6 4
      M--
      If M>1 then Call Beta Else Print
      Clear ' clear static
}
Alfa
Beta
Beta

Παρασκευή 3 Απριλίου 2020

Revision 18, Version 9.9

This revision has a new manual in Greek language, a newer dat file for Help, plus some fixes. Also there are some new programs in info.gsb (a file with many modules - programs in M2000). One of them is the MAKEHELP which read Help2000.mdb and make the dat file. There are two manuals, one in English language M2000paper.pdf and the other in Greek language GreekManual.pdf. These manuals are not equivalent. The Greek one is bigger and have pictures and have all programs with identifiers from Greek vocabulary. Also there is a module in info, EXPORTHELPNEW which we can export the help file (~270 pages for Greek language and another ~270 pages for English language, about 574 topics each).
Now M2000language.exe, the installation file, is bigger (about 12.5MB).from the previous one (3.5MB).

After installation, tun the M2000.exe file and write these statements:
Dir appdir$
Load info
The info file load, run, display information and programming the function keys. A list of function keys displayed. F3 return to the first page.
Press F1 to save the info file to the user directory, and automatic the current directory return toy User.

You can open explorer the user directory with a simple statement:
Win Dir$
Statement Win (Windows means) is like the start of Windows. If we pass argument a file (with path) the file open in default application for its type.
For virtual keyboard give the statement: Keyboard !
you can change the size of displayed letters: Press F2 which open the info module and find the first FORM statement. You can erase the ! symbol which leave a bigger border (for save view from TV). Press Esc to exit from editor and press F3 to run it again. (also press F1 to save the changes toy User directory)

To open application directory use the statement Win appdir$
Symbol ? is the same as Print. so for calculations use ? 2+4, 5*3
The operators ** and ^ are for power. Use Help operators to see the embedded help
Use Help All to see all the topics in English, and use BΟΗΘΕΙΑ ΟΛΑ for the same in Greek language.

See the DEMO1 module, press F5 to run it (or type DEMO1 to run it), is GUI program with a rotated  3D wire object, which use threads, one for computing new position and another for displaying.

CS is an editor written in M2000 for C#, with syntax color and menu with compile and run command. (You can choose 3.5 or 4 Net, or any other).

Have fun

George Karras




Τρίτη 31 Μαρτίου 2020

Τυπική Απόκλιση Δειγμάτων

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

Τοι πρόγραμμα το γράφουμε σε ένα τμήμα έστω Α (Σ Α enter και αντιγράφουμε, μετά πατάμε το Esc και επιστρέφουμε στην γραμμή εντολών και γράφουμε Α enter και έτσι το εκτελούμε)

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

Εξ ορισμού μια τιμή 1 είναι τύπου double, δεν χρειάζεται να βάλουμε το 1.0 τιμές άλλων τύπων έχουν χαρακτήρες όπως πχ το # για τιμή τύπου λογιστικό (Currency) έτσι το 10.45# είναι λογιστικό.

Το ΔΙΑ είναι η ακέραια διαίρεση, όχι ειδικά για ακέραιους, και επιστρέφει τιμή
πχ το μ είναι Single (αν είχαμε δώσει 10~ δια 2 θα ήταν double, αλλά τώρα και οι δυο αριθμοί είναι single). Οι συγκρίσεις γυρίζουν boolean, και εδώ συγκρίνουμε έναν single με έναν double.
μ=10~ δια 2~
Τύπωσε  Τύπος$(μ)="Single", μ=5

Επίσης το ΔΙΑ στο 10 ΔΙΑ 2.5 δίνει 4, όπως και στο 11 ΔΙΑ 2.5 δίνει 4 και το 11 ΥΠΟΛ 2.5 δίνει 1.
,
Το Μήκος(Δείκτης) δίνει τον αριθμό στοιχείων του πίνακα που δείχνει ο Δείκτης (τον βλέπει ως μιας διάστασης ακόμα και αν είχε περισσότερες ή γυρίζει 0 αν δεν έχει κανένα στοιχείο)

Η Δείγμα#Αθρ() βγάζει άμεσα το άθροισμα όλων των στοιχείων στο πίνακα.
Το κ=Κάθε(Δείγμα) φτιάχνει το κ ως απαριθμητής του πίνακα που δείχνει η μεταβλητή Δείγμα. Για να λειτουργήσει η κ πρέπει να μπει σε μια Ενώ. Όταν φθάσει στο τέλος απαρίθμησης δίνει ψευδές οπότε η Ενώ τερματίζει (όπως η ΟΣΟ στη ΓΛΩΣΣΑ του σχολείου). Μπορούμε με το κ^ να πάρουμε το νούμερο απαρίθμησης (το κ είναι αντικείμενο οπότε το ^ εδώ δεν είναι η ύψωση σε δύναμη, αλλά τελεστής του αντικειμένου). Εδώ θα πάρουμε την τιμή με την Πίνακας(α). Η Πίνακας(Δείγμα) δίνει το πρώτο (στοιχείο στο  0) ενώ το Πίνακας(Δείγμα, 1) δίνει το 1, αλλά η Πίνακας() όταν βλέπει ότι έχει να κάνει με απαριθμητή πίνακα παίρνει το νούμερο από τον απαριθμητή. Δείτε στην ρουτίνα πιο κάτω ότι το ΑΠ που είναι δείκτης σε πίνακα όπως το Δείκτης. Εκεί το ΑΠ#Τιμή(0) είναι το ίδιο με το Πίνακας(ΑΠ) ενώ το ΑΠ#Τιμή(1) είναι το Πίνακας(ΑΠ,1). Και για τιμές αλφαριθμητικών έχουμε τα αντίστοιχα #Τιμή$() και Πίνακας$().



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


Συνάρτηση Υπολογισμός_Τυπικής_Απόκλισης (Δείγμα) {
      Αν Μήκος(Δείγμα)<2 τότε Λάθος "Αριθμός δειγμάτων μικρότερος του 2"
      Μέσος_Όρος=Δείγμα#Αθρ()/Μήκος(Δείγμα)
      Τ_Απόκλιση=0
      κ=κάθε(Δείγμα)
      Ενώ κ {
            Τ_Απόκλιση+=(Πίνακας(κ)-Μέσος_Όρος)**2
      }
      Τ_Απόκλιση/=Μήκος(Δείγμα)-1
      Τ_Απόκλιση=Ρίζα(Τ_Απόκλιση)
      =Τ_Απόκλιση,Μέσος_Όρος, Δείγμα#Μικ(), Δείγμα#Μεγ()
}


\\ η απαρίθμηση είναι σταθερές με μια "συνέχεια" προηγούμενου-επόμενου
\\ εδώ λειτουργούν απλά σαν σταθερές με τιμές 0,1,2,3
\\ και τις βάζουμε στον πίνακα που μας επιστρέφει η συνάρτηση
\\ Υπολογισμός_Τυπικής_Απόκλισης()


Απαρ Τιμές {Απόκλιση=0, Μέση, Ελάχιστη, Μέγιστη}


\\ αρχικά αδειάζουμε το σωρό τιμών
Άδειασε
\\ χρήση σωρού τιμών ως FIFO
\\ Βάζουμε τέσσερα πράγματα, αλφαριθμητικό, δείκτης σε πίνακα, αλφαριθμητικό, δείκτης σε πίνακα
Σειρά "Γυναίκες", (727.7, 1086.5, 1091, 1361.3,1490.5,1956.1)
Σειρά "Άνδρες", (525.8, 605.7, 843.3, 1195.5, 1945.6, 2135.6, 2308.7, 2950.0)
Σημ Σωρός \\ δείχνει τι έχει ο σωρός, στους πίνακες δίνει το *[mArray] όπου το * λέει δείκτης, και το mArray είναι το αντικείμενο πίνακας. Βγάλτε το Σημ η πατήστε ένα enter ώστε να κατέβει γραμμή η Σωρός.


\\ όσο ο σωρός δεν είναι κενός θα καλούμε το ΔείξεΤιμές()
Ενώ όχι κενό
    ΔείξεΤιμές() ' ήδη είναι στο σωρό τιμών τα δεδομένα
Τέλος Ενώ
Τέλος


Ρουτίνα ΔείξεΤιμές(Κειμ$, Απ)
    Απ=Υπολογισμός_Τυπικής_Απόκλισης(Απ)
    \\ χωρίζουμε την οθόνη σε τέσσερις στήλες
    Τοπική Πλ=Πλάτος Δια 4
    Τύπωσε Πάνω $(6), Κειμ$ ' κεντραρισμένο σε όλο το πλάτος
    Τύπωσε Υπό ' υπογράμμιση
    \\ κεντραρισμένοι τίτλοι στις στήλες με αναλογική γραφή
    Τύπωσε $(6,ΠΛ),"Τυπική Ελάχιστη","Μέση Τιμή", "Τυπική Μέγιστη","Τυπική Απόκλιση"
    Τύπωσε $("#.00"),$(0),Απ#Τιμή(Μέση)-Απ#Τιμή(Απόκλιση), Απ#Τιμή(Μέση), Απ#Τιμή(Μέση)+Απ#Τιμή(Απόκλιση), Απ#Τιμή(Απόκλιση)
    Τύπωσε $(6), "Ελάχιστη Τιμή","Μέση Τιμή","Μέγιστη Τιμή"
    \\ επαναφέρουμε τη στρογγύλευση στο αρχικό με το $("") και το απαραίτητο διπλό κόμα.
    Τύπωσε $(0),Απ#Τιμή(Ελάχιστη), Απ#Τιμή(Μέση), Απ#Τιμή(Μέγιστη)
    Τύπωσε $("")
    Τύπωσε
Τέλος Ρουτίνας


Revision 17, Version 9.9

From revision 18 change the file. slight. Instead of use of "'" now use "!" for accurate search operation.  Inside info there is a module name MAKEHELP with the updated version.
Also there is an EXPORTHELPNEW which export Greek or English help (ask to press G pr E). First import to a 2D array and make a sort on columns using first key on groups and second key on identifiers.

The mEditor in Info which is a GUI editor for M2000 programs, use two EditBoxes, one for editing the code and another for viewing topics from help.So the program updated to use either of help files, mdb and dat (the dat file is a text file in UTF8 format, where the memo field is one line using escape codes like \c\n for CRLF)


New Help File. (Not used any more, see above)
 greek$="\"+ALL(i)#val$(0)+"'"+str$(ALL(i)#val(3),"")+
 english$="\"+ALL(i)#val$(2)+"'"+str$(ALL(i)#val(3),"")+
change to that (check the ! char)
 greek$="\"+ALL(i)#val$(0)+"!"+str$(ALL(i)#val(3),"")+
 english$="\"+ALL(i)#val$(2)+"!"+str$(ALL(i)#val(3),"")+


We can use the mdb (Access 2007 file)  using switch "+mdb". By default now Interpreter use a dat file, A utf8 file including all help base, only for reading.

We can make the dat file from mdb using this program. To work this program we have to copy Help2000.mdb ro user folder (open with the statement Win Dir$) We get the export to the same folder


Module MakeHelp {
 pen 14 : cls 5
 flush
 \\DIR APPDIR$ \\  from installation folder use this
 Retrieve "HELP2000","GROUP", 1,"",""
 Read many
 Flush
 Dim Labels$(1 to 25), ser(1 to many)
 For i=1 to many
 Retrieve "HELP2000","GROUP", i,"",""
 drop
 Read where, Labels$(where)
 ser(i)=where
 flush
 next i
 Retrieve  "HELP2000", "SELECT * FROM COMMANDS",1,"",""
 Read many
 dim ALL(1 to many)
 Document infoGr$, Info$, greek$, english$
 br$={__<ENG>__
 }
 nl$=string$({
 } as json )
 p1=1
 for i=1 to many
 Retrieve  "HELP2000", "SELECT * FROM COMMANDS",i,"",""
 drop
 ALL(i)=Array([])
 Print ALL(i)#val$(2), rightpart$(Labels$(ALL(i)#val(3)), ","+chr$(160))
 Print ALL(i)#val$(0), leftpart$(Labels$(ALL(i)#val(3)), ","+chr$(160))
 greek$="\"+ALL(i)#val$(0)+"'"+str$(ALL(i)#val(3),"")+{
 }
 english$="\"+ALL(i)#val$(2)+"'"+str$(ALL(i)#val(3),"")+"-"+Str$(i)
 if i<many then
  english$={
  }
 end if
 infoone$="GR:"+ALL(i)#val$(0)+nl$+string$(rightpart$(ALL(i)#val$(1), br$) as json)
 info$=infoone$+{
 }
 infoone$="EN:"+ALL(i)#val$(2)+nl$+string$(leftpart$(ALL(i)#val$(1), br$) as json)
 infoGR$=infoone$+{
 }
 next
 Method english$, "SetLocaleCompare", 1033
 Method english$, "SetBinaryCompare"
 Sort english$
 Dir User   \\ open this using Win Dir$
 open "Help2000.dat" for wide output as #k
 Print #k, Len(Labels$())
 for i=1 to len(Labels$())
  Print #k, Labels$(i)
 next i
 Print #k, Many
 Print #k, infoGr$;info$;greek$;english$
 close #k
 clear
 Document ALL$, all1$
 Load.doc ALL$, "help2000.dat"
 print filelen("help2000.dat")
 save.doc all$,"help2000utf8.dat", 2   ' utf-9
 print filelen("help2000utf8.dat")
}
MakeHelp


We can also read the file using M2000 code

also here change
   Print leftpart$(Ret$,"'")
   lbl=Val(Rightpart$(Ret$,"'"))
to

   Print leftpart$(Ret$,"!")
   lbl=Val(Rightpart$(Ret$,"!"))

The search is serial but very fast. We can find with little letters. eg THR  return THREAD. We can use it for Greek and English identifiers. Write ALL to get all the identifiers.

Module ReadHelp {
 flush
 Document ALL$
 Load.doc ALL$, "help2000utf8.dat"
 A=Val(paragraph$(ALL$, 1))
 B=Val(paragraph$(ALL$, 2+A))
 Find ALL$, paragraph$(ALL$,2+A+1+2*B)
 Read where, no_par, bb
 Find ALL$, paragraph$(ALL$,2+A+1+3*B), where
 drop : read no_par2
 flush
 do
  Input "give a name OR - TO EXIT:", aName$
  if aName$="-" then exit
  if aName$="" then continue
  Find ALL$, "\"+ucase$(aName$), where
  Read Where1
  if Where1>0 then
   read  There : drop
   Ret$=mid$( Paragraph$(ALL$, There), 2)
   Print Ret$
   Print leftpart$(Ret$,"'")
   lbl=Val(Rightpart$(Ret$,"'"))
   info=Val(Rightpart$(Ret$,"-"))
   if info=0 then
    Print lbl
    Print LeftPart$(Paragraph$(All$,lbl+1), ", ")
    Report format$(paragraph$(ALL$,2+A+1+There-no_par))
   else
    Print lbl, info
    Print RightPart$(Paragraph$(All$,lbl+1), ", ")
    Report format$(paragraph$(ALL$,2+A+B+info))
   end if
  end if
  flush
 Always
}
ReadHelp

Installation file now has this file help2000utf8.dat and not Help2000.mdb. You can find mdb file in Github here https://github.com/M2000Interpreter/Version9/blob/master/help2000.mdb

Σάββατο 28 Μαρτίου 2020

Revsion 16, Version 9.9

1, A serious bug in Sort() function for tuple removed.
2. Another bug in For object {} structure also removed
3. Some light optimizations.
4. Updated Info.gsb. Added PHILO (Dining Philoshophers, an example using threads), and  COLUMNSSORT (Example for sorting 2D arrays for a range of rows using series of columns as keys and choosing ascending or descending type for each key a different one)
5. Updated M2000paper.pdf
6. Installation file M2000language.exe now make a group M2000 in programs, with M2000 for the interpreter, Documentation (shiw M2000paper.pdf) and Readme.(show Readme.txt). So the M2000language.exe install the M2000paper.pdf (zipped together with all parts of the language, like m2000.exe and m2000.dll and the help2000.mdb)

M2000language.exe can be found in Dropbox (see the links in the right top column - in tablet change view to desktop to see the columns)

Or open Μ2000paper.pdf  the same as the one in M2000language.exe

Παρασκευή 27 Μαρτίου 2020

Revision 15, Version 9.9

In this revision

1. A minor fix for Main.Task structure
2. A new installation file with M2000paper.pdf. This is in Github with source code and also is in M2000language.exe so when you install the environment you have in start menu a folder with Documentation (this paper) and M2000 (the m2000.exe)

The M2000 paper is a 200+ pages for M2000 language for learning the basics of the language.

Πέμπτη 26 Μαρτίου 2020

Revision 14, Version 9.9

A bug which crach the M2000 environment at last removed.

See the case on the previous revisions:::
Run m2000.exe
Write Help All   (supposed you have installed the Access2007 runtime)
Write Edit a
Write anything in the module a and press Esc
now close the Help form
Write new
You get the crash, because the new statement check that you have changes on modules and try to open the msgbox and this give a crash

The same can be done when you load a program, make some changes and then press ctrl+A to save it, if you use help before.

So the solution found to be the loading/unloading the M2000 msgbox form  (hidden from user) at the intitialization stage.