Πέμπτη, 9 Νοεμβρίου 2017

Αναθεώρηση 3 Έκδοση 9.0

Σε αυτήν την αναθεώρηση έγινε μια διόρθωση και μερικές προσθήκες.
Η διόρθωση αφορά την εντολή εισαγωγή με το σύμβολο !, όταν δίναμε ακέραια ή πραγματική (double) μεταβλητή, τότε αν σβήναμε τον αριθμό (δεν αφήναμε κανένα νούμερο στην εισαγωγή) ε δεν γύρναγε τον αριθμό που είχε αρχικό αλλά το πλάτος πεδίου που δηλώναμε στην εντολή (η εντολή εμφανίζει γράμματα/νούμερα με αναλογική γραφή και διαφάνεια πάνω στην κονσόλα).
N%=10
Input ! N%, 20
Print N%

Αν στο παραπάνω πρόγραμμα σβήναμε το 10 στην εισαγωγή, τότε έπαιρνε τιμή το 20, (το οποίο είναι το πλάτος του πεδίου για να εμφανιστεί ο αριθμός).

Οι προσθήκες:
1) Η εντολή Πεδίο Νέο μηδένιζε την μεταβλητή Πεδίο, που γυρνάει από την Εισαγωγή (Input), και περιέχει τον τρόπο που τερμάτισε η εισαγωγή πχ το 99 είναι με Esc. Τώρα παίρνει και νούμερο, πχ το Πεδίο Νέο 1 θα δώσει στην Πεδίο το 1 που σημαίνει enter ή κάτω βελάκι ή tab.
(ετοιμάζω ένα πολύ ωραίο παράδειγμα και θα το δούμε στην επόμενη ανάρτηση)

2)Μπορούμε να περάσουμε ένα πίνακα ως τιμές σωρού, χρησιμοποιόντας το ! (το ίδιο μπορούμε να κάνουμε με ένα αντικείμενο σωρός, με τη διαφορά ότι ο πίνακας δεν αδειάζει, όπως αδειάζει το αντικείμενο σωρός).
flush
Function Alfa {
      Read a, a$, b, c
      return c, 1:=10000
      Print c
}
N=(12,212,121)
call alfa(!(1,"aaa",3, N))
Print N
Dim N(3)
N(0):=12,212,121
call alfa(!(1,"aaa",3, N()))
Print N()
B=Stack:=!(1,2,3,4)
flush
Stack B
Stack

και εδώ:
Flush   \\ empty stack
Push 1,2,3,4
Push !(5,6,7)
Stack     \\ 7 6 5 4 3 2  1
Flush
Push 1,2,3,4
function mergetop {}
Call Mergetop(!(5,6,7))
Stack   \\ 5 6 7 4 3 2 1
Flush
Push 1,2,3,4
Data !(5,6,7)
Stack   \\ 4 3 2 1 5 6 7
Flush
Push 1,2,3,4
N=[] \\ (1)
Push !(5,6,7)
Stack N \\ (2)
\\ (1) & (2)  no needed
Stack   \\ 7 6 5 4 3 2  1
Flush
Push 1,2,3,4
N=[]
Push !(5,6,7), !N
Stack   \\  4 3 2 1 7 6 5




3)Η συνάρτηση Πίνακας() ή Array() αν έχει αντικείμενο σωρό, τότε δίνει έναν πίνακα και αφαιρεί από το σωρό τα στοιχεία του. Το [] είναι μεταβλητή και είναι ο τρέχον σωρός (στην ουσία τον "κλέβουμε", αφού αφήνουμε ενάν νέο τρέχον σωρό και το [] είναι ο δείκτης στον παλιό).
Οι δείκτες σε αντικείμενο ειδικά του σωρού "stack" και του πίνακα "(,)" μπορούν να εναλλάσονται, δηλαδή να δείχνουν πότε το ένα και πότε το άλλο (μπορούν να δείχνουν και την κατάσταση "inventory"αλλά σε αυτήν ο διερμηνευτής φτιάχνει τα Α$() και Α() για να δουλεύουμε με αυτήν).
Με την εντολή A=array([]) αδειάζουμε το σωρό σε έναν πίνακα (γίνεται αντιγραφή σε ορισμένα αντικείμενα, όπως πίνακες στον σωρό). Η Type$() ή Τύπος$() μας δίνει τον τύπο του αντικειμένου!
Flush
A=(,)
Print type$(A)
Push 1,2,3
A=array([])
Print type$(A)
Print len(A)

4) Μπορούμε να πάρουμε ένα μέρος του σωρού και να τον κάνουμε πίνακα:

Flush
Data "aaa", "bbb", "ccc"
Stack
S=[] \\ get current and leave empty
A=Array(S,2) \\ get to part to A
Stack S \\ place stack to current
Print A
Push !A \\ A give a copy
Stack
Print A

5)  Η εντολή Stack τώρα μπορεί να βάζει πίνακες ως σωρούς. Οι πίνακες δίνουν στοιχεία ως αντιγραφή, δηλαδή δεν τα χάνουν! Η Stack(S) βγάζει αντίγραφο σωρού, άρα διατηρεί τα στοιχεία του S. H Data βάζει στο τέλος στοιχεία, και εδώ βάζει τα aaa, bbb, ccc

Flush
all=("aaa", "bbb", "ccc")
Data !all
Stack
S=[] \\ get current and leave empty
N=Array(S,2)
Stack !N, !N, STACK(S)
Stack
Print S
Print N
Print All
K=Stack(N)
Print K
Print N

6) Υπάρχει τρόπος να χωρίσουμε ένα σωρό από το πάνω ή κάτω μέρος του. Τα Μ και Ν είναι δείκτες σε αντικείμενα σωρούς. Η Print (τύπωσε) μπορεί να τυπώνει όλα τα στοιχεία ενός αντικείμενου σωρού, ενός πίνακα, μιας κατάστασης, αλλά αν βρεί αντικείμενο απλά βάζει διάστημα και αλλάζει στήλη (και γραμμή αν χρειάζεται). Και στις δυο εντολές ο αριθμός αν είναι εκτός ορίων δεν βγάζουν λάθος, αλλά δίνουν το "λογικό" αποτέλεσμα, ή όλο ή τίποτα.

Χωρίζουμε από κάτω
flush
data 1,2,3

N=[]
Print N
M=stack down N, 2
Print M
Print N

1  2  3
2  3
1

Χωρίζουμε από πάνω

flush
data 1,2,3

N=[]
Print N
M=stack up N, 2
Print M
Print N

1 2 3
1 2
3

7)Ανανεώθηκε και η βοήθεια. Εδώ μέρος από την Stack (είναι και εντολή και τελεστής σε παράσταση).

    a=Stack
    a=Stack:=1,2,3 ' we can put  (stack:=1,2,3) as a value too
    b=Stack Up a, 2 ' 1,2 to b and leave 3 to a
    a=Stack:=1,2,3
    b=Stack Down a, 2 ' 2,3 to b and leave 1 to a
    Print b ' 2,3
    a=Stack:=!a,!b
    Print a ' 1,2,3