Ανανεώθηκε κώδικας - έχει σημειωθεί με κίτρινο φόντο- για να τρέχει σωστά στις νέες εκδόσεις της Μ2000. Η διαφορά είναι στη χρήση του <=. Με το παλιό απλό = ο διερμηνευτής έφτιαχνε νέες τοπικές. Με το <= αυτό που δίνουμε ως ισχνή είναι ως γενική οπότε το βρίσκει ο διερμηνευτής και του αλλάζει τιμή.
Σε αυτήν την αναθεώρηση επίλυσα ζητήματα συμβατότητας με παλαιότερες εκδόσεις. Πάντα αναζητώ παλιά προγράμματα να δω πώς εκτελούνται και έτσι βγάζω συμπέρασμα για το κατά πόσο είναι ο διερμηνευτής οκ. Χθες χτύπησε αλαρμ σε δυο περιπτώσεις.
Επειδή από την 8.4 απλποποίησα ένα βασικό τμήμα του κώδικα, δημιουργήθηκαν προβλήματα και μέσα σε μια βδομάδα ξεπεράστηκαν.
Αυτό είχε επιλυθεί σε προηγούμεν αναθεώρηση. Να έχουμε ένα τμήμα με όνομα εντολής. Τώρα ο διερμηνευτής αλλάζει το όνομα, αλλά μόνο για το χρόνο που το τμήμα που δημιούργησε την αλλαγή, τρέχει. Είναι στα αγγλικά. Δείχνει και πώς να τυπώσουμε τιμές boolean, ή λογικές. Καλούμε το τμήμα Print αλλά αυτό αφήνει τις ορίσματα στο σωρό για να τα πάρει η UnderPrint. Δεν χρειάζονταν αυτό
Module Print {
\\ Here Print is not original too
Print 10,20,30
Stack \\ show stack
Module UnderPrint {
\\ here Print is Original
Stack \\ we have the same stack
While not empty {
\\ we don't want to catch error (a string in stack isn't proper here)
Try {
Read a
Print $("\t\r\u\e;\t\r\u\e;\f\a\l\s\e"), a,$("")
if width-pos<tab then print
}
}
}
UnderPrint
}
\\ Here Print is not original
\\
Print -1,0,3
\\ We can call original with @
@Print -1, 0, 3
Το παρακάτω είναι από τη νέα αναθεώρηση. Αντιγράψτε τα και τρέξετε τα!
Επειδή από την 8.4 απλποποίησα ένα βασικό τμήμα του κώδικα, δημιουργήθηκαν προβλήματα και μέσα σε μια βδομάδα ξεπεράστηκαν.
Αυτό είχε επιλυθεί σε προηγούμεν αναθεώρηση. Να έχουμε ένα τμήμα με όνομα εντολής. Τώρα ο διερμηνευτής αλλάζει το όνομα, αλλά μόνο για το χρόνο που το τμήμα που δημιούργησε την αλλαγή, τρέχει. Είναι στα αγγλικά. Δείχνει και πώς να τυπώσουμε τιμές boolean, ή λογικές. Καλούμε το τμήμα Print αλλά αυτό αφήνει τις ορίσματα στο σωρό για να τα πάρει η UnderPrint. Δεν χρειάζονταν αυτό
Module Print {
\\ Here Print is not original too
Print 10,20,30
Stack \\ show stack
Module UnderPrint {
\\ here Print is Original
Stack \\ we have the same stack
While not empty {
\\ we don't want to catch error (a string in stack isn't proper here)
Try {
Read a
Print $("\t\r\u\e;\t\r\u\e;\f\a\l\s\e"), a,$("")
if width-pos<tab then print
}
}
}
UnderPrint
}
\\ Here Print is not original
\\
Print -1,0,3
\\ We can call original with @
@Print -1, 0, 3
Το παρακάτω είναι από τη νέα αναθεώρηση. Αντιγράψτε τα και τρέξετε τα!
Μπήκε το <= στο κίτρινο σημειωμένο κώδικα. (για έκδοση >=9)
Ομάδα Αλφα {
Ιδιότητα Μήκος=100
Ιδιότητα Πλάτος=100
}
Πίνακας Α(10)=Αλφα
Λίστα
Τύπωσε Α(1).Μήκος
Τμήμα Δοκ1 {
Διάβασε Ισχ$
Τύπωσε Ισχ$
Ισχ$. <=200
Τύπωσε Εκφρ(Ισχ$)
}
Δοκ1 Ισχνή$(Α(1).Μήκος)
Τύπωσε Α(1).Μήκος
Και εδώ με ιδιότητα αλφαριθμητικό
Τμήμα ΚάτιΆλλο {
Ομάδα Αλφα {
Ιδιότητα Όνομα$="Κάτι"
Ιδιότητα Μήκος=100
Ιδιότητα Πλάτος=100
}
Τύπωσε άλφα.Όνομα$
Πίνακας Α(10)=Αλφα
Τύπωσε Α(1).Όνομα$
Τμήμα Δοκ1 {
Διάβασε Ισχ1$, Ισχ2$
Τύπωσε εκφρ$(Ισχ1$.), εκφρ(Ισχ2$.)
Ισχ1$. <="Οκ"
Ισχ2$.<=200
}
Δοκ1 Ισχνή$(Α(1).Όνομα$), Ισχνή$(Α(1).Μήκος)
Τύπωσε Α(1).Όνομα$, Α(1).Μήκος
}
Κάλεσε ΚάτιΆλλο
Το παρακάτω πρόγραμμα δοκιμής "κτύπαγε",,,στην προηγούμενη (αναθεώρηση 5). Το πρόγραμμα δοκιμάζει και δίνει σχετικούς χρόνους κατά το πέρασμα ομάδας, με αντιγραφή, με αναφορά, με ισχνή αναφορά. Η ισχνή αναφορά είναι ο γρηγορότερος τρόπος, αφού περνάει την "Απόλυτη" διεύθυνση του αντικειμένου. Λέγεται ισχνή γιατί δεν κρατάει το αντικείμενο, και αν την αποθηκεύσουμε τότε μπορεί να μην είναι έγκυρη σε άλλο χρόνο. Στο παράδειγμα αυτό δεν φαίνεται ότι μπορούμε να δώσουμε στοιχείο πίνακα (κάτι που δεν γίνεται με κανονική αναφορά, γιατί η κανονική αναφορά περνάει ότι έχει όνομα, και όχι ότι έχει όνομα και δείκτη/δείκτες όπως ο πίνακας). Για στοιχείο πίνακα θα έπρεπε να περνάγαμε με αναφορά τον πίνακα και χωριστά τους δείκτες. Η συνάρτηση ισχνή$() βρίσκει το πίνακα, και εκτελεί για όλες τις διαστάσεις τις εκφράσεις, και βάζει το πίνακα με τις τιμές σε αλφαριθμητικό, μαζί με το αθέατο όνομα της πραγματικής θέσης στο σύστημα. Οπότε όσο ο πίνακας υπάρχει μπορούμε να δώσουμε για "Εκμετάλλευση", την ισχνή αναφορά.
(δεν είχε μπει όλος ο κώδικας...στην αρχική ανάρτηση)
Φόρμα 64,32
\\ Ορίζουμε πώς θα βγαίνουν οι αριθμοί
Τύπωσε $("0.0")
Συνάρτηση Τετρ1 {
για Γράμμα$ { =.αλφα**2}
}
Συνάρτηση Τετρ2 {
διαβασε &ΑΑΑ
=ΑΑΑ.αλφα**2
}
Συνάρτηση Τετρ3 {
διαβασε ΑΑΑ
=ΑΑΑ.αλφα**2
}
Ομαδα ΑΑ {
a,b,c,d,f,g,k,l,m
Ομαδα ββ1 { a,b,c,d,f,g,k,l,m }
Ομαδα ββ2 { a,b,c,d,f,g,k,l,m }
Ομαδα ββ3 { a,b,c,d,f,g,k,l,m }
Ομαδα ββ4 { a,b,c,d,f,g,k,l,m }
αλφα$="δοκιμη"
αλφα=4
συναρτηση αλφα {=.αλφα}
τμημα αλφα {διαβασε .αλφα }
συναρτηση αλφα$ {=.αλφα$}
}
κ$=ισχνη$(ΑΑ)
κ1$=ισχνη$(ΑΑ.αλφα)
Τύπωσε εκφρ(κ1$)
Τύπωσε συνάρτηση(κ$.αλφα)
Τύπωσε συνάρτηση(κ$.αλφα)
κ$.αλφα 100
Τύπωσε συνάρτηση(κ$.αλφα)
Τύπωσε συνάρτηση$(κ$.αλφα$)
Αναλυτής
για ι=1 έως 1000 {
kk=Τετρ1(κ$)
}
a= Φόρτος
Αναλυτής
για ι=1 έως 1000 {
kk=Τετρ2(&ΑΑ)
}
b= Φόρτος
Αναλυτής
για ι=1 έως 1000 {
kk=Τετρ3(ΑΑ)
}
c= Φόρτος
Αναλυτής
για ι=1 έως 1000 {
kk=ΑΑ.αλφα**2
}
d= Φόρτος
Τύπωσε a,"","ΙΣΧΝΗ"
Τύπωσε b, ακ(b/a*100)-100, "% ισχνή/κανονική αναφορά"
Τύπωσε c, ακ(c/a*100)-100, "% ισχνή/αντιγραφή"
Τύπωσε d, ακ(a/d*100)-100, "% απευθείαs/Ισχνή"
\\ όσο περισσότερες υποομάδες βάζουμε, ή όσα περισσότερα στοιχεία έχει η ομάδα το πέρασμα με κανονική αναφορά γίνεται πιο αργό
\\ γιατί δημιουργούνται όλα τα στοιχεία με αναφορά εντός της συνάρτησης, και η "ονοματοδοσία" είναι ένα κόστος
Τέλος ένα πρόγραμμα επίδειξης, με αντικείμενα στην οθόνη, τα οποία περιστρέφονται και μετακινούνται ΄"άτακτα" αν τα "χαιδεύουμε", δηλαδή αν κουνάμε το ποντίκι μπρος πίσω, και μαζεύονται όταν πατάμε τοα αριστερό πλήκτρο του ποντικιού. Με το δεξί πλήκτρο του ποντικιού τερματίζει!
\\ Slow, Fast and Fast !
\\ Normal is Fast
Set Fast !
Rem Try To unhide this line : Test "flowers"
N=Random(!123567)
N=7
Dim Px(N+1), Py(N+1), Pz(N+1)
For i=1 To N { \\ x.twips and y.twips are the resolution of the displayed form in twips.
Px(i)=random(50,1100)*15
Py(i)=random(50, 800)*15
Pz(i)=random(2,6)*500
}
Dim Dx(100),Dy(100)
For i=0 To 99 {
Dx(i)=COS(i*36)*150
Dy(i)=SIN(I*27)*150
}
Let mx=Mouse.X, my=Mouse.Y
Let kk=Pi/5, kkk=kk, mx1=mx, my1=my, nnn=100, m=0
Refresh 1000
Cls #1155AA, 0
j=0
Repeat {
Cls
j++
nnn= nnn Mod 64
For i=1 To N { \\ x.twips and y.twips are the resolution of the displayed form in twips.
Px(i)+=Dx((j+3*i) Mod 100) +mx1-mx
Py(i)+=Dy((j+i) Mod 100) +my1-my
Let mx1=mx, my1=my
Move Px(i),Py(i)
\\ M2000 have intresting blocks, like the Witdh { } block, to change line width inside it, or Pen {} block to alter pen color, Path {} block to alter region, area and fill transparency.
Width 5 { \\ setting line width
Pen #AA6600 { \\using colors like html hex values
nnn+=kk
kkk=Pi-nnn/Pi
For q=Pi/8 To 2*Pi-Pi/8 Step Pi/4 {
Move Px(i), Py(i)
Path #FF66FF, abs(m) { curve angle Pi/3+q-kkk, Pz(i)/6,Pi/4+q-kkk,Pz(i),Pi+q-kkk,Pz(i)*2/3 }
}
Move Px(i),Py(i)
Circle Fill #FFAA20, Pz(i)/3
}
}
m=Keypress(1)
If m then {
px(i)=Mouse.X
py(i)=Mouse.Y
}
mx=Mouse.X
my=Mouse.Y
}
Refresh 1000
} Until Keypress(2)
Hold \\ save screen to memory
Move Scale.X/2, Scale.Y/2
Def speed(i)=1.45*i
For i=1 To 100 {
Legend "Game Over","ARIAL BLACK", speed(i), i/180,2,0
Refresh 1000
Wait 30
release \\ copy from memory
}
Cls
Ομάδα Αλφα {
Ιδιότητα Μήκος=100
Ιδιότητα Πλάτος=100
}
Πίνακας Α(10)=Αλφα
Λίστα
Τύπωσε Α(1).Μήκος
Τμήμα Δοκ1 {
Διάβασε Ισχ$
Τύπωσε Ισχ$
Ισχ$. <=200
Τύπωσε Εκφρ(Ισχ$)
}
Δοκ1 Ισχνή$(Α(1).Μήκος)
Τύπωσε Α(1).Μήκος
Και εδώ με ιδιότητα αλφαριθμητικό
Τμήμα ΚάτιΆλλο {
Ομάδα Αλφα {
Ιδιότητα Όνομα$="Κάτι"
Ιδιότητα Μήκος=100
Ιδιότητα Πλάτος=100
}
Τύπωσε άλφα.Όνομα$
Πίνακας Α(10)=Αλφα
Τύπωσε Α(1).Όνομα$
Τμήμα Δοκ1 {
Διάβασε Ισχ1$, Ισχ2$
Τύπωσε εκφρ$(Ισχ1$.), εκφρ(Ισχ2$.)
Ισχ1$. <="Οκ"
Ισχ2$.<=200
}
Δοκ1 Ισχνή$(Α(1).Όνομα$), Ισχνή$(Α(1).Μήκος)
Τύπωσε Α(1).Όνομα$, Α(1).Μήκος
}
Κάλεσε ΚάτιΆλλο
Το παρακάτω πρόγραμμα δοκιμής "κτύπαγε",,,στην προηγούμενη (αναθεώρηση 5). Το πρόγραμμα δοκιμάζει και δίνει σχετικούς χρόνους κατά το πέρασμα ομάδας, με αντιγραφή, με αναφορά, με ισχνή αναφορά. Η ισχνή αναφορά είναι ο γρηγορότερος τρόπος, αφού περνάει την "Απόλυτη" διεύθυνση του αντικειμένου. Λέγεται ισχνή γιατί δεν κρατάει το αντικείμενο, και αν την αποθηκεύσουμε τότε μπορεί να μην είναι έγκυρη σε άλλο χρόνο. Στο παράδειγμα αυτό δεν φαίνεται ότι μπορούμε να δώσουμε στοιχείο πίνακα (κάτι που δεν γίνεται με κανονική αναφορά, γιατί η κανονική αναφορά περνάει ότι έχει όνομα, και όχι ότι έχει όνομα και δείκτη/δείκτες όπως ο πίνακας). Για στοιχείο πίνακα θα έπρεπε να περνάγαμε με αναφορά τον πίνακα και χωριστά τους δείκτες. Η συνάρτηση ισχνή$() βρίσκει το πίνακα, και εκτελεί για όλες τις διαστάσεις τις εκφράσεις, και βάζει το πίνακα με τις τιμές σε αλφαριθμητικό, μαζί με το αθέατο όνομα της πραγματικής θέσης στο σύστημα. Οπότε όσο ο πίνακας υπάρχει μπορούμε να δώσουμε για "Εκμετάλλευση", την ισχνή αναφορά.
(δεν είχε μπει όλος ο κώδικας...στην αρχική ανάρτηση)
Φόρμα 64,32
\\ Ορίζουμε πώς θα βγαίνουν οι αριθμοί
Τύπωσε $("0.0")
Συνάρτηση Τετρ1 {
για Γράμμα$ { =.αλφα**2}
}
Συνάρτηση Τετρ2 {
διαβασε &ΑΑΑ
=ΑΑΑ.αλφα**2
}
Συνάρτηση Τετρ3 {
διαβασε ΑΑΑ
=ΑΑΑ.αλφα**2
}
Ομαδα ΑΑ {
a,b,c,d,f,g,k,l,m
Ομαδα ββ1 { a,b,c,d,f,g,k,l,m }
Ομαδα ββ2 { a,b,c,d,f,g,k,l,m }
Ομαδα ββ3 { a,b,c,d,f,g,k,l,m }
Ομαδα ββ4 { a,b,c,d,f,g,k,l,m }
αλφα$="δοκιμη"
αλφα=4
συναρτηση αλφα {=.αλφα}
τμημα αλφα {διαβασε .αλφα }
συναρτηση αλφα$ {=.αλφα$}
}
κ$=ισχνη$(ΑΑ)
κ1$=ισχνη$(ΑΑ.αλφα)
Τύπωσε εκφρ(κ1$)
Τύπωσε συνάρτηση(κ$.αλφα)
Τύπωσε συνάρτηση(κ$.αλφα)
κ$.αλφα 100
Τύπωσε συνάρτηση(κ$.αλφα)
Τύπωσε συνάρτηση$(κ$.αλφα$)
Αναλυτής
για ι=1 έως 1000 {
kk=Τετρ1(κ$)
}
a= Φόρτος
Αναλυτής
για ι=1 έως 1000 {
kk=Τετρ2(&ΑΑ)
}
b= Φόρτος
Αναλυτής
για ι=1 έως 1000 {
kk=Τετρ3(ΑΑ)
}
c= Φόρτος
Αναλυτής
για ι=1 έως 1000 {
kk=ΑΑ.αλφα**2
}
d= Φόρτος
Τύπωσε a,"","ΙΣΧΝΗ"
Τύπωσε b, ακ(b/a*100)-100, "% ισχνή/κανονική αναφορά"
Τύπωσε c, ακ(c/a*100)-100, "% ισχνή/αντιγραφή"
Τύπωσε d, ακ(a/d*100)-100, "% απευθείαs/Ισχνή"
\\ όσο περισσότερες υποομάδες βάζουμε, ή όσα περισσότερα στοιχεία έχει η ομάδα το πέρασμα με κανονική αναφορά γίνεται πιο αργό
\\ γιατί δημιουργούνται όλα τα στοιχεία με αναφορά εντός της συνάρτησης, και η "ονοματοδοσία" είναι ένα κόστος
Τέλος ένα πρόγραμμα επίδειξης, με αντικείμενα στην οθόνη, τα οποία περιστρέφονται και μετακινούνται ΄"άτακτα" αν τα "χαιδεύουμε", δηλαδή αν κουνάμε το ποντίκι μπρος πίσω, και μαζεύονται όταν πατάμε τοα αριστερό πλήκτρο του ποντικιού. Με το δεξί πλήκτρο του ποντικιού τερματίζει!
\\ Slow, Fast and Fast !
\\ Normal is Fast
Set Fast !
Rem Try To unhide this line : Test "flowers"
N=Random(!123567)
N=7
Dim Px(N+1), Py(N+1), Pz(N+1)
For i=1 To N { \\ x.twips and y.twips are the resolution of the displayed form in twips.
Px(i)=random(50,1100)*15
Py(i)=random(50, 800)*15
Pz(i)=random(2,6)*500
}
Dim Dx(100),Dy(100)
For i=0 To 99 {
Dx(i)=COS(i*36)*150
Dy(i)=SIN(I*27)*150
}
Let mx=Mouse.X, my=Mouse.Y
Let kk=Pi/5, kkk=kk, mx1=mx, my1=my, nnn=100, m=0
Refresh 1000
Cls #1155AA, 0
j=0
Repeat {
Cls
j++
nnn= nnn Mod 64
For i=1 To N { \\ x.twips and y.twips are the resolution of the displayed form in twips.
Px(i)+=Dx((j+3*i) Mod 100) +mx1-mx
Py(i)+=Dy((j+i) Mod 100) +my1-my
Let mx1=mx, my1=my
Move Px(i),Py(i)
\\ M2000 have intresting blocks, like the Witdh { } block, to change line width inside it, or Pen {} block to alter pen color, Path {} block to alter region, area and fill transparency.
Width 5 { \\ setting line width
Pen #AA6600 { \\using colors like html hex values
nnn+=kk
kkk=Pi-nnn/Pi
For q=Pi/8 To 2*Pi-Pi/8 Step Pi/4 {
Move Px(i), Py(i)
Path #FF66FF, abs(m) { curve angle Pi/3+q-kkk, Pz(i)/6,Pi/4+q-kkk,Pz(i),Pi+q-kkk,Pz(i)*2/3 }
}
Move Px(i),Py(i)
Circle Fill #FFAA20, Pz(i)/3
}
}
m=Keypress(1)
If m then {
px(i)=Mouse.X
py(i)=Mouse.Y
}
mx=Mouse.X
my=Mouse.Y
}
Refresh 1000
} Until Keypress(2)
Hold \\ save screen to memory
Move Scale.X/2, Scale.Y/2
Def speed(i)=1.45*i
For i=1 To 100 {
Legend "Game Over","ARIAL BLACK", speed(i), i/180,2,0
Refresh 1000
Wait 30
release \\ copy from memory
}
Cls
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.