Ανέβηκε η αναθεώρηση 26.
Βρέθηκε ένα bug στην εντολή LET ή Στη όπου βάζουμε τιμές σε μεταβλητές με τον κανόνα της δεξιάς έκφρασης, και ειδικότερα όταν βάζουμε αντικείμενα σε πίνακες.
Κανονικά μια εντολή "εκχώρησης" τιμής έχει τον κανόνα της αριστερής έκφρασης, ο οποίος λέει ότι η μετάφραση τελειώνει πρώτα την έκφραση αριστερά του συμβόλου εκχώρησης (ή καταχώρησης) τιμής, και μετά εκτελεί τη δεξιά έκφραση για να βρει την τιμή.
Η εντολή LET αρχικά φτιάχτηκε για να κάνει την δουλειά δυο εντολών της PUSH και της READ (ή στα ελληνικά της ΒΑΛΕ και της ΔΙΑΒΑΣΕ). Έτσι πρώτα βάζει στο σωρό τιμών την έκφραση και μετά την διαβάζει. Θα πει κανείς ότι είναι το ίδιο πράγμα αν γίνει ανάποδα, όπως στην απλή εκχώρηση ο μεταφραστής βρίσκει που θα εκχωρήση (άρα εκτελεί πρώτα αυτό) και μετά εκτελεί την δεξιά έκφραση. Όμως δεν είναι.
Στα δυο παρακάτω το Α δημιουργείται στην αριστερή έκφραση και στην εκτέλεση της δεξιάς έχει μηδενική τιμή.
For i=1 to 10
A=A+1
Print A
Next i
Για ι=1 έως 10
α=α+1
Τύπωσε α
Επόμενο ι
Εδώ θα πάρουμε λάθος αν δεν υπάρχει A και α
\\ Error
For i=1 to 10
Let A=A+1
Print A
Next i
\\Λάθος
Για ι=1 έως 10
Στη α=α+1
Τύπωσε α
Επόμενο ι
Οι λόγοι όμως που θέλουμε να λειτουργεί κάποιες φορές ο κανόνας της δεξιάς έκφρασης (πρώτα), είναι στους πίνακες, όπου έχουμε στη θέση δεικτών εκφράσεις. Μπορεί η δεξιά έκφραση να αλλάξει τιμές μεταβλητών ή πινάκων και αυτές να φανούν στην αποτίμηση της αριστερής έκφρασης και αυτή να προσδιορίσει σε ποιο στοιχείο του πίνακα θα αποθηκευθεί η τιμή της δεξιάς έκφρασης.
Με χρήση της κανονικής εκχώρησης, με το κανόνα της αριστερής έκφρασης (πρώτα), το στοιχείο του πίνακα έχει προσδιοριστεί πριν την αποτίμηση της δεξιάς έκφρασης, που δίνει την τιμή στο στοιχείο!
Επίσης εκτός της διόρθωσης μπήκε και η δυνατότητα να βάλουμε αλφαριθμητικό σε πίνακα που στο όνομα δεν έχει το $ (δεν δέχεται αλφαριθμητικό). Οι πίνακες εσωτερικά έχουν τύπο variant, που σημαίνει δυο πράγματα, ότι παίρνουν οποιοδήποτε τύπο, και αντικείμενα, και ότι έχουν αυτόματη μετατροπή, όταν δηλαδή δίνουμε το "1234" και το διαβάσουμε ως αριθμό θα μας δώσει το 1234. Η μετατροπή γίνεται βάσει του ονόματος του πίνακα. Έτσι οι πίνακες με $() θα κάνουν μετατροπή σε αλφαριθμητικό, αν έχουν αριθμό. Αυτό γενικά ενώ είναι απλό και ωραίο, δεν δουλεύει καλά αν έχουμε επιλέξει ένα διαφορετικό τοπικό (πχ το 1032 για ελληνικά, ενώ το λειτουργικό είναι στο 1033 λατινικά), γιατί χειρίζεται το διαχωριστικό χιλιάδων και δεκαδικών βάσει του καθορισμένου στο λειτουργικό. Η εντολή Τύπωσε λειτουργεί βάσει του τοπικού. Δώστε την εντολή να δείτε το αποτέλεσμα:
Τοπικό 1032: Τύπωσε Τοπικό, 3.4
Τοπικό 1036: Τύπωσε Τοπικό, 3.4
Τοπικό 1033: Τύπωσε Τοπικό, 3.4
Βρέθηκε ένα bug στην εντολή LET ή Στη όπου βάζουμε τιμές σε μεταβλητές με τον κανόνα της δεξιάς έκφρασης, και ειδικότερα όταν βάζουμε αντικείμενα σε πίνακες.
Κανονικά μια εντολή "εκχώρησης" τιμής έχει τον κανόνα της αριστερής έκφρασης, ο οποίος λέει ότι η μετάφραση τελειώνει πρώτα την έκφραση αριστερά του συμβόλου εκχώρησης (ή καταχώρησης) τιμής, και μετά εκτελεί τη δεξιά έκφραση για να βρει την τιμή.
Η εντολή LET αρχικά φτιάχτηκε για να κάνει την δουλειά δυο εντολών της PUSH και της READ (ή στα ελληνικά της ΒΑΛΕ και της ΔΙΑΒΑΣΕ). Έτσι πρώτα βάζει στο σωρό τιμών την έκφραση και μετά την διαβάζει. Θα πει κανείς ότι είναι το ίδιο πράγμα αν γίνει ανάποδα, όπως στην απλή εκχώρηση ο μεταφραστής βρίσκει που θα εκχωρήση (άρα εκτελεί πρώτα αυτό) και μετά εκτελεί την δεξιά έκφραση. Όμως δεν είναι.
Στα δυο παρακάτω το Α δημιουργείται στην αριστερή έκφραση και στην εκτέλεση της δεξιάς έχει μηδενική τιμή.
For i=1 to 10
A=A+1
Print A
Next i
Για ι=1 έως 10
α=α+1
Τύπωσε α
Επόμενο ι
Εδώ θα πάρουμε λάθος αν δεν υπάρχει A και α
\\ Error
For i=1 to 10
Let A=A+1
Print A
Next i
\\Λάθος
Για ι=1 έως 10
Στη α=α+1
Τύπωσε α
Επόμενο ι
Οι λόγοι όμως που θέλουμε να λειτουργεί κάποιες φορές ο κανόνας της δεξιάς έκφρασης (πρώτα), είναι στους πίνακες, όπου έχουμε στη θέση δεικτών εκφράσεις. Μπορεί η δεξιά έκφραση να αλλάξει τιμές μεταβλητών ή πινάκων και αυτές να φανούν στην αποτίμηση της αριστερής έκφρασης και αυτή να προσδιορίσει σε ποιο στοιχείο του πίνακα θα αποθηκευθεί η τιμή της δεξιάς έκφρασης.
Με χρήση της κανονικής εκχώρησης, με το κανόνα της αριστερής έκφρασης (πρώτα), το στοιχείο του πίνακα έχει προσδιοριστεί πριν την αποτίμηση της δεξιάς έκφρασης, που δίνει την τιμή στο στοιχείο!
Επίσης εκτός της διόρθωσης μπήκε και η δυνατότητα να βάλουμε αλφαριθμητικό σε πίνακα που στο όνομα δεν έχει το $ (δεν δέχεται αλφαριθμητικό). Οι πίνακες εσωτερικά έχουν τύπο variant, που σημαίνει δυο πράγματα, ότι παίρνουν οποιοδήποτε τύπο, και αντικείμενα, και ότι έχουν αυτόματη μετατροπή, όταν δηλαδή δίνουμε το "1234" και το διαβάσουμε ως αριθμό θα μας δώσει το 1234. Η μετατροπή γίνεται βάσει του ονόματος του πίνακα. Έτσι οι πίνακες με $() θα κάνουν μετατροπή σε αλφαριθμητικό, αν έχουν αριθμό. Αυτό γενικά ενώ είναι απλό και ωραίο, δεν δουλεύει καλά αν έχουμε επιλέξει ένα διαφορετικό τοπικό (πχ το 1032 για ελληνικά, ενώ το λειτουργικό είναι στο 1033 λατινικά), γιατί χειρίζεται το διαχωριστικό χιλιάδων και δεκαδικών βάσει του καθορισμένου στο λειτουργικό. Η εντολή Τύπωσε λειτουργεί βάσει του τοπικού. Δώστε την εντολή να δείτε το αποτέλεσμα:
Τοπικό 1032: Τύπωσε Τοπικό, 3.4
Τοπικό 1036: Τύπωσε Τοπικό, 3.4
Τοπικό 1033: Τύπωσε Τοπικό, 3.4
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.