Κυριακή, 11 Μαρτίου 2018

Αναθεώρηση 55 (Έκδοση 9.0)

Συνέχισα την προσπάθεια να εντάξω τους Decimal και Currency (και εντέλει τους Long και Boolean). Οι σταθερές True και False τώρα είναι boolean τύποι, οπότε μια A=True θα κάνει το Α boolean (Από τις νεότερες εκδόσεις τα True και False δεν είναι boolean τύπος, για να υπάρχει συμβατότητα με τα παλιότερα προγράμματα, οι συγκρίσεις όμως γυρίζουν boolean, και υπάρχει τρόπος να δημιουργήσουμε απευθείας λογική μεταβλητή). Μόνο στην 9.1 εμφανίστηκαν ως boolean.   H M2000 συνεχίζει να έχει σταθερούς τύπους σε μεταβλητές που δηλώνουμε Long (Μακρύς) είτε με την δήλωση είτε με το να δώσουμε τιμη τέτοιου τύπου, πχ Β=100&  το & κάνει τον αριθμό να περιέχεται σε μακρύ, οπότε με την πρώτη δήλωση τιμής το Β θα γίνει μακρύς. Σε αυτές τις μεταβλητές αν δώσουμε τιμή μεγαλύτερη από αυτή που χωράει, τότε θα βγει λάθος υπερχείλισης.
H δήλωση Long δεν χρησιμοποιείται για πίνακες. Όμως εκεί μπορούμε με μια εντολή γεμίσματος να γεμίσουμε έναν πίνακα με τέτοιου τύπου τιμές (οι μεταβλητές και τα στοιχεία ενός πίνακα στην Μ2000 είναι τύπου Variant, οπότε επιδέχονται αλλαγές, πλην όμως οι τύπου Μακρύς δεν επιδέχονται!
Ακέραιοι (όνομα με % στο τέλος) στην γλώσσα μπορεί να είναι διαφόρων τύπων. Αυτοί έχουν την ιδιότητα να  στρογγυλοποιούν αυτόματα στην εκχώρηση. Εσωτερικά μπορεί είναι ή τύπου διπλού, ή Decimal (29 ψηφία) ή Currency (19 ψηφία, από τα οποία τα 14 για ακέραιο). Αυτές οι μεταβλητές δεν παίρνουν Μακρύ (οι οποίοι γράφονται σε μεταβλητές με κανονικά ονόματα).

Οι αριθμοί στον κώδικα όταν έχουν δεκαδικά γράφονται πάντα με τελεία. Η εμφάνιση στην οθόνη με την τύπωσε και με την εισαγωγή αλλάζει ανάλογα με το τι έχει επιλεχθεί στο λειτουργικό.

Για αριθμούς Decimal βάζουμε στο τέλος το @  πχ το Α=32232112312312.12312312@ θα πάρει Decimal. Για Currency βάζουμε στο τέλος το #, πχ το Α=23333121233.21231# θα πάρει Currency. Για Long (εκτός από την δήλωση, πχ Long A=10 θα κάνει ότι παίρνει ο Α να γίνεται Long αυτόματα, ή να βγαίνει υπερχείλιση ως λάθος), θα χρησιμοποιήσουμε το &, πχ το Α=100& σημαίνει ότι θα πάρει το 100 ως Long  ή Μακρύς.
Μεταβλητές με διπλό (double), Decimal, Currency μπορούν να αλλάζουν τύπο (αν πάρουν Long, δεν αλλάζουν ξανά). Όταν καλούμε μια συνάρτηση, και ζητάμε αριθμό σε μεταβλητή, τότε αυτή θα πάρει ότι της δώσουμε. Το μέρος της γλώσσας που επεξεργάζεται τις εκφράσεις θα λειτουργήσει κανονικά, και ενδέχεται να κάνει μετατροπές.
Στο πρόγραμμα παρακάτω δημιουργούμε μια συνάρτηση μιας γραμμής (αντί για Συνάρτηση όνομα { }, βάζουμε με την Def  ή την Κάνε (η αντίστοιχη ελληνική). Η έκφραση που θα δίνουμε στην Typename$() θα πηγαίνει στην Ν και από αυτή θα παίρνουμε τον τύπο της, άρα τον τύπο της έκφρασης. Επειδή κάθε φορά που καλούμε την συνάρτηση φτιάχνεται η Ν ξανά, δεν μας πειράζει αν γίνει Long, στην επόμενη κλήση θα είναι κάτι άλλο!
Αριθμοί σε @ είναι Decimal
σε # είναι Currency
σε & είναι Long
χωρίς κάτι είναι Double

Στο πρόγραμμα λοιπόν κάνουμε έλεγχο το τι θα βγεί βάσει των πράξεων.Οι decimal έχουν την μέγιστη προτεραιότητα επιλογής.


Form 100, 66 ' Display 100X66
Def Typename$(N)=Type$(N) ' Type$ return only Variable's and Array's Item type

Print Typename$(-(131231@*1221212)) ' decimal
Print Typename$(-(131231@/1221212)) 'decimal
Print Typename$(-(131231@*1221212@)) ' decimal
Print Typename$(-(131231@/1221212@)) 'decimal
Print Typename$(-(131231@*1221212#)) ' decimal
Print Typename$(-(131231@/1221212#)) 'decimal
Print Typename$(-(131231@*1221212&)) ' decimal
Print Typename$(-(131231@/1221212&)) 'decimal

Print Typename$(-(131231#*1221212)) ' double
Print Typename$(-(131231#/1221212)) 'double
Print Typename$(-(131231#*1221212@)) ' decimal
Print Typename$(-(131231#/1221212@)) 'decimal
Print Typename$(-(131231#*1221212#)) ' Currency
Print Typename$(-(131231#/1221212#)) 'double
Print Typename$(-(131231#*1221212&)) ' Currency
Print Typename$(-(131231#/1221212&)) 'double

Print Typename$(-(131231*1221212)) ' double
Print Typename$(-(131231/1221212)) 'double
Print Typename$(-(131231*1221212@)) ' decimal
Print Typename$(-(131231/1221212@)) 'decimal
Print Typename$(-(131231*1221212#)) ' double
Print Typename$(-(131231/1221212#)) 'double
Print Typename$(-(131231*1221212&)) ' double
Print Typename$(-(131231/1221212&)) 'double

Print Typename$(-(131231&*1221212)) ' double
Print Typename$(-(131231&/1221212)) 'double
Print Typename$(-(131231&*1221212@)) ' decimal
Print Typename$(-(131231&/1221212@)) 'decimal
Print Typename$(-(131231&*1221212#)) ' double
Print Typename$(-(131231&/1221212#)) 'double
Print Typename$(-(131231&*1221212&)) ' double
Print Typename$(-(131231&/1221212&)) 'double

Print Typename$(-(131231@+1221212)) ' decimal
Print Typename$(-(131231@-1221212)) 'decimal
Print Typename$(-(131231@+1221212@)) ' decimal
Print Typename$(-(131231@-1221212@)) 'decimal
Print Typename$(-(131231@+1221212#)) ' decimal
Print Typename$(-(131231@-1221212#)) 'decimal
Print Typename$(-(131231@+1221212&)) ' decimal
Print Typename$(-(131231@-1221212&)) 'decimal

Print Typename$(-(131231#+1221212)) ' Currency
Print Typename$(-(131231#-1221212)) ' Currency
Print Typename$(-(131231#+1221212@)) ' decimal
Print Typename$(-(131231#-1221212@)) 'decimal
Print Typename$(-(131231#+1221212#)) ' Currency
Print Typename$(-(131231#-1221212#)) 'Currency
Print Typename$(-(131231#+1221212&)) ' Currency
Print Typename$(-(131231#-1221212&)) 'Currency

Print Typename$(-(131231+1221212)) ' double
Print Typename$(-(131231-1221212)) 'double
Print Typename$(-(131231+1221212@)) ' decimal
Print Typename$(-(131231-1221212@)) 'decimal
Print Typename$(-(131231+1221212#)) ' Currency
Print Typename$(-(131231-1221212#)) ' Currency
Print Typename$(-(131231+1221212&)) ' double
Print Typename$(-(131231-1221212&)) 'double

Print Typename$(-(131231&+1221212)) ' double
Print Typename$(-(131231&-1221212)) 'double
Print Typename$(-(131231&+1221212@)) ' decimal
Print Typename$(-(131231&-1221212@)) 'decimal
Print Typename$(-(131231&+1221212#)) ' Currency
Print Typename$(-(131231&-1221212#)) 'Currency
Print Typename$(-(131231&+1221212&)) ' Long
Print Typename$(-(131231&-1221212&)) 'Long


Στο επόμενο πρόγραμμα θα στείλουμε μερικά νούμερα σε αρχείο csv, αλλά εδώ θα το λέμε τύπου dat. (data). Έχουν μπει δυο νέα πράγματα: μπορούμε στην εισαγωγή από αρχείο να δείξουμε τι τύπο ζητάμε. Εδώ λέμε το Μ1 να είναι Decimal, και το Ζ1 να είναι Currency. Όταν δε φτιάξαμε το αρχείο, η Γράψε αυτόματα μετέφερε βάσει του τύπου. Το δεύτερο είναι η Εισαγωγή με κατά το Γράψε με, που διαμορφώνει το πώς θα διαβάσουμε από το αρχείο. Εδώ έχω βάλει το TAB (χαρ$(9)) ως αλλαγή πεδίου και το κόμμα ως σημείο υποδιαστολής. Επίσης έχει επιλεχθεί τα αλφαριθμητικά να αποκωδικοποιούνται κατά json αλφαριθμητικά. Το αρχείο θα γραφτεί και θα διαβαστεί ανεξάρτητα από το τη υποδιαστολή χρημοποιεί το σύστημα. Το ότι υπάρχουν δυο εντολές η μια για διαμόρφωση διαβάσματος και η άλλη για γράψιμο, γίνεται να προγραμματίσουμε διαφορετικά στοιχεία, ώστε να κάνουμε αντιγραφές από το ένα αρχείο σε ένα άλλο.

Επειδή το αρχείο ανοίγει και με το Notepad, μπορούμε να το δούμε και εδώ:
"Row 1"    -213231313132312,23123    -52322323,32    -12121000000
"Line1\r\nLine2\r\nLine3\r\n"

Χωρίς το ευρεία (με κίτρινο) κάνουμε εξαγωγή σε Ansi, και ομοίως εισαγωγή σε Ansi (8bit κωδικοσελίδα)

Γράψε με χαρ$(9), ",", αληθές 'αληθές σημαίνει ότι τα αλφαριθμητικά θα κωδικοποιούνται κατά json
Άνοιξε "my.dat" για ευρεία εξαγωγή ως #κ
Γράψε #κ, "Row 1", -213231313132312.23123@, -52322323.32#, -1.2121e+10
Γράψε #κ, {Line1
                        Line2
                        Line3
                        }
Κλείσε #κ
\\ κατά json σημαίνει ότι ειδικοί χαρακτήρες κωδικοποιούνται ώστε να γράφεται
\\ το αλφαριθμητικό με πολλές γραμμές χωρίς να έχει μέσα του αλλαγές γραμμών
\\ και άλλοι χαρακτήρες κωδικοποιούνται αλλά εμάς μας ενδιαφέρει ότι βάζουμε
\\ ένα κείμενο σε μια γραμμή!
Εισαγωγή με χαρ$(9), ",", αληθές 'αληθές σημαίνει ότι τα αλφαριθμητικά θα διαβάζονται κατά json
Άνοιξε "my.dat" για ευρεία Εισαγωγή ως #κ
Εισαγωγή #κ, R$, M1=0@, Z1=0#, check
Εισαγωγή #κ, Txt$
Κλείσε #κ
Τύπωσε R$, M1, Z1, check
Τύπωσε Τύπος$(M1), Τύπος$(Z1)
Τύπωσε M1
Τύπωσε Z1
Αναφορά txt$ ' η αναφορά τυπώνει κείμενα
\\ αν το κείμενο έχει πολλές γραμμές σταματάει...
\\ για να μας δείξει μέρος και συνεχίζει με διάστημα, ή με πλήκτρο ποντικιού.


Write with chr$(9), ",", true ' true means that strings replaced as json strings
Open "my.dat" for output as #k
Write #k, "Row 1", -213231313132312.23123@, -52322323.32#, -1.2121e+10
Write #k, {Line1
                        Line2
                        Line3
                        }
Close #k
Open "my.dat" for input as #k
Line Input #k,All$
Close #k
Print All$
Input With chr$(9), ",", true ' true means that strings readed as json strings
Open "my.dat" for input as #k
Input #k, R$, M1=0@, Z1=0#, check
Input #k, Txt$
Close #k
Print R$, M1, Z1, check
Print Type$(M1), Type$(Z1)
Print M1
Print Z1
Report txt$



The Unicode Version
Write with chr$(9), ",", true ' true means that strings replaced as json strings
Open "my.dat" for wide output as #k
Write #k, "Row 1", -213231313132312.23123@, -52322323.32#, -1.2121e+10
Write #k, {Line1
                        Line2
                        Line3
                        }
Close #k
Open "my.dat" for wide input as #k
Line Input #k,All$
Close #k
Print All$
Input With chr$(9), ",", true ' true means that strings readed as json strings
Open "my.dat" for wide input as #k
Input #k, R$, M1=0@, Z1=0#, check
Input #k, Txt$
Close #k
Print R$, M1, Z1, check
Print Type$(M1), Type$(Z1)
Print M1
Print Z1
Report txt$


Πώς θα κάνουμε όμως μετατροπές από τον ένα τύπο στον άλλο;
Η συνάρτηση Τιμή() ή Val() μέχρι την προηγούμενη αναθεώρηση έπαιρνε αλφαριθμητικό. Τώρα παίρνει και αυτό αλλά και αριθμητική παράσταση. Αν δεν δώσουμε τίποτα άλλο τότε θα πάρουμε τον διπλό,  αλλιώς με το βελάκι θα δείξουμε το 0@ ή το 0#  ή το 0&.

Κάνε ΤύποςΠαράστασης$(Ν)=Τύπος$(Ν)
Τύπωσε ΤύποςΠαράστασης$(10) ' Double
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10->0@)) ' Decimal
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10->0#)) ' Currency
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10->0&)) ' Long
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10@)) ' Double
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10#)) ' Double
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10&)) ' Double
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10#->0@)) ' Decimal
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10&->0@)) ' Decimal
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10@->0#)) ' Currency
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10&->0#)) ' Currency
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10@->0&)) ' Long
Τύπωσε ΤύποςΠαράστασης$(Τιμή(10#->0&)) ' Long


ή στα αγγλικά:

Def TypeOfExpression$(Ν)=Type$(Ν)
Print TypeOfExpression$(10) ' Double
Print TypeOfExpression$(Val(10->0@)) ' Decimal
Print TypeOfExpression$(Val(10->0#)) ' Currency
Print TypeOfExpression$(Val(10->0&)) ' Long
Print TypeOfExpression$(Val(10@)) ' Double
Print TypeOfExpression$(Val(10#)) ' Double
Print TypeOfExpression$(Val(10&)) ' Double
Print TypeOfExpression$(Val(10#->0@)) ' Decimal
Print TypeOfExpression$(Val(10&->0@)) ' Decimal
Print TypeOfExpression$(Val(10@->0#)) ' Currency
Print TypeOfExpression$(Val(10&->0#)) ' Currency
Print TypeOfExpression$(Val(10@->0&)) ' Long
Print TypeOfExpression$(Val(10#->0&)) ' Long


Όλοι οι τύποι χρησιμοποιούνται παντού!