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

Revision 17, Version 9.9

New Help File.
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

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 https://github.com/M2000Interpreter/Version9 where you find the M2000paper.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.



Σάββατο, 21 Μαρτίου 2020

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

Σε αυτήν την έκδοση διορθώθηκε ένα αντικείμενο Mutex ή Μοναδικό το οποίο κρατέι μια λίστα μοναδικών αντικειμένων στο λειτουργικό σύστημα, όπου μόνο ένα πρόγραμμα μπορεί να έχει την ιδιοκτησία του. Με αυτό το τρόπο στο παρεχόμενο info.gsb (στο αρχείο εγκατάστασης) υπάρχει το CLOCK το οποίο ελέγχει αν τρέχει ένα ρολόι με χρήση mutex, και αν ήδη τρέχει τότε το πρόγραμμα (Το τμήμα δηλαδή Clock) τερματίζει (για να μην τρέξει και δεύτερη φορά). Όταν γράφουμε CLOCK εκτελείται το CLOCK1 το οποίο ανοίγει δεύτερο m2000.exe και κάνει τα μαγικά του για να τρέξει εκεί το CLOCK (και εκεί κοιτάει αν ήδη τρέχει οπότε τερματίζει πριν μας δείξει το ρολόι).

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

Στο info.gsb μπήκε και το OOP2, που δείχνει ότι το OOP1 δηλαδή πως φτιάχνουμε με προγραμματισμό με αντικείμενα υποδομή για γεγονότα (το OOP1 είχα φτιάξει πριν φτιάξω το αντικείμενο Γεγονός και ότι άλλο έφερε μετά αυτό, όπως το γραφικό σύστημα διεπαφής χρήστη GUI). Στο OOP2 αλλάζουμε το σχεδιασμό των αντικειμένων ώστε να έχουμε ένα κοινό αντικείμενο το οποίο να κληρονομεί άλλα δύο (όπου στο OOP1 τα δυο αυτά δεν έχουν κοινό πρόγονο, αλλά έχουν ακριβώς την ίδια χρήση, με ίδιο σχεδιασμό στο 90% χοντρικά θα λέγαμε).

Μπήκε το Conv2 το πρόγραμμα για την μετατροπή βάσης.

Ανέβηκε μια πιο βελτιωμένη έκδοση του μικρού εγχειριδίου (με ημερομηνία 21/3/2020). Μπήκαν νέα παραδείγματα και μια επεξήγηση για τα περάσματα με αναφορά,.
Ένα από τα παραδείγματα είναι το Textout στα ελληνικά. Το πρόγραμμα στα αγγλικά υπάρχει στο info.gsb και δείχνει πως δείχνουμε κείμενο ενώ ταυτόχρονα το προφέρει το σύστημα ομιλίας.

Αυτή την εποχή έχω χρόνο (είμαι ήδη μια εβδομάδα μέσα στο σπίτι λόγω της επιδημίας του κορονοϊού)

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

Λόγω καραντίνας λοιπόν θα υπάρξει χρόνος να ασχοληθεί κανείς με την Μ2000.

Καλή Καραντίνα σε όλους



Δευτέρα, 16 Μαρτίου 2020

Base Conversion an Example

First publish here in Rosettacode.org

The code is very compact. We use here ** for power (also ^ can be used for power).
M2000 is like Basic, but with advance constructions like lambda functions. Each lambda function return not a lambda but the result of a new lambda (see the immediate call using (m) and (m$) after the block {} in each lambda. The closures z$ and b are there for each recursive call.


Module Checkit {
 k$=lambda$ (m, b as integer=16) -> {
  if b<2 or b>16 then error "base out of range"
  if m=0 then ="0" : exit
  z$="0123456789ABCDEF" 
  =lambda$ z$, b (m) ->{
   =if$(m=0->"", lambda$(m div b)+mid$(z$, m mod b + 1, 1))
  }(m)
 }
 k=lambda (m$, b as integer=16) -> {
  if b<2 or b>16 then error "base out of range"
  m$=trim$(m$)
  if m$="0" then =0 : exit
  z$="0123456789ABCDEF" 
  =lambda z$, b (m$) ->{
   =if(Len(m$)=0->0, lambda(mid$(m$,2))+(instr(z$, left$(m$,1))-1)*b**(len(m$)-1))
  }(m$)
 }
 Print k$(0)="0", k("0")=0
 Print k$(65535)="FFFF", k("FFFF", 16)=65535
 Print k$(0xF00F)="F00F", k("F00F", 16)=0xF00F
 Print k$(0xFFFFFFFF)="FFFFFFFF", k("FFFFFFFF", 16)=0xFFFFFFFF
 Print k$(100, 8)="144", k("144", 8)=100
 Print k$(100, 2)="1100100", k("1100100", 2)=100
}
Checkit

Κυριακή, 15 Μαρτίου 2020

Open a form after closing from unload button

This is an example of how we use a form, here with a handler as SIMPLE, to pass it to three modules, Inner, Inner1 and Inner2. Each module open the form, and when we close it using the unload button on the header of the form we make a fake unload using the Unload event, which handle the visible property to hide the form.

The Inner module get a copy of the window handler. This copy can't be used to make a linked property.

Why that happen ? Is the way M2000 interpreter internal window manager work. Only one real reference to a form exist. This means that when the module CheckIt exit, this reference released, and the form unloaded. The same done when we place a Nothing. When we click on unload button, an unload happen except we cancel it using the true as value to the first by reference variable at unload event. All events called in the same module we make the form and they have the name of the declaration, here the SIMPLE, here the simple.unload function is the service routine for the event. The call is a local type, which means that inside code in function Sumple.Unload we have the visibility of module checkit, so we can see the visible property.

So in Inner module we open the form as modal, using the m2000 internal window manager for modal windows. When we click on unload button, the modal loop exit, but the form not unload, but hide.

When we call the Inner1 we pass the Simple by reference, so we can make a visible property. Now we use a simple loop on visible property to make it like a modal (but a modal type to show also lock the under the form forms).

When we call the Inner2 we pass the Simple and the Visible both by reference.

Although the name of form inside Inner, Inner1 and Inner2 is That, the actual form has the name Simple and a prefix, as a weak reference to use it to call events. Also has a list for those events that aren't servising. This list erased and make it again if the form loose the focus.

If we male a fault in code, the module's stop working and all the variables erased, so the form unload, because the form's handler always is one. The visible property never hold a reference to form, but a reference to where Simple reference, the real reference which is only one.


Module CheckIt {
      \\ Simple is a first class object
      Declare Simple Form
      \\ we can define form before open
      Layer Simple {
            \\ center Window with 12pt font, 12000 twips width and 6000 twips height
            \\ ; at the end command to center the form in current screen
            Window 12, 12000, 6000;
            \\ make layer gray and split screen 0
            Cls #333333, 0
            \\   set split screen to 3rd line, like Cls ,2 without clear screen
            Scroll Split 2
            Cursor 0, 2
      }
      With Simple, "Title", "Hello Form", "visible" as visible
      \\ Without handling the unload event, a form unload for good
      \\ So we have to cancel the unload event and make the form non visible
      Function Simple.Unload {
            Read New &cancel
            visible=False
            cancel=true
      }
      Function Simple.Click {
            Layer Simple {
                  \\ open msgbox
                  Print Ask("Hello World")
                  Refresh
            }
      }
      Module Inner (That) {
            \\ open as modal  - also we handle the Unload event
            Method That, "Show", 1
      }
      Module Inner1 (&That) {
            \\ we can produce a linked property if we pass by reference
            \\ so &That make That same as Simple
            \\ if we pass by value we get an error "Can't Get Property"
            With That, "visible" as visible
            Method That, "Show"
            do
                  wait 1
            until not visible
      }
      Module Inner2 (&That, &thatToo) {
            Method That, "Show"
            do
                  wait 1
            until not thatToo
      }
      Inner Simple
      wait 1000
      Print "ok"

      Refresh
      Inner1 &Simple
      wait 1000
      Print "ok"

      Refresh
      Inner2 &Simple, &visible
      \\ now form deleted
      \\ Make the Simple as Nothing the form unloaded if not unloaded,
      \\ without an unload event.
      Declare Simple Nothing
}
CheckIt