Πέμπτη, 8 Μαρτίου 2018

Αναθεώρηση 54, Έκδοση 9.0 - Currency Type

Σε αυτήν την αναθεώρηση έβαλα το Currency, και τώρα μαζί με το Decimal, η Μ2000 έχει τους καλύτερους τύπους για πράξεις.
Ρύθμισα και την Στρογγ() ή Round() για να επιστρέφει τον ίδιο τύπο.
Σε αριθμούς βάζουμε το @ για Decimal, # για Currency, & για Long
Το αποτέλεσμα των υπολογισμών μπορεί να βγει σε άλλο τύπο αν δεν μπορεί να βγει αλλιώς αποτέλεσμα.
Παρακάτω είναι ένα πρόγραμμα επίδειξης των νέων δυνατοτήτων της γλώσσας.

Στο πρόγραμμα κάνω πολλαπλασιασμό για να βγει υπερχείλιση. Στους Long (Μακρύς) θα βγει λάθος όπως και να έχει. Στους Decimal και Currency θα γίνει μετατροπή σε Double.



Bold 0
Form 80, 55
Cls 5 : Pen 14
Const CenterJustify=2
Double : Bold
Report CenterJustify, "Demo for using numeric types in M2000 programming language"
Normal : Bold
Print
Print $(4, 20),  \\ 20 char width - using proportional printing
Print "Decimal, Currency, Long:", 112212321231231231323@, 23432432434234.32#, 44554&
Long A
A=100
Print Type$(A) ' long
B=A
Print Type$(B) ' New if 54
\\ Long variables stay Long
Z=123123
Print Z
Print Type$(Z) ' double
Z=21321.1532131231232132@
Print Z
Z1=Round(Z, 1)
Print Type$(Z) ' Decimal
Print Z1
Print Type$(Z1) ' Decimal

Z=2321213133.25#
Print Z
Z1=Round(Z, 1)
Print Type$(Z) ' Currency
Print Z1
Print Type$(Z1) ' Currency
Bold
Report CenterJustify, "Array fill with a value of some type"
Bold
Dim A(10)=0@
Print "Array Item Type:";Type$(A(3)), ' Decimal
Dim A(10)=0&
Print "Array Item Type:"; Type$(A(3)),  ' Long
Dim A(10)=0#
Print "Array Item Type:"; Type$(A(3)),  ' Currency
Dim A(10)=0
Print "Array Item Type:"; Type$(A(3)),  ' Double
Bold
Report CenterJustify, "For Loops with Decimal, Currency, Long"
Bold
\\For  loop with Decimal
N=Row
For i=12312122121212212.1212@ to 12312122121212222.1212@ step 2 {
      Print i, " "+type$(i)
}
Cursor 0, N
\\For  loop with Currency
For i=1231212.12# to 1231222.12# step 2 {
      Print @(Tab(1)), i, " "+type$(i)
}
Cursor 0, N
\\For  loop with Long  (need to declare i as long)
\\ using Long or using i=0&
Long i
For i=1231212& to 1231222& step 2 {
      Print @(Tab(2)), i, " "+type$(i)
}
Bold
Report CenterJustify, "Overflow control for Long type"
Bold
Try {
      i=1212112112122 ' Long can't converted
}
Print "Report Error"+Error$ ' overflow long
Report CenterJustify, "Auto convertion for types to double, on overflow"
Z=3223423424423423423@
Print "Try on:"; Type$(Z), Z;"@*";"5000000000000000@"  ' Decimal
Z*=5000000000000000@ ' overflow bur converted to double
Print "Result:"; Type$(Z) , Z ' Double
Z=32234234212244.23#
Print "Try on:"; Type$(Z), Z;"#*";"5000000000000000@"  ' Currency
Z*=5000000000000000@ ' overflow bur converted to double
Print "Result:"; Type$(Z) , Z ' Double

\\ Integers from Decimal and Currency
A%=-12313123123123.52123123213123@
Print A%
Print Type$(A%) ' Decimal but hold only Integer value
A%=-123131231223.52#
Print A%
Print Type$(A%) 'Currency but hold only Integer value
A%=-121212121212121.5212
Print A%
Print Type$(A%) 'Double but hold only Integer value
A%=1212121&
Print A%
Print Type$(A%) 'Double  - can't take long

Module aName {
      Read A, B, C, D
      \\ Center to tab
      Pen 11 {
            Print Part $(6),Type$(A), Type$(B), Type$(C), Type$(D)
      }
      Print
}
aName 1000&, 638716387681736@, 8764873287.34#, 3478239744
Let A1=1000&, A2=638716387681736@, A3=8764873287.34#, A4=3478239744
aName A1, A2, A3, A4
aName ! (1000&, 638716387681736@, 8764873287.34#, 3478239744)
A=(1000&, 638716387681736@, 8764873287.34#, 3478239744)
Print "A is ";Type$(A);" type, a pointer to Array. We can add 20 to all items in a single statement"
Print A
A+=20& ' Add to all  numeric items a long  value
Print A ' so first long stay long
aName ! A \\ pass all values to aName module
A+=10000000000000000@
Print A
aName ! A
\\ Constants are objects.
Const K=121212212121211121212.121@
Print K, Type$(K) ' say Constant
M=K
Print M, Type$(M) ' say Decimal
Try {
      K++
}
Print "Report Error "+Error$
Print Key$ ' wait for a key