Πέμπτη 23 Ιουλίου 2015

Χειρισμός του Word από την Μ2000

Αισίως είμαστε στην έκδοση 8 αναθεώρηση 11.
Με την συμπλήρωση των εντολών για χειρισμό αντικειμένων όπως το Word.Application η M2000 ολοκληρώθηκε. Κάποιοι έλεγχοι επιβάλλονται ακόμα και έτσι ίσως προκύψει κάποια αναθεώρηση.

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

Το πρόγραμμα αυτό μπορούμε να το γράψουμε στη Μ2000 σε ένα τμήμα π.χ. συγγραφή Α (ή σ Α) και μετά τρέχει με το όνομα μόνο  (στο σήμα εισόδου >_ γράφουμε το Α και πατάμε Enter)
Θα δείτε να χρησιμοποιώ το μπλοκ ελέγχου Δες {} για να σταματήσω τυχόν λάθη, πχ μπορεί κάποιος να κλείσει το Word...οπότε οι εντολές πάνε στο πουθενά...

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

Δείτε πως ορίζω ένα νέο έγγραφο στο Word, με την
 Μέθοδος  Κείμενα, "add", "", DocumentType:=WdNewWebPage ως έγγραφο1
Το Κείμενα είναι αντικείμενο που ορίσαμε ως Word.Application.Documents  (δες τις δυο πρώτες εντολές, ακολούθησε το σύνδεσμο για να δεις πληροφορίες για το αντικείμενο Documents). Το "add" είναι μέθοδος, η πρώτη παράμετρος είναι το πρότυπο, εδώ δίνουμε το κενό, θα μπορούσαμε να το παραλείψουμε αλλά το έχουμε απλά για να δούμε ότι λειτουργεί, και μετά έχουμε ένα πέρασμα με όνομα, τον τύπο του εγγράφου. Τέλος την εξαγωγή της μεθόδου την γράφουμε στο έγγραφο1 και είναι αντικείμενο τύπου Document. Μπορούμε να δούμε πάντα τον τύπο μιας μεταβλητής με την τύπος$(έγγραφο1).  Το χρώμα στο κώδικα το έβαλα απλά για να διαβάζεται πιο εύκολα...δεν χρειάζεται για κάτι άλλο!

Όρισε γενικό Επεξεργαστής "Word.Application"
Όρισε γενικό Κείμενα με Επεξεργαστής, "Documents"
Γενικό wdDoNotSaveChanges=0
Γενικό WdNewBlankDocument = 0 \\Blank document
Γενικό WdNewEmailMessage = 2 \\E-mail message
Γενικό WdNewFrameset = 3 \\Frameset
Γενικό WdNewWebPage = 1 \\Web page
Γενικό WdNewXMLDocument = 4 \\XML document


\\ θα βάλουμε σε ένα τμήμα τις άλλες εντολές για να δούμε αν
\\ λειτουργούν οι γενικές μεταβλητές (έχουν εμβέλεια παντού)

Τμήμα ΈναΌνομα {
      Με Επεξεργαστής, "visible" ως είναι_φανερό
      Δες ok {
            είναι_φανερό=αληθές
      }
      α$=Κομ$
            Δες {
            Με Επεξεργαστής, "top",100,"left",0
            Δες ok_doc { Μέθοδος Κείμενα, "add", "", DocumentType:=WdNewWebPage ως έγγραφο1 }
            Αν όχι ok_doc Τότε Τύπωσε "Δεν έφτιαξα έγγραφο" : Έξοδος
            Μέθοδος έγγραφο1, "activate"
            Όρισε γενικό επιλογή_κειμένου με Επεξεργαστής, "selection"
            Μέθοδος επιλογή_κειμένου, "TypeText", "Αυτό είναι κείμενο γραμμένο στο Word από την M2000"
            α$=Κομ$
            Δες σώθηκε { Μέθοδος έγγραφο1,"close" }
            Αν δεν σώθηκε Τότε {
                  Τύπωσε "Το έγγραφο δεν σώθηκε, πάτα ένα πλήκτρο"
                  Ανανέωση
                  α$=Κομ$
                  Μέθοδος έγγραφο1,"close", SaveChanges:=wdDoNotSaveChanges \\κλείσιμο χωρίς σώσιμο!
            }
            Άδειασε Λάθος
       }
      \\ Εδώ κρύβουμε το Word
      Αν ok Τότε {Δες { είναι_φανερό=ψευδές }}
      Δες { Όρισε έγγραφο1 τίποτα }
      Δες { Όρισε επιλογή_κειμένου τίποτα }
}
ΈναΌνομα
Αναμονή 10
Δες {
Όρισε Κείμενα τίποτα 


Μέθοδος Επεξεργαστής, "quit"


Όρισε Επεξεργαστής τίποτα
}

Γιώργος Καρράς


Τετάρτη 15 Ιουλίου 2015

Σε λίγες μέρες...η όγδοη έκδοση της Μ2000

Ευχάριστα νέα για σήμερα.
Επιτέλους η Μ2000 αναβαθμίστηκε με κλάσεις και αντικείμενα (ομάδες λέγονται στη γλώσσα).
Παράδειγμα

Φόρμα 40,25 \\40Χ25
Κλάση Αλφα {
       Χ=10, Υ, Α$="Όνομα"
       Τμήμα Αλφα {
             Αν ταύτιση("NN") Τότε Διάβασε .Χ , .Υ
      }
       Τμήμα Νέο.Όνομα {
             Διάβασε .Α$
       }
       Συνάρτηση Νέο.Όνομα$ {
             =.Α$
       }
       Συνάρτηση Ένα { = .Χ**2+.Υ}
}
Κάπα=Αλφα() \\ κατασκευάζουμε το αντικείμενο χωρίς παραμέτρους
Κάπα.Υ=20
Τύπωσε Κάπα.Ένα()
Βήτα=Αλφα(10,20) \\ εδώ με παραμέτρους
Τύπωσε Βήτα.Ενα()
Για Βήτα {
       Τύπωσε .Χ, .Υ, .Α$, .Ενα()
}
Λάμδα=Κάπα \\ αντιγραφή αντικειμένου
Για Λάμδα {
       .Χ-=5
       .Νέο.Όνομα "Λάμδα"
       Τύπωσε .Νέο.Όνομα$(), .Ένα()
}

Τα αντικείμενα μπορούν να περάσουν με τιμή (ως αντίγραφα) ή με αναφορά σε τμήματα και συναρτήσεις.
Η Άλφα() ή Άλφα(10,20) επιστρέφει ένα αντικείμενο. Οι συναρτήσεις στην νέα έκδοση επιστρέφουν αντικείμενα αλλά και πίνακες. Μπορούμε να αντιγράψουμε ένα πίνακα σε ένα άλλο! Μπορούμε να περάσουμε σε συναρτήσεις και τμήματα πίνακα με τιμή δηλαδή αντίγραφο του πίνακα.
Επιπλέον μπορούμε να περάσουμε με αναφορά συναρτήσεις!

Κάνε α(Χ,Υ)=Χ**2+Υ
Κάνε β(Χ,Υ)=Χ**3+Υ*5+10
Τύπωσε α(10,20), β(10,20)


Τμήμα Μι {
       Διάβασε &κάτι() \\ διαβάζουμε τη συνάρτηση
      Τύπωσε κάτι(100,200)
}
Μι &α() \\ καλούμε με πέρασμα συνάρτησης
Μι &β()

Φτιάχτηκε μέχρι και σύστημα να βλέπει κανείς το πρόγραμμα καθώς εκτελείται:

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

Αυτή την εποχή γράφω την αγγλική έκδοση του M2000 Language Definition και θα δημοσιεύσω τον κώδικα μόλις τελειώσει και το κείμενο και τυχόν διορθώσεις εμπλουτισμοί.
Μια αναθεώρηση του κώδικα της 8ης έκδοσης υπάρχει εδώ

Μισοτελειωμένο το Language Definition (Θα το κάνω στα Ελληνικά με τις Ελληνικές εντολές - η Μ2000 έχει όλες τις εντολές και στις δυο γλώσσες, Αγγλικά και Ελληνικά)

Σε αναμονή λοιπόν της τελικής έκδοσης 8 της Μ2000

Δευτέρα 8 Ιουνίου 2015

Ρυθμίσεις Περιβάλλοντος Μ2000

Μπορούμε να σώσουμε ρυθμίσεις ώστε κάθε φορά που ξεκινάμε το περιβάλλον είτε από την γραμμή εκκίνησης m2000 είτε μετο πλήκτρο break μέσα από το περιβάλλον που κάνει επανεκκίνηση (του περιβάλλοντος, όχι του υπολογιστή).
Στην είσοδο εντολών όπου βγαίνει αυτό το σημάδι ">" ή στο Command promp στα αγγλικα γράφουμε ρυθμίσεις ή settings

>ρυθμίσεις


Στη φωτογραφία φαίνονται οι ρυθμίσεις που έκανα σε υπολογιστή που μόλις πέρασα τα Windows 7. Η φόρμα μπορεί να αλλάζει μέγεθος και την έχω μεγαλώσει για να φαίνεται!

Ξέχασα να γράψω το πώς κλείνουμε το περιβάλλον.

>Τέλος

Τέλος ή End για να κλείσουμε ή από το  εικονίδιο στην γραμμή εργασιών (taskbar) όπου υπάρχει η επιλογή close window.

>Σ Α
γράφουμε στο Α
Τίτλος "George", 0
Αναμονή 1000
Τίτλος "George", 1
και πατάμε Esc για να βγούμε από το διορθωτή. Γράφουμε Α για να τρέξει το πρόγραμμα.
Α
Τώρα το πρόγραμμα χάνεται για ένα δευτερόλεπτο και ξαναεμφανίζεται, παράλληλα εμφανίζεται το όνομα George ως τίτλος της "εφαρμογής'. Η δεύτερη Τίτλος κάνει ελαχιστοποίηση (minimize) στη γραμμή εργαλείων.

Τα προγράμματα καλούνται στη Μ2000 Τμήματα, και για να δούμε τι έχουμε γράφουμε:
>Τμήματα
Α

Μπορούμε να φτιάχνουμε συναρτήσεις, π.χ.
σ Εμβαδόν(
γράφουμε στο ΕΜΒΑΔΟΝ()  ..τα ονόματα γίνονται κεφαλαία χωρίς τόνους!
διάβασε Χ, Ψ
=Χ*Ψ
και πατάμε Esc για να βγούμε από το διορθωτή. Δοκιμάζουμε:
>Τύπωσε Εμβαδόν(10,20)
       200

Τέλος σκέτο το Σ ανοίγει την λίστα εντολών που γράφουμε μετά το >
Μπορούμε να επιλέξουμε προηγούμενη εντολή με τα βελάκια πάνω ή κάτω (και τα δύο το ίδιο κάνουν)
Δοκιμάστε είναι εύκολο
ΓΚ

Δοκιμή της έκδοσης 7 αναθ 18 σε Windows 7








Σήμερα έκανα δοκιμή σε κανονικά Windows 7 Home Premium. Από την σελίδα αυτή κατέβασα το zip αρχείο, έβγαλα τον αποκλεισμό (από τις ιδιότητες του αρχείου με δεξί κλικ), το άνοιξα και έβαλα τα αρχεία σε έναν φάκελο και έτρεξα το setup.
Μετά από τα προγράμματα στο μενού επιλογής βρήκα το M2000 programming language και εκεί υπάρχουν δυο επιλογές, η μία κάνει εγκατάσταση του πιστοποιητικού αυθεντικού κώδικα και η άλλη τρέχει το περιβάλλον Μ2000 Environment.

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


Για το πιστοποιητικό ρίζας.
Η εγκατάσταση πιστοποιητικού είναι χρήσιμη για τα Windows για να μην τρέξει κάποιο μη αποδεκτό πρόγραμμα κατά λάθος. Το επιλέγουμε και πατάμε Install Certificate. Εμφανίζεται ο Wizard, και εμείς επιλέγουμε το Place all certificates in the following store. Κάνουμ κλικ στο Browse και επιλέγουμε Trusted Root Certifications Authorities. Κλείνουμε και πατάμε Next και Finish.

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

Νέα αναθεώρηση 18 για την Μ2000, έκδοση 7

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

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

module flower {
      read posX, posY, size
      refresh 10000 \\  using big number refresh counter make faster the program
      move posX,posY
      \\ Pen variation that gives color for lines inside a block of code
      width 5 { \\ setting line width
            pen #AA6600 { \\using colors like html hex values
                  for q=pi/8 to 2*pi step pi/8 {
                        move posX, posY
                        path #FF66FF { curve angle pi/3+q, size/6,pi/4+q,size,pi+q,size*2/3 }
                  }
                  move posX,posY
                  circle fill #FFAA20, size/3
            }
      }
}
cls #1155AA, 0
refresh 10000
for i=1 to 30 { \\ x.twips and y.twips are the resolution of the displayed form in twips.
      call flower random(x.twips),random(y.twips), random(2,4)*1000
}
refresh 0 \\ now we set refresh counter to 0 so we get the final picture
copy "alfa.bmp"



Εδώ είναι μια εικόνα από τον διορθωτή. Έβαλα εμφάνιση πληροφοριών, τρία "σημάδια" για να πατάμε ένα από τα F6, F7, F8 και να πηγαίνουμε απευθείας.
Με F9 μετράει τις λέξεις (σε κλάσμα του δευτερολέπτου). Η Μ2000 τρέχει σε XP εδώ σε παράθυρο Virtual Box σε σύστημα με Ubuntu Studio.



Οι παραπάνω εντολές είναι γραμμένες στο τμήμα Α (το βλέπουμε στο τίτλο)
 Με τις παρακάτω γραμμές κάνουμε τον υπολογιστή μας να μας δίνει μπουκέτα λουλούδια....κάθε φορά διαφορετικά!

EVERY 100 {
       A
      IF INKEY$<>"" THEN EXIT
}

Κάθε δέκατο του δευτερολέπτου δίνει άλλα σύνθεση, από 30 λουλούδια!

Η τελευταία αναθεώρηση: Μ2000ver7rev18 μπορείτε να κατεβάσετε το πρόγραμμα
Μετά το setup,  το ξεκινάτε και γράφεται Σ Α και ανοίγει ο διορθωτής (Σ από το Συγγραφή, στα αγγλικά το έχω με Edit A). Μπορείτε να κάνετε επικόλληση από τη σελίδα αυτή.
Μετά πατάτε Esc και γράφετε Α και πατάτε enter. Αυτό ήταν
Αν θέλετε φτιάχτε και μια Β και βάλτε μέσα τις τέσσερις παραπάνω γραμμές για να παιζει σαν ταινία, τα λουλούδια!
ΣΩΣΕ ΛΟΥΛΟΥΔΙ (ή SAVE FLOWER)
και το ξαναφορτώνουμε με ΦΟΡΤΩΣΕ ΛΟΥΛΟΥΔΙ (ή LOAD FLOWER)

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

Την επόμενη βδομάδα...με περισσότερα νέα!
Γ.Κ.





Τετάρτη 3 Ιουνίου 2015

Ενσωμάτωση delegate functions στην Μ2000

Πολύ καλή αναθεώρηση της Μ2000. προστέθηκαν ωραία πράγματα

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

Το πρόγραμμα το έχω γράψει στα αγγλικά (η Μ2000 τρέχει στα ελληνικά και στα αγγλικά, έχει διπλό λεξιλόγιο). Χρησιμοποιεί τέσσερις ομάδες: PrintTitle, PriceTotaller, bookDB, SecondbookDB. Τα δυο τελευταία τα φτιάχνουμε με το booktype$, ένα αλφαριθμητικό, δηλαδή δίνουμε έμμεσα ορισμό.

Στη Μ2000 δεν υπάρχουν αντικείμενα, αλλά ομάδες Μια ομάδα μπορεί να περάσει με αναφορά (και ό,τι ορίζουμε τοπικό δεν θα είναι προσβάσιμο μέσω της αναφοράς). Αυτό γίνονταν και πριν, αλλά δεν γίνονταν μια μέθοδος ή μια συνάρτηση μιας ομάδας να περάσει τον εαυτό της με αναφορά. Επιπλέον έγιναν πολλές διορθώσεις και προστέθηκε η εντολή φόρμα$() ή format$() δείτε την παρακάτω, και η πολύ καλή "Για"με όνομα ομάδας μόνο. Την χρησιμοποιώ εδώ κατά κόρο. π.χ.
αντί να γράψω αυτό
      call SecondbookDB.ProcessPaperbackBooks &PriceTotaller
γράφω αυτό, και όπου υπάρχει μια τελεία προστίθεται το SecondbookDB
for SecondbookDB {
      call .ProcessPaperbackBooks &PriceTotaller
}
Μπορούμε να έχουμε φωλιασμένα Για και στο εσωτερικό, έστω δεύτερο θα έχουμε αναφορά με διπλή τελεία, στο τρίτο εσωτερικό με τρεις...
Δείτε εδώ η p(i) έχει δυο τελείες, και αναφέρεται στο Anybook, ενώ η total έχει μια και αναφέρεται στο τρέχον (το αυτό ή this στα αγγλικά).
   function processBook { read &AnyBook, i : for this {.items++ : for Anybook {.total+=..p(i)  } }}



\\ Παράδειγμα με delegate functions
booktype$={
      local countme=0
      dim t$(1), a$(1), p(1), pb(1)
      function AddBook {
            for this {
                  newdim =.countme+1
                  dim .t$(newdim), .a$(newdim), .p(newdim), .pb(newdim)      
                  read .t$(.countme), .a$(.countme), .p(.countme), .pb(.countme)
                  .countme++
            }
      }
      module ProcessPaperbackBooks {
            read &ProcessBookDelegate
                  for this {
                        if .countme<1 then exit
                        for i=0 to .countme-1 {
                              if .pb(i) then call ProcessBookDelegate.processBook(&this, i)
                        }
                  }
      }
}
group PrintTitle {
      function processBook { read &AnyBook, i : Report format$("    {0}", AnyBook.t$(i) )}
}
group PriceTotaller {
      local items, total
      function processBook { read &AnyBook, i : for this {.items++ : for Anybook {.total+=..p(i) } }}
      \\  look the <= operator, if we use = then we define local variables. Items and total are like global but for group only
      module zero { for this { .total<=0 : .items<=0 } }
      function AveragePrice { for this {if .items>0 then =.total/.items }}
}
group bookDB type booktype$
report "First Book DB"
for bookDB {
      call .AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M. Ritchie", 19.95, true)
      call .AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95, true)
      call .AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95, false)
      call .AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00, true)
      call .ProcessPaperbackBooks &PriceTotaller
      report  "Average Paperback Book Price: $" + str$(PriceTotaller.AveragePrice(),"#.##")
      call .ProcessPaperbackBooks &PrintTitle
}
report "Second Book DB"    \\report prints text  proportionally with justification
PriceTotaller.zero
group SecondbookDB type booktype$
for SecondbookDB {
      call .AddBook("Any Big Big and Big Tilte", "Any Author", 3.45, true)
      call .ProcessPaperbackBooks &PriceTotaller
      report  "Average Paperback Book Price: $" + str$(PriceTotaller.AveragePrice(),"#.##")
      call .ProcessPaperbackBooks &PrintTitle
}

Αυτή είναι η έξοδος!



Το παραπάνω τρέχει ως έχει και στην Έκδοση 8, αλλά τρέχει και έτσι! (με την εντολή Class ή Κλάση)


class booktype {
      local countme=0
      dim t$(), a$(), p(), pb()
      module AddBook {
                  newdim =.countme+1
                  dim .t$(newdim), .a$(newdim), .p(newdim), .pb(newdim)
                  read .t$(.countme), .a$(.countme), .p(.countme), .pb(.countme)
                  .countme++
      }
      module ProcessPaperbackBooks {
            read &AnyFunction()
            if .countme<1 then exit
            for i=0 to .countme-1 {
                  if .pb(i) then call AnyFunction(&this, i)
            }
      }
}
function PrintTitle {
      read &AnyBook, i : Report format$("    {0}", AnyBook.t$(i) )
}
class PriceTotaller {
      local items, total
      function processBook { read &AnyBook, i : for this {.items++ : for Anybook {.total+=..p(i) } }}
      module zero { .total<=0 : .items<=0 }
      function AveragePrice { if .items>0 then =.total/.items }
}
bookDB=booktype()
PriceTotaller1=PriceTotaller()
report "First Book DB"
for bookDB {
      .AddBook"The C Programming Language",  "Brian W. Kernighan and Dennis M. Ritchie", 19.95, true
      .AddBook"The Unicode Standard 2.0",  "The Unicode Consortium", 39.95, true
      .AddBook"The MS-DOS Encyclopedia", "Ray Duncan", 129.95, false
      .AddBook"Dogbert's Clues for the Clueless", "Scott Adams", 12.00, true
      .ProcessPaperbackBooks &PriceTotaller1.processBook()
      report  "Average Paperback Book Price: $" + str$(PriceTotaller1.AveragePrice(),"#.##")
      .ProcessPaperbackBooks &PrintTitle()
}
report "Second Book DB"   
PriceTotaller2=PriceTotaller()
SecondbookDB=booktype()
for SecondbookDB {
      .AddBook "Any Big Big and Big Tilte",  "Any Author", 3.45, true
      .ProcessPaperbackBooks &PriceTotaller2.processBook()
      report  "Average Paperback Book Price: $" + str$(PriceTotaller2.AveragePrice(),"#.##")
      .ProcessPaperbackBooks &PrintTitle()
}

Κυριακή 24 Μαΐου 2015

Επιστροφή στο Blogging

Έχουν περάσει μήνες από το Νοέμβριο του 2014, από τότε που έγραψα στον ιστότοπο εδώ.

Στο διάστημα αυτό ασχολήθηκα με την γλώσσα Μ2000, όπου το Γενάρη του 2015 ανέβασα την έκδοση 7 αναθεώρηση 16. Μάλιστα βρήκα και μαθητές που ήθελαν να δουν τι είναι προγραμματισμός, να κάνουν κάτι. Θα ανεβάσω άλλη ανάρτηση για την εκπαίδευση.

Τους τελευταίους μήνες ψάχνω για γλώσσες προγραμματισμού να εντάξω στην εκπαιδευτική διαδικασία. Δεν είναι μόνο η γλώσσα το κριτήριο επιλογής αλλά και το περιβάλλον ανάπτυξης καθώς και οι δυνατότητες που προσφέρονται για ανάπτυξη εφαρμογών σε διάφορα λειτουργικά και με χρήση διεπαφής με διαλόγους-παράθυρα. Κατέληξα σε δυο γλώσσες στην python και την java. Ξεκίνησα από την java αλλά θέλησα να την διαβάσω κανονικά (να την ξαναδιαβάσω για την ακρίβεια), δηλαδή να την μάθω!

Η ανακάλυψη λοιπόν της περιόδου ήταν το πρόγραμμα της SoloLearn για τη java με βίντεο και ασκήσεις. Βλέπεις τα βίντεο και απαντάς στις ερωτήσεις είτε γράφεις κάτι είτε απλά επιλέγεις είτε αλλάζεις τη διάταξη των εντολών!
Δείτε εδώ το πρόγραμμα  (εγώ το κατέβασα σε android ταμπλε) Java Tutorial
Μετά την επιτυχή εκπαίδευση, "ζεστάθηκα" και άρχισα να φτιάχνω την Μ2000 στην αναθεώρηση 17. Δεν έχει τελειώσει ακόμα αλλά μπορώ να γράψω λίγα πράγματα γι΄αυτήν:

Μ2000 Έκδοση 7, Αναθεώρηση 17 (ακόμα δεν έχει τελειώσει..)

1. Διόρθωσα ένα Bug στην συνάρτηση ΡΩΤΑ() ASK() η οποία ανοίγει ένα παράθυρο διαλόγου για να δείξει κάτι ή να δείξει κάτι και να πάρει μια τιμή. Όταν κάνουμε αλλαγή μεγέθους τότε εμφανίζεται το πεδίο εισαγωγής ενώ δεν το θέλουμε (όταν δεν ρωτάμε κάτι δηλαδή), και τώρα διορθώθηκε.

2. Ξανακοίταξα το θέμα της βάσης δεδομένων. Πρόσθεσα τις εντολές DB.PROVIDER ή ΒΑΣΗ.ΠΑΡΟΧΟΣ και DB.USER ή ΒΑΣΗ.ΧΡΗΣΤΗΣ  και επιπλέον σε όλες τις εντολές μπορεί αντί για όνομα βάσης να δοθεί ένα συνθηματικό όνομα με παρενθέσεις ώστε να μην χρησιμοποιείται ως όνομα αρχείου αλλά ως όνομα σύνδεσης. Με αυτό το τρόπο μπόρεσα να αλλάξω το σύστημα και να κάνω τη Μ2000 να συνδέεται με βάσεις ODBC και άλλες που υποστηρίζει το σύστημα και απαιτούν όνομα χρήστη και κωδικό.

Μπορούμε για παράδειγμα να χρησιμοποιήσουμε αυτό: 

ΒΑΣΗ.ΠΑΡΟΧΟΣ  "Microsoft.ACE.OLEDB.12.0","Jet OLEDB"
 
 για όνομα βάσης θα βάλουμε κατάληξη .accdb  και έτσι έχουμε μια βάση δεδομένων σε Access 2007 και άνω (ανάλογα τι υπάρχει στον υπολογιστή).

Αν έχουμε ορίσει από πίνακα ελέγχου, εργαλεία διαχείρισης, πηγές δεδομένων ότι το testme είναι ένα συγκεκριμένη βάση και ορίσουμε όνομα χρήστη και κωδικό τότε μπορούμε να συνδεθούμε μέσω Μ2000 (αλλά δεν μπορούμε να δημιουργήσουμε βάση ή να την εμπλουτίσουμε σχεδιαστικά, παρά μόνο να διαβάσουμε, να προσθέσουμε ή να διαγράψουμε ή και να αλλάξουμε εγγραφές.

db.provider "dsn=testme;Uid=toor;Pwd=alfa;", "ODBC","encryptionpass"  
basename$ ="(anyname)"  
Retrieve basename$,"UNI", 1, "key","Greek"

3. Ανάπτυξη εντολών και συναρτήσεων για τον Σωρό (Stack).
Η γλώσσα χρησιμοποιεί ένα σωρό τιμών (αλφαριθμητικών και αριθμών) για πολλούς λόγους, κύρια όμως για προσωρινή αποθήκευση και πέρασμα τιμών. Παλιά ο σωρός ήταν απλή κατασκευή, ήταν ένα αλφαριθμητικό, ενώ στις τελευταίες εκδόσεις (από την έξι) είναι συλλογή αντικειμένων. Έτσι κάθε στοιχείο στο σωρό είναι εσωτερικά ένα συνδεδεμένο αντικείμενο. Δεν θα αναπτύξω εδώ όλη τη λειτουργικότητα του σωρού - καθώς και πότε υπάρχουν άλλοι ξεχωριστοί σωροί. Αυτό που έχει σημασία είναι ότι έφτιαξα έναν τρόπο να έχω παραμέτρους σε ένα τμήμα (η διαδικασία στην Μ2000 λέγεται τμήμα), χωρίς όνομα. Αντί για όνομα οι παράμετροι έχουν θέσεις στο σωρό.
Από την αναθεώρηση 17 μπορούμε να διαβάσουμε την τιμή από οποιαδήποτε θέση στο σωρό χωρίς να την "σηκώσουμε". Μέχρι την αναθεώρηση 16 μπορούσαμε να κάνουμε αυτό:
ΒΑΛΕ 1,2,3,4,5 ' το 5 είναι στην κορυφή του σωρού
ΔΙΑΒΑΣΕ Α,Β
ΤΥΠΩΣΕ Α, Β
    5   4
ο σωρός έχει τώρα κορυφή το 3 και είναι έτσι 3 2 1

τώρα μπορούμε να παραλείψουμε τη ΔΙΑΒΑΣΕ
ΒΑΛΕ 1,2,3,4,5
ΤΥΠΩΣΕ ΣΩΡΟΥΤΙΜΗ(), ΣΩΡΟΥΤΙΜΗ(2)
    5    4
ο σωρός έχει κορυφή το 5 και είναι έτσι 5 4 3 2 1
Δηλαδή διαβάζουμε τιμές χωρίς να τις σηκώνουμε από το σωρό!

η συνάρτηση ΣΩΡΟΥΤΙΜΗ() ισοδυναμή με την ΣΩΡΟΥΤΙΜΗ(1)

Υπάρχει και η αντίστοιχη για αλφαριθμητικά (γράμματα λέγονται στην Μ2000)

ΒΑΛΕ 1, "γεια"
ΤΥΠΩΣΕ ΣΩΡΟΥΤΙΜΗ$(), ΣΩΡΟΥΤΙΜΗ(2)
Για να πετάξουμε τις τιμές (έστω και τις δυο από τις πέντε) χρησιμοποιούμε την ΠΕΤΑ (υπήρχε αλλά εμπλουτίστηκε με τον έλεγχο λαθών, δηλαδή να βγάζει λάθος όταν δώσουμε αρνητικό αριθμό ή μεγαλύτερο του αριθμού των στοιχείων του σωρού...)
ΠΕΤΑ 2

Επιπλέον μπήκαν τρεις ακόμα εντολές:
ΦΕΡΕ SHIFT, ΦΕΡΕΠΙΣΩ SHIFTBACK, ΠΑΝΩ OVER

ΒΑΛΕ 1,2,3,4,5
ΣΩΡΟΣ
 5 4 3 2 1
ΦΕΡΕ 4 ' φέρνει στη κορυφή το στοιχείο στην 4η θέση
ΣΩΡΟΣ 2 5 4 3 1
ΦΕΡΕΠΙΣΩ 4 ' πάει τη κορυφή στη 4η θέση
ΣΩΡΟΣ
5 4 3 2 1
ΠΑΝΩ 2 ' φέρνει στη κορυφή ένα αντίγραφο του στοιχείου της 2ης θέσης
ΣΩΡΟΣ
4 5 4 3 2 1

Για να αλλάξουμε τιμή, έστω στη θέση τρία θα κάνουμε:
ΦΕΡΕ 3
ΒΑΛΕ ΑΡΙΘΜΟΣ+100
ΦΕΡΕΠΙΣΩ 3
ΣΩΡΟΣ
 5 104 3 2 1

Μια ιδιαιτερότητα της ΠΑΝΩ που δεν φαίνεται άμεσα είναι ότι όταν φτιάχνει αντίγραφα...αντιγράφει μόνο αναφορές στο αντικείμενο.
Ο σωρός 15 18 21 έχει τέσσερα αντικείμενα:
το αντικείμενο του σωρού και από ένα για τις τιμές 15, 18 και 21
όταν κάνουμε ΠΑΝΩ 2 (OVER 2) τότε το  αντικείμενο με την τιμή 18 εμφανίζεται σε δυο θέσεις, στην 1 και στην 3 (η 2 έγινε με την προσθήκη νέας κορυφής 3). Όταν θέλουμε να αλλάξουμε τιμή στην ουσία το σύστημα δεν μας επιτρέπει να το κάνουμε άμεσα αλλά έμμεσα. Δηλαδή πρέπει να διαβάσουμε την κορυφή για να βγει η τιμή από το σωρό και μετά να φτιάξουμε μια νέα κορυφή με την νέα τιμή. Αυτό γίνεται σε μια γραμμή! ΒΑΛΕ ΑΡΙΘΜΟΣ+100. Η ΑΡΙΘΜΟΣ είναι εσωτερική μεταβλητή που διαβάζει την κορυφή και την πετάει ταυτόχρονα! Το αντίστοιχο για αλφαριθμητικά είναι η ΓΡΑΜΜΑ$, η οποία πετάει την κορυφή αμέσως αφού την διαβάσει. Ουσιαστικά και οι δύο πετάνε την αναφορά στο αντικείμενο. Αν δεν υπάρχει άλλη αναφορά στο αντικείμενο τότε το αντικείμενο διαγράφεται (είναι ο μηχανισμός αντικειμένων της VB6, σε αυτή τη γλώσσα έχει γραφτεί η Μ2000).

Θα μπορούσαμε δηλαδή να έχουμε έναν σωρό με 1000 θέσεις του αυτού αντικειμένου με τιμή "(άδειο)".  Η λέξη "(άδειο)" θα υπάρχει μια φορά ως αντικείμενο και 1000 φορές ως αναφορά στο αντικείμενο του σωρού!

Για να χειριστούμε το σωρό με την ΠΕΤΑ πρέπει να ξέρουμε πόσα αντικείμενα θα πετάξουμε (στην ουσία πόσες αναφορές σε αντικείμενα). Υπάρχει λοιπόν η ΜΕΓΕΘΟΣ.ΣΩΡΟΥ (STACK.SIZE) η οποία μπορεί να μπει σε μια μεταβλητή και μετά την επέκταση του σωρού να χρησιμοποιηθεί ως ΠΕΤΑ ΜΕΓΕΘΟΣ.ΣΩΡΟΥ-ΠΑΛΙΟ.ΜΕΓΕΘΟΣ και έτσι επιστρέφουμε στην προ της επέκτασης του σωρού (και υποτίθεται ότι τα στοιχεία τα διαβάσαμε με τις ΣΩΡΟΥΤΙΜΗ() και ΣΩΡΟΥΤΙΜΗ$().

Τέλος μπορούμε να γνωρίζουμε τι έχει ο σωρός σε τύπους με την ΦΑΚΕΛΟΣ$() ή ENVELOPE$() (αυτή υπήρχε) που δίνει ένα αλφαριθμητικό με N ή S (λατινικό N και S) στις θέσεις με κορυφή το πρώτο στο αλφαριθμητικό. Άλλος τρόπος είναι με τις ΕΙΝΑΡ (ISNUM) και ΕΙΝΓΡ (ISLET) (οι οποίες όμως φέρνουν λάθος αν είναι άδειος ο σωρός). Υπάρχει λοιπόν το ΑΔΕΙΟ (EMPTY), από την πρώτη έκδοση μάλιστα, για να ελέγχουμε αν είναι άδειος ο σωρός ή ελέγχουμε το ΜΕΓΕΘΟΣ.ΣΩΡΟΥ.

(Η M2000 έχει διπλό σετ εντολών, στα ελληνικά και στα αγγλικά).