Σάββατο 18 Μαρτίου 2017

Αναθεώρηση 3 της έκδοσης 8.5

Πολύ καλή η αναθεώρηση 3. Δουλεύτηκε αρκετά και αφαιρέθηκαν Bug και προστέθηκε λειτουργικότητα!

Σε αυτό το σημείο για υπενθύμιση:
Περί θέασης Μεταβλητών
Στη Μ2000 η  θέαση μεταβλητών περιορίζεται στις τοπικές στο τμήμα/συνάρτηση, και φυσικά σε οποιαδήποτε γενική (οι τοπικές σκιάζουν τις γενικές αν έχουν ίδιο όνομα, και μια δημιουργία γενικής εντός τμήματος σκιάζει γενική με ίδιο όνομα, στην έξοδο οι σκιάσεις αφαιρούνται, αν καλέσουμε ένα γενικό τμήμα που φτιάχτηκε πριν από αυτό που καλούμε τότε θα δει την παλαιότερη γενική και όχι την νέα). (Για τις ρουτίνες δεν αναφέρω εδώ για να μην προκαλέσω σύγχυση...)

Στις ομάδες η θέαση είναι μεγαλύτερη, τα τμήματα και οι συναρτήσεις (και οι τελεστές) βλέπουν ότι έχει η ομάδα, αρκεί να βάλουμε μια τελεία στην αρχή. Για αντικατάστη τιμών χρησιμοποιούμε το <= εκτός και αν είναι αντικείμενο που θέλει ειδική εντολή για να γίνει οπότε αρκεί το =.
Επειδή οι ομάδες μπορούν να έχουν ομάδες, η θέαση μεταβλητών προς τα πάνω, προς το πατρικό, δεν είναι δυνατόν, επειδή στην ομάδα εντός δεν  υπάρχει κάτι που να λέει "ανήκεις στην τάδε ομάδα". Όταν έφτιαξα τις ιδιότητες ήθελα η μεταβλητή πίσω από την ιδιότητα να μην είναι εντός της ιδιότητας. Επειδή η ιδιότητα σχεδιάστηκε να είναι ομάδα, έπρεπε να βρεθεί τρόπος να διαβάζουμε κάτι από τη γονική ομάδα (ακόμα και αν είναι κρυφό, όπως ό,τι είναι Ιδιωτικό). Αυτό λοιπόν το κάνει η εντολή Ένωσε Γονικό. Στην ουσία αυτή η εντολή υποθέτει ότι υπάρχει γονικό, βάζει την υποτιθέμενη ισχνή αναφορά (μια διεύθυνση) και καλεί μια Διάβασε να βγάλει τα κάστανα από τη φωτιά, η οποία αν πετύχει κάνει την γνήσια αναφορά, αν όχι βγάζει λάθος!

Σε επόμενη ανάρτηση θα δείξω και τη προσθήκη της ετικέτας Κλάση: στους ορισμούς Κλάσεων


Πήρα το παράδειγμα από το εγχειρίδιο Τεύχος 5 και το έφτιαξα με ιδιότητες.
Η κλάση Αυτοκίνητα πρέπει να φορτώνει ένα αντικείμενο (το μοντέλο) και να το κρατάει κλειστό, μέσα σε πίνακα (Μοντέλ(1)). Αυτό γίνεται γιατί δεν μπορούμε να πάρουμε την αναφορά στην ομάδα, αλλά θα πάρουμε αντίγραφο στη θέση του πίνακα (δεν έχει όνομα η ομάδα αυτή αλλά θέση πίνακα).
Η εντολή Ιδιότητα φτιάχνει άλλες εντολές και τις βάζει σε μια ομάδα με το όνομα της ιδιότητας. Εϊναι μια μακροεντολή, όπου συνθέτει κάτι αλλά δεν το πραγματοποιεί, απλά ο κώδικας θα δώσει το τελικό αποτέλεσμα. Μπορούμε να φτιάχνουμε ιδιότητες χωρίς τη χρήση της εντολής Ιδιότητα. Δείτε στην κλάση Αυτοκίνητα την ομάδα Μοντέλο. Έχει δυο τμήματα, το Αξία και το Θέσε, που σημαίνει ότι δίνει τιμή (Αξία) και λαμβάνει (θέσε). Επειδή οι ομάδες δεν βλέπουν προς το γονικό απ΄ευθείας θα πρέπει να γίνει μέσω αναφοράς. Η ένωσε γονικό φτιάχνει την αναφορά που θέλουμε. Και στην εντολή ιδιότητα υπάρχει αυτή η εντολή και ο διερμηνευτής παίρνει το όνομα της ιδιότητας έστω  Χ φτιάχνει στο γονικό την [Χ] και εκτλεί εντός της Αξία την Ένωσε Γονικό [Χ] στο Χ.


\\Παράδειγμα με αντικείμενα για την αναπαράσταση δεδομένων,
\\για μια έκθεση μεταχειρισμένων αυτοκινήτων.
Κλάση Αυτοκίνητα {
Ιδιωτικό:
      άδειες,
      Πίνακας Βάση 0, Άδειες(), Μοντέλ(1)
Δημόσιο:
      Ιδιότητα Έτος {Αξία}
      Ιδιότητα αρ_πλαισίου$ {Αξία}
      Ιδιότητα χρώμα$ {Αξία}
      Ιδιότητα εξοπλισμός$ {Αξία}
      \\ Ιδιότητα ως κατασκευή με Ομάδα
      Ομάδα Μοντέλο {
                  Αξία {
                        Ένωσε Γονικό Μοντέλ() στο Μοντ()
                        =Μοντ(0)
                  }
                  Θέσε {
                        Ένωσε Γονικό Μοντέλ() στο Μοντ()
                        Διάβασε Μοντ(0)
                  }
            }
      Ιδιότητα ΠρώτηΆδεια {
            Αξία {
                  Ένωσε Γονικό άδειες στο άδειες
                  Ένωσε Γονικό άδειες() στο άδειες()
                  Αν άδειες>0 τότε {
                        Αξία=άδειες(0)
                  } Αλλιώς {
                        ομάδα Α { Όνομα$ }
                        Αξία=Α
                  }
            }        
      }
      Ιδιότητα ΤελευταίαΆδεια {
            Αξία {
                  Ένωσε Γονικό άδειες στο άδειες
                  Ένωσε Γονικό άδειες() στο άδειες()
                  Αν άδειες>0 τότε {
                        Αξία=άδειες(άδειες-1)
                  } Αλλιώς {
                        ομάδα Α { Όνομα$ }
                        Αξία=Α
                  }
            }
      }
      Τμήμα Εισαγωγή_Αυτοκινήτου {
            Αν .αρ_πλαισίου$="" τότε {
                  Διάβασε .[αρ_πλαισίου]$, .[χρώμα]$, .[εξοπλισμός]$, .[Έτος]
                  Αν .αρ_πλαισίου$="" ή .χρώμα$="" ή .εξοπλισμός$="" τότε {
                        .[αρ_πλαισίου]$<=""
                        Λάθος "Λάθος στοιχεία"
                        }
              Διάβασε .Μοντελ(0)
            }
      }
      \\ Όμοια με το Νέα_Άδεια1, μόνο διαβάζει δεν διαβάζεται
      \\ Αντί της Ιδιότητας που χρησιμοποιεί τα αναγνωριστικά Αξία, Αξία$
      \\ εδώ μας αρκεί η απλή κατασκευή ιδιότητας!
      Ομάδα Νέα_Αδεια {
            Θέσε {
                  Αν Ταύτιση("Ο") τότε {
                        Ένωσε Γονικό άδειες στο άδειες
                        Ένωσε Γονικό άδειες() στο άδειες()
                        άδειες++
                        Πίνακας Άδειες(άδειες)
                        Διάβασε Άδειες(άδειες-1)
                  }
            }
      }
      Τμήμα Άδειασε_Η_Θέση {
                  .άδειες<=0
                  Πίνακας Βάση 0, .Άδειες()
                  Πίνακας Βάση 0, Μοντέλ()
                  Πίνακας Βάση 0, Μοντέλ(1)
                  .[αρ_πλαισίου]$=""
      }
}
Κλάση Αυτοκίνητο {
Ιδιωτικό:
      Ειδος_Μηχανής
      άλλοείδος$
Δημόσιο:
      Ιδιότητα Μάρκα$ {Αξία}
      Ιδιότητα Επιβάτες {Αξία}
      Ιδιότητα Κυβικά {Αξία}
      Ιδιότητα Ισχύς {Αξία}
      Ιδιότητα Αυτοδυναμία {Αξία}
      Ιδιότητα ΤύποςΜηχανής$ {
            Αξία {
                  Ένωσε Γονικό Ειδος_Μηχανής στο Ειδος_Μηχανής
                  Ένωσε Γονικό άλλοείδος$ στο άλλοείδος$
                  Αν Ειδος_Μηχανής<>0 τότε {
                        Επίλεξε Με Ειδος_Μηχανής
                        Με 1
                              Βάλε "ΠΕΤΡΕΛΑΙΟ"
                        Με 2
                              Βάλε "ΒΕΝΖΙΝΗ"
                        Με 3
                              Βάλε "ΗΛΕΚΤΡΙΚΟ"
                        Αλλιώς
                              Βάλε άλλοείδος$
                        Τέλος Επιλογής
                        Διάβασε Αξία$
                 }
           }
      }
Κλάση:
      Τμήμα Αυτοκίνητο {
            Αν .[Μάρκα]$="" τότε {
                  Αν Ταύτιση("ΓΑΑΑΓΑ") τότε Διάβασε .[Μάρκα]$, .[Επιβάτες], .[Κυβικά], .[Ισχύς], Λεκτικό$, .[Αυτοδυναμία]
                  Επίλεξε με Κεφ$(Λεκτικό$)
                  Με "DIESEL", "ΠΕΤΡΕΛΑΙΟ"
                        .Ειδος_Μηχανής<=1
                  Με "GASOLINE","ΒΕΝΖΙΝΗ"
                        .Ειδος_Μηχανής<=2
                  Με "ELECTRICITY","ΗΛΕΚΤΡΙΚΟ"
                        .Ειδος_Μηχανής<=3
                  Αλλιώς
                  {
                        .Ειδος_Μηχανής<=99
                        .άλλοείδος$<=Κεφ$(Λεκτικό$)
                  }
                  Τέλος Επιλογής
            }
      }
}
Κλάση Άδεια {
      Ιδιότητα Όνομα$ {Αξία}
      Ιδιότητα Έτος {Αξία}
      Ιδιότητα Μήνας {Αξία}
      Ιδιότητα ΑΦΜ$ {Αξία}
Κλάση:
      Τμήμα Άδεια {
            Διάβασε .[Όνομα]$, .[Έτος], .[Μήνας], .[ΑΦΜ]$
      }
}


\\ Το πρόγραμμα ξεκινάει εδώ:  Φτιάχνουμε ένα αντικείμενο για το αυτοκίνητο
Μοντέλο1=Αυτοκίνητο("SCODA FELICIA", 5, 1289, 50,"ΒΕΝΖΙΝΗ", 400)


\\ έστω η έκθεση έχει 20 θέσεις για αυτοκίνητα
ΠΙΝΑΚΑΣ Βάση 1, Έκθεση(20)=Αυτοκίνητα()


\\ Θα βάλουμε σε θέση1 και θέση2 αυτοκίνητα ίδιου μοντέλου, αλλά με διαφορές σε αριθμό πλαισίου, χρώμα, επίπεδο εξοπλισμού, χρονολογία κατασκευής.
Έκθεση(1).Εισαγωγή_Αυτοκινήτου "B123XV54JKL01309","BLUE","LS", 1995, Μοντέλο1
Έκθεση(2).Εισαγωγή_Αυτοκινήτου "B124XV14JKL01507","GREEN METALIC","XLS", 1995, Μοντέλο1
\\ Θα βάλουμε σε κάθε αμάξι τις άδειες που έχει βγάλει δίνοντας όνομα κατόχου, έτος, μήνας και ΑΦΜ.
Έκθεση(1).Νέα_Αδεια=Αδεια("ΧΑΛΑΣΤΡΑΣ ΧΑΡΗΣ",1995,10,"045451234")
Έκθεση(1).Νέα_Άδεια=Αδεια("ΧΑΛΑΣΤΡΑΣ ΠΑΝΑΓΙΩΤΗΣ",2004,3,"055477651")
Έκθεση(2).Νέα_Άδεια=Αδεια("ΓΑΡΓΑΛΑΣ ΜΑΚΗΣ",1995,8,"049454556")
\\ Η καταχώρηση έγινε!
Φόρμα 80, 40
Διπλά
Αναφορά 2, "Έκθεση Αυτοκινήτων"
Κανονικά


Τύπωσε $(4,20),
Για Ι=1 Έως 20 {
      Πένα 13 {
            Τύπωσε $(4,10), ΜΟΡΦΗ$("Α/Α:{0}",Γραφή$(Ι,"00")),
      }
      Για Έκθεση(Ι) {
        Αν .Αρ_Πλαισίου$="" Τότε Έξοδος
        Τύπωσε
            \\ παίρνουμε από ένα αντίγραφο, από τα εσωτερικά αντικείμενα.
            Στη Μοντελο=.Μοντέλο, Άδεια=.ΠρώτηΆδεια, Τελευταία=.ΤελευταίαΆδεια
            Για Μοντέλο {
                  Τύπωσε "Μάρκα:",..Μάρκα$
                  Τύπωσε "Επίπεδο Εξοπλισμου:", @(Στηλη(1)),.Εξοπλισμός$
                  Τύπωσε "Χρώμα:",.Χρώμα$
                  Τύπωσε "Έτος Παραγωγής:",Γραφή$(.Έτος, "#")
                  Για Άδεια {
                        Αν ...Όνομα$<>"" Τότε {
                              Τύπωσε "Πρώτη 'Αδεια:",Μορφη$("{0}/{1}", ...Μήνας, ...Έτος)
                        } Αλλιώς {
                              Τύπωσε "Πρώτη 'Αδεια:","-"
                        }
                  }
                  Για Τελευταία {
                        Αν ...Όνομα$<>"" Τότε {
                              Τύπωσε "Τελευταία 'Αδεια:",Μορφη$("{0}/{1}", ...Μήνας, ...Έτος)
                        } Αλλιώς {
                              Τύπωσε "Τελευταία 'Αδεια:","-"
                        }
                  }
                  Τύπωσε "Αρ. Πλαισίου:",.Αρ_Πλαισίου$
                  Τύπωσε "Επιβάτες:", Γραφή$(..Επιβάτες,{# "άτομα"})
                  Τύπωσε "Κυβικά:", Γραφή$(..Κυβικά,{#" cc"})
                  Τύπωσε "Ισχύς:", Γραφή$(..Ισχύς,{#" hp"})
                  Τύπωσε "Κινητήρας:", ..ΤύποςΜηχανής$
                  Τύπωσε "Αυτοδυναμία:", Γραφή$(..Αυτοδυναμία,{#" Km"})
            }
      }    
}



Πέμπτη 16 Μαρτίου 2017

Έκδοση 8.5

Τελειοποίησα τις ιδιότητες των αντικειμένων με τη δυνατότητα να έχουν δείκτες οποιοδήποτε αριθμό μεταβλητών (ακόμα και πέρασμα με αναφορά δέχεται ο διερμηνευτής). Επιπλέον και το τμήμα Value ή Αξία που επιστρέφει την τιμή της ιδιότητας, έγινε Value ή Value$ (Αξία ή Αξία$), η οποία παίρνει αρχική τιμή την τιμή της ιδιότητας και μπορούμε να την αλλάξουμε πριν τη δώσουμε, χωρίς να αλλάξουμε την τιμή της ιδιότητας.

Παραδείγματα

Group alpha {
      Property Multi {
            value (index) {
                  Multi++
                  value=Multi
            }
            set (index) {
                  value*=index
            }
       }=100
      Module Look {
            Print .[Multi]
            }      
}


Print alpha.Multi(3), alpha.Multi(2)
alpha.Multi(23)=10
alpha.Look
Print alpha.Multi(2), alpha.Multi(2)


Παράδειγμα με χρήση αντικειμένων σε πίνακα
Group alpha {
      Property Multi {
            value (Index) {
                  Multi++
            }
            set (index) {
                  value*=index
            }
       }=100


}
dim a(10)=alpha
Print a(1).Multi(3), a(1).Multi(2)
a(1).Multi(3)=10
Print a(1).Multi(3), a(1).Multi(2)


Παράδειγμα με ιδιότητα αλφαριθμητική

Group alpha {
      Property Multi$ {
            value (index) {
                  \ value$ is for output
                  value$=value$+Mid$("GoodMorning", index)
            }
            set (index) {
                  \ value$ is for input
                  Print value$, Multi$ \\ value has same variables too.
                  value$=Mid$(value$+Multi$,index)
                  Print value$
            }
       }="Hello"


}


Print alpha.Multi$(3), alpha.Multi$(2)
alpha.Multi$(3)="Hello There"
Print alpha.Multi$(3), alpha.Multi$(2)


Και με πίνακες, εδώ και με Κατάσταση (Inventory)

Group alpha {
      Property Multi$ {
            value (index) {
                  value$=Mid$(value$, index)
            }
            set (index) {
                  value$=value$+Mid$("............", index)
            }
       }="Hello"


}
Dim a(10)=alpha
Print a(1).Multi$(3), a(2).Multi$(2)
a(1).Multi$(3)="Ok"
Print a(1).Multi$(1)
Inventory Beta=10:=Alpha
Print Beta(10).Multi$(3)
Beta(10).Multi$(3)="Ok"
Print Beta(10).Multi$(1)



Πριν φτιάξω τα παραπάνω, ετοίμασα και αυτά:
Σε πίνακα αριθμών μπορούμε να βάλουμε αντικείμενα που επιστρέφουν τιμές (στις προηγούμενες εκδόσεις θα έπρεπε να πέρναμε μια ιδιότητα, μια μεταβλητή, ή διαφορετικά όλο το αντικείμενο. Τώρα το αντικείμενο δεν φαίνεται ως αντικείμενο, αλλά μια αριθμητική τιμή. Μπορούμε να το δούμε με την Τύπος$(). Δουλεύουν είτε βάλουμε στο πίνακα κοινή ομάδα είτε έχουμε ξεχωριστές. (στο επόμενο παράδειγμα βάζουμε σε όλο το πίνακα με χρήση της Group$() η οποία παραβλέπει την τιμή που γυρίζει η ομάδα και δίνει ένα αντίγραφό της (όπως και η Group() παίρνουν το "αυθεντικό" αντικείμενο χωρίς το $.

group alfa {
      x=100
      value {=.x}
      set { read .x}
}
alfa=500
Print alfa


Dim a(10)
a(0)=group(alfa)
Print a(0)
a(0)=2000
Print a(0)




Σε πίνακα αλφαριθμητικών μπορούμε να βάλουμε αντικείμενα που επιστρέφουν τιμές
group alfa$ {
      x$="ok"
      value {=.x$}
      set { read .x$}
}
alfa$="Yes"
Print alfa$


Dim a$(10)=group$(alfa)


Print a$(0)


a$(0)="12345"
Print a$(0)



Τελευταίο παράδειγμα: Βάζουμε στο πίνακα όχι απλά ένα αντικείμενο ως μια τιμή αλλά έχει και δείκτες. Η εντολή Ιδιότητα είναι μακροεντολή εσωτερικά στο κώδικα που στηρίζεται σε αυτό που δείχνει το παράδειγμα. Οι value και οι Set εδώ είναι απ΄ευθείας στην ομάδα και όχι όπως πριν που ήταν μέλη της "κατασκευής" της ιδιότητας. Εδώ δεν υπάρχουν προρυθμισμένες μεταβλητές. Ότι χρειαζόμαστε το φτιάχνουμε, στην πράξη είναι συναρτήσεις, και βλέπουν ότι μεταβλητές και ότι άλλο έχει η ομάδα όπου ανήκουν.

group alfa {
      X=10
      Value (a$, k) {
            =.X
      }
      Set (a$, n) {
            .X<=val(a$)*number+n
      }
}
alfa("5",2)=10
Τύπωσε alfa("ok", 1)
Dim A(10)=group(alfa)
Print A(3)("ok",1)

 

Τετάρτη 15 Μαρτίου 2017

Αναθεώρηση 7 (Έκδοση 8.4)

Ένα γενικό συμμάζεμα, αρκετές διορθώσεις, έλεγχος με πολλά προγράμματα δοκιμών. Βρήκα ένα πολύ παλιό Bug, όταν σε δυο γραμμές η μία τερμάτιζε σε άνω και κάτω τελεία και η επόμενη ήταν ετικέτα (που και αυτή τερματίζει σε άνω και κάτω τελεία.
Επίσης έκανα μόνο σε ορισμένες εντολές να ισχύουν ονόματα όπως αυτό C:\Windows\ δηλαδή να δέχονται χωρίς εισαγωγικά (αλλά και χωρίς διαστήματα ανάμεσα), τα γνωστά μονοπάτια (paths)

Γενική Ομάδα Βήτα {
      Αξία {
            Στατική Α=1
            =Α
            Α++
      }
}
Για κ=1 έως 30 {
      Τύπωσε Βήτα,
}
Τύπωσε

Τμήμα Εσωτερικό {
      Για κ=1 έως 30 {
            Τύπωσε Βήτα,
      }
      Τύπωσε
}
Εσωτερικό

Στο παράδειγμα η στατική διαφέρει στο Εσωτερικό Τμήμα από το Εξωτερικό. Κάθε τμήμα έχει δικό του αντικείμενο εκτέλεσης και οι στατικές σχετίζονται με τα αντικείμενα εκτέλεσης (βοηθάει αυτό σε νήματα, και τα νήματα έχουν δικό τους αντικείμενο εκτέλεσης, οπότε μια γενική σε άλλο νήμα θα έχει άλλες στατικές). Εδώ στο παράδειγμα την στατική Α την έχουμε στην συνάρτηση Αξία (αυτό που γυρίζει η Βήτα. Για να επιστρέψουμε την ομάδα και όχι την τιμή θα χρησιμοποιήσουμε την συνάρτηση Ομάδα(), εδώ Ομάδα(Βήτα).


Το παρακάτω παράδειγμα δείχνει μια προσθήκη που μπήκε στην αναθεώρηση 7, στο For {} έχουμε τη λίστα1 (Κατάσταση) η οποία στο κλειδί code1 έχει έναν πίνακα. Μπορούμε λοιπόν από την 7 να ανοίγουμε το πίνακα που είναι στην κατάσταση. Δουλεύει και με πολλαπλά αντικείμενα πίνακες και καταστάσεις.

Το αντικείμενο Something, έχει μια ιδιότητα Name$. Όταν πάρει τιμή υπολογίζει το μήκος και την λέξη με μικρά γράμματα και τα τοποθετεί σε ιδιότητες εντός της, μόνο για ανάγνωση. 'Εχω προσθέσει και δυο συναρτήσεις οι οποίες υπολογίζουν κατά την ζήτηση. Η Double$ διαβάζει απευθείας την μεταβλητή πίσω από την ιδιότητα (η εντολή Property είναι μακροεντολή και δημιουργεί αυτή τη μεταβλητή), η οποία βρίσκεται στη γονική ομάδα. Τα [Len] και [Lcase]$ βρίσκονται στην ομάδα Name, αυτή που φτιάχνει η μακροεντολή (φτιάχνει και μια αναφορά στην ομάδα με όνομα Name$, για να μπορούμε να τη χρησιμοποιούμε ως αλφαριθμητικό. Η Tag$() συνδέεται με την ιδιότητα ως αντικείμενο. Η λέξη Name χρωματίζεται από τη Μ2000 επειδή υπάρχει ως εντολή (η εντολή κάνει αλλαγή ονόματος σε αρχεία).


Group Something {
      Property Name$ {
            Value {}
            Set {
                  print value$
                 .[Len]<=Len(value$)
                 .[Lcase]$<=Lcase$(value$)
            }
      } = ""
      Group Name {
           Property Len {value}=0
           Property Lcase$ {value}
           Function Double$ {
                 Link parent [Name]$ to Name$
                 =Name$+Name$
           }
           Function Tag$ {
                 Read what$
                 Link parent Name to Name
                 =format$("<{0}>{1}</{0}>", what$, Name.lcase$)
           }
      }

}
Something.Name$="Hello There"
For Something.Name {
      Print .Len
      Print .Lcase$
      Print .Double$()
      Print .Tag$("b")
}
Dim A(100)=Something
Print A(33).Name.Len
A(33).Name$="George"
Print A(33).Name.Len
A(45).Name$="Bob"
Print A(45).Name.Len
Inventory List1="code1":=A()
For List1("code1")(45) { Print .Name$}
For List1("code1")(33) { Print .Name.Tag$("t")}
List1("code1")(2).Name$="HERCULES"
For List1("code1")(2) {
      Print .Name$, .Name.Lcase$, .Name.Double$(), .Name.Tag$("h3")
}









Δευτέρα 13 Μαρτίου 2017

Αναθεώρηση 6 Έκδοση 8.4 (ανανεώθηκε)

Ανανεώθηκε  κώδικας - έχει σημειωθεί με κίτρινο φόντο- για να τρέχει σωστά στις νέες εκδόσεις της Μ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




Το παρακάτω είναι από τη νέα αναθεώρηση. Αντιγράψτε τα και τρέξετε τα!
Μπήκε το <= στο κίτρινο σημειωμένο κώδικα. (για έκδοση >=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