Στην έκδοση 9.5 προστέθηκαν τα παρακάτω:
1. Μπορούμε πια να χρησιμοποιούμε πέρασμα με αναφορά στοιχεία πίνακα, και στατικές μεταβλητές. Χρησιμοποιείται ο μηχανισμός copy in copy out, όπου ο διερμηνευτής φτιάχνει πριν την κλήση μεταβλητές και περνάει αυτές με αναφορά (που κανονικά γίνεται) και στην επιστροφή ενημερώνει πίσω. Στις προηγούμενες εκδόσεις μπορούσαμε να περνάμε μόνο ολόκληρο το πίνακα με αναφορά (καθώς και με αντιγραφή, πέρασμα με τιμή), όπως επίσης οποιεσδήποτε μεταβλητές και συναρτήσεις.
static k=5
module In {
read &x, &b$, &k
x++
k++
print x, x*k
b$+="ok"
}
Dim a(10)=5, z$(30)="hello"
In &a(5), &z$(2), &k
Print a(5), z$(2), k
List
2. Οι αυτόματοι πίνακες ή tuple, καθώς και οι κανονικοί πίνακες (μόνο για αυτούς που έχουν όνομα σαν αριθμητική μεταβλητή),έχουν πια δικές τους συναρτήσεις που μπορούν να χρησιμοποιηθούν αθροιστικά. Θα αναφερθώ σε αυτά σε άλλη ανάρτηση, με παραδείγματα με ελληνικές εντολές
a=(1,2,3,4,5)
Print a#rev()
Print a#sum()=15
Print a#max()=5, a#min()=1
k=-1
L=-1
Print a#max(K)=5, a#min(L)=1
Print K=4 ' 5th position
Print L=0 ' 1st position
Print a#pos(3)=2 ' 3rd position
Print a#val(4)=5
\\ tuples in tuple
a=((1,2),(3,4))
Print a#val(0)#val(1)=2
Print a#val(1)#val(1)=4
a=(1,2,3,4,5,6,7,8,9)
fold1=lambda ->{
push number+number
}
Print a#fold(fold1)=a#sum()
Print a#fold(fold1,1)=a#sum()+1
even=lambda (x)->x mod 2=0
b=a#filter(even, (,))
Print b ' 2 4 6 8
Print a#filter(even)#fold(fold1)=20
map1=lambda (a)->{
push a+100
}
c=b#map(map1)
Print c ' 102,103, 104, 105
numbers=lambda p=1 (x) ->{
push x+p
p++
}
oldnumbers=numbers ' we get a copy of numbers with p=1
c=c#map(numbers)
Print c ' 103, 106, 109, 112
zfilter=lambda -> number>106
tostring=lambda -> {
push chrcode$(number)
}
oneline=lambda -> {
shift 2 ' get second as first
push letter$+letter$
}
Line$=c#filter(zfilter)#map(tostring)#fold$(oneline,"")
print Line$="mp", chrcode$(109)+chrcode$(112)
zfilter=lambda -> number>200
Line$=""
Line$=c#filter(zfilter)#map(tostring)#fold$(oneline,"")
\\ lines$ can't change value becuse filter has no items to give
Print Line$=""
\\ if we leave a second parameter without value the we get No Value error
Try {
Line$=c#filter(zfilter, )#map(tostring)#fold$(oneline,"")
}
Print error$=" No value"
\\ second parameter is the alternative source
Line$=c#filter(zfilter,(109,112))#map(tostring)#fold$(oneline,"")
Print Line$="mp"
c=(1,1,0,1,1,1,1,0,1,1,0)
\\ hard insert
Print c#pos(1,0,1) ' 1 means 2nd position
Print c#pos(3->1,0,1) ' 6 means 7th position
\\ using another tuple
Print c#pos((1,0,1)) ' 1 means 2nd position
Print c#pos(3->(1,0,1)) ' 6 means 7th position
t=(1,0,1)
Print c#pos(t) ' 1 means 2nd position
Print c#pos(3->t) ' 6 means 7th position
3. Προστέθηκε μια συνάρτηση αλφαριθμητικών η Αναπ$() ή StrRev$() η οποία γυρίζει ένα αλφαριθμητικό ανάποδα (το πρώτο γράμμα γίνεται τελευταίο).
Print StrRev$("abcd")="dcba"
η συνάρτηση αυτή χρησιμοποιεί την StrReverse της VB6, η οποία είναι μεν γρήγορη αλλά δεν είναι σωστή, όταν έχουμε συνδυασμούς γραμμάτων
Το παράδειγμα παρακάτω δείχνει πως γίνεται σε περίπτωση συνδιασμού γραμμάτων με χρήση κώδικα της Μ2000. Η len.disp() γυρίζει το μήκος εμφάνισης (όχι το μήκος του αλφαριθμητικού). Αυτό μπορεί να το κάνει γιατί για κάθε χαρακτήρα βρίσκει το μήκος του, και οι χαρακτήρες που συνδυάζονται με άλλους (πέφτουν πάνω τους δηλαδή), έχουν μηδενικό μήκος!Στην πραγματικότητα έχουν μήκος, αλλά όταν πριν ακολουθεί χαρακτήρεας...δεν έχουν και πάνε πίσω και γράφουν από πάνω! Στο παράδειγμα "s⃝df̅" και το s και το f έχουν από ένα συνδυασμένο χαρακτήρα. Θέλουμε η περιστροφή να κρατήσει στη σειρά τους συνδυασμένους χαρακτήρες (αλλιώς αυτοί θα συνδυαστούν με τους επόμενους χαρακτήρες (η οποίοι θα γίνουν στην περιστροφή ...προηγούμενοι).
Function DispRev$(a$) {
i=1: j=Len(a$): if j=0 then ="": exit
z$=String$(" ",j): j++
do {
k$=mid$(a$, i, 1)
if i<len(a$) then {
while len.disp(k$+mid$(a$, i+1,1)) =len.disp(k$) {
k$+=mid$(a$, i+1,1) : i++ : if i>len(a$) then exit
j-- } : j-- : insert j, len(k$) Z$=K$
} else j-- :Insert j,1 z$=k$
i++
} until i>len(a$)
=z$
}
Print DispRev$("abcd")="dcba"
Print DispRev$("")=""
Print DispRev$("s⃝df̅")="f̅ds⃝"
1. Μπορούμε πια να χρησιμοποιούμε πέρασμα με αναφορά στοιχεία πίνακα, και στατικές μεταβλητές. Χρησιμοποιείται ο μηχανισμός copy in copy out, όπου ο διερμηνευτής φτιάχνει πριν την κλήση μεταβλητές και περνάει αυτές με αναφορά (που κανονικά γίνεται) και στην επιστροφή ενημερώνει πίσω. Στις προηγούμενες εκδόσεις μπορούσαμε να περνάμε μόνο ολόκληρο το πίνακα με αναφορά (καθώς και με αντιγραφή, πέρασμα με τιμή), όπως επίσης οποιεσδήποτε μεταβλητές και συναρτήσεις.
static k=5
module In {
read &x, &b$, &k
x++
k++
print x, x*k
b$+="ok"
}
Dim a(10)=5, z$(30)="hello"
In &a(5), &z$(2), &k
Print a(5), z$(2), k
List
2. Οι αυτόματοι πίνακες ή tuple, καθώς και οι κανονικοί πίνακες (μόνο για αυτούς που έχουν όνομα σαν αριθμητική μεταβλητή),έχουν πια δικές τους συναρτήσεις που μπορούν να χρησιμοποιηθούν αθροιστικά. Θα αναφερθώ σε αυτά σε άλλη ανάρτηση, με παραδείγματα με ελληνικές εντολές
a=(1,2,3,4,5)
Print a#rev()
Print a#sum()=15
Print a#max()=5, a#min()=1
k=-1
L=-1
Print a#max(K)=5, a#min(L)=1
Print K=4 ' 5th position
Print L=0 ' 1st position
Print a#pos(3)=2 ' 3rd position
Print a#val(4)=5
\\ tuples in tuple
a=((1,2),(3,4))
Print a#val(0)#val(1)=2
Print a#val(1)#val(1)=4
a=(1,2,3,4,5,6,7,8,9)
fold1=lambda ->{
push number+number
}
Print a#fold(fold1)=a#sum()
Print a#fold(fold1,1)=a#sum()+1
even=lambda (x)->x mod 2=0
b=a#filter(even, (,))
Print b ' 2 4 6 8
Print a#filter(even)#fold(fold1)=20
map1=lambda (a)->{
push a+100
}
c=b#map(map1)
Print c ' 102,103, 104, 105
numbers=lambda p=1 (x) ->{
push x+p
p++
}
oldnumbers=numbers ' we get a copy of numbers with p=1
c=c#map(numbers)
Print c ' 103, 106, 109, 112
zfilter=lambda -> number>106
tostring=lambda -> {
push chrcode$(number)
}
oneline=lambda -> {
shift 2 ' get second as first
push letter$+letter$
}
Line$=c#filter(zfilter)#map(tostring)#fold$(oneline,"")
print Line$="mp", chrcode$(109)+chrcode$(112)
zfilter=lambda -> number>200
Line$=""
Line$=c#filter(zfilter)#map(tostring)#fold$(oneline,"")
\\ lines$ can't change value becuse filter has no items to give
Print Line$=""
\\ if we leave a second parameter without value the we get No Value error
Try {
Line$=c#filter(zfilter, )#map(tostring)#fold$(oneline,"")
}
Print error$=" No value"
\\ second parameter is the alternative source
Line$=c#filter(zfilter,(109,112))#map(tostring)#fold$(oneline,"")
Print Line$="mp"
c=(1,1,0,1,1,1,1,0,1,1,0)
\\ hard insert
Print c#pos(1,0,1) ' 1 means 2nd position
Print c#pos(3->1,0,1) ' 6 means 7th position
\\ using another tuple
Print c#pos((1,0,1)) ' 1 means 2nd position
Print c#pos(3->(1,0,1)) ' 6 means 7th position
t=(1,0,1)
Print c#pos(t) ' 1 means 2nd position
Print c#pos(3->t) ' 6 means 7th position
3. Προστέθηκε μια συνάρτηση αλφαριθμητικών η Αναπ$() ή StrRev$() η οποία γυρίζει ένα αλφαριθμητικό ανάποδα (το πρώτο γράμμα γίνεται τελευταίο).
Print StrRev$("abcd")="dcba"
η συνάρτηση αυτή χρησιμοποιεί την StrReverse της VB6, η οποία είναι μεν γρήγορη αλλά δεν είναι σωστή, όταν έχουμε συνδυασμούς γραμμάτων
Το παράδειγμα παρακάτω δείχνει πως γίνεται σε περίπτωση συνδιασμού γραμμάτων με χρήση κώδικα της Μ2000. Η len.disp() γυρίζει το μήκος εμφάνισης (όχι το μήκος του αλφαριθμητικού). Αυτό μπορεί να το κάνει γιατί για κάθε χαρακτήρα βρίσκει το μήκος του, και οι χαρακτήρες που συνδυάζονται με άλλους (πέφτουν πάνω τους δηλαδή), έχουν μηδενικό μήκος!Στην πραγματικότητα έχουν μήκος, αλλά όταν πριν ακολουθεί χαρακτήρεας...δεν έχουν και πάνε πίσω και γράφουν από πάνω! Στο παράδειγμα "s⃝df̅" και το s και το f έχουν από ένα συνδυασμένο χαρακτήρα. Θέλουμε η περιστροφή να κρατήσει στη σειρά τους συνδυασμένους χαρακτήρες (αλλιώς αυτοί θα συνδυαστούν με τους επόμενους χαρακτήρες (η οποίοι θα γίνουν στην περιστροφή ...προηγούμενοι).
Function DispRev$(a$) {
i=1: j=Len(a$): if j=0 then ="": exit
z$=String$(" ",j): j++
do {
k$=mid$(a$, i, 1)
if i<len(a$) then {
while len.disp(k$+mid$(a$, i+1,1)) =len.disp(k$) {
k$+=mid$(a$, i+1,1) : i++ : if i>len(a$) then exit
j-- } : j-- : insert j, len(k$) Z$=K$
} else j-- :Insert j,1 z$=k$
i++
} until i>len(a$)
=z$
}
Print DispRev$("abcd")="dcba"
Print DispRev$("")=""
Print DispRev$("s⃝df̅")="f̅ds⃝"
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.