Δευτέρα, 13 Νοεμβρίου 2017

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

Έχει σχεδόν ολοκληρωθεί η 9η έκδοση. Με αυτήν την αναθεώρηση:

1. Διορθώθηκε η έλλειψη λογικής σε περίπτωση που κάναμε άλμα σε ετικέτα με ίδιο όνομα με ένα τμήμα το οποίο ενώ ο διερμηνευτής στη ροή ξεχώριζε, ποια είναι κλήση στο τμήμα και ποια είναι ετικέτα, η αναζήτηση της ετικέτας δεν το ξεχώριζε.
Οι ετικέτες είναι αναγνωριστικά με το πρώτο χαρακτήρα γράμμα, δεν έχουν περιορισμό μεγέθους, και στο τέλος τους έχουν το σύμβολο της άνω και κάτω τελείας :
Μετά από μια ετικέτα μπορεί να μπει μόνο σημείωση με έναν από τους χαρακτήρες ' και \
Στο παράδειγμα παρακάτω στις προηγούμενες εκδόσεις/αναθεωρήσεις, το Goto beta θα πήγαινε στο πρώτο που είναι τμήμα γιατί μετά το : ακολουθεί εντολή (για την ακρίβεια αναζητούμε αν υπάρχουν τα ' και \ μετά από τυχόν διαστήματα).

Module beta {
      Print "i am beta"    
}
x=4
beta: Print "ok"  \\ call beta then Print ok
beta: \\ only rem
Print x
x--
If x>0 Then Goto beta


2. Προστέθηκε στο Else (Αλλιώς) της Αν η δυνατότητα να γράψουμε αριθμό άλματος. Αυτό γίνονταν στο Then (Τότε) αλλά δεν το είχα φτιάξει για την Αλλιώς.
      x=4
100Print x
      x--
      If x<1 Else 100

3. Ternary Operator ή Τριπλός τελεστής.

Def fib(x)=If(x>1->fib(x-1)+fib(x-2), x)
For i= 0 to 10
      Print fib(i)
Next i


Στη Μ2000 η καλύτερη λύση ήταν να χρησιμοποιηθεί μια ειδική συνάρτηση ως τριπλός τελεστής. Επειδή τα επιστρεφόμενα από εκφράσεις ανήκουν σε δυο ομάδες, τα αριθμητικά και τα αλφαριθμητικά, με την διαφορά στο αλφαριθμητικό την χρήση του χαρακτήρα  $, έχουμε δυο τελεστές την Αν() και την Αν$(). Οι τελεστές αυτοί είναι σαν συναρτήσεις, με αρκετές διαφορές:
Η βασική σύνταξή της είναι Αν( συνθήκη -> έκφραση1, έκφραση2), όπου αν η συνθήκη είναι αληθές τότε εκτελείται η έκφραση1 αλλιώς η έκφραση2. Εδώ δεν εκτελούνται και οι δυο εκφράσεις (όπως το κάνει για παράδειγμα η Visual Basic 6) και απλά επιστρέφεται μια τιμή.
Μια παραλλαγή είναι η Αν(αριθμός έκφρασης από 1 -> έκφραση1, έκφραση2, ..., έκφρασηΝ)
Και στις δυο παραλλαγές μπορούμε να παραλείψουμε κάποια έκφραση και να βάλουμε κενό (ή τίποτα και απλά ένα κόμμα να ακολουθείται από άλλο κόμμα), και αν γίνει επιλογή αυτού του κενού τότε επιστρέφει η μηδενική τιμή, το 0 στην Αν() και το κενό αλφαριθμητικό "" στην Αν$()
Πώς ξέρει ποια από τις δυο παραλλαγές χρησιμοποιούμε ο διερμηνευτής; Από την τιμή της έκφρασης πριν το σύμβολο ->. Επειδή το αληθές είναι -1 και το ψευδές 0, οι τιμές -1 και 0 δείχνουν στην εντολή ποια παραλλαγή είναι. Αν έχουμε την πρώτη παραλλαγή και βρει μια έκφραση και όχι κενό σε μια από τις δυο, ή βρει περισσότερες από δυο εκφράσεις, τότε βγάζει λάθος.
Τα αντικείμενα στην Μ2000 όπως οι ομάδες γυρίζουν δυο πράγματα, την τιμή 0 και το δείκτη στο αντικείμενο σε μια προσωρινή θέση στο αντικείμενο εκτέλεσης (κάθε τμήμα/συνάρτηση τρέχει σε δικό του αντικείμενο εκτέλεσης). Οπότε μπορούσε να βγει ο τελεστής Elvis:

4. Τελεστής Elvis
Αυτός ο τελεστής είναι μια υποπερίπτωση του τριπλού τελεστή.
Στο πρόγραμμα παρακάτω η πρώτη Αν() παίρνει ένα ωραίο μηδέν από το Α(2) και βάζει τη δεύτερη έκφραση, το αντικείμενο Χ, στο A(2), ως αντίγραφο του Χ.
Αλλάζουμε τιμή στο Χ.Κ και εκτελούμε μια ίδια Αν(). Τη δεύτερη φορά, φέρνει μεν 0 το Α(2) αλλά παράλληλα φέρνει και ένα δείκτη στο αντικείμενο που περιέχει, Έτσι μπαίνει σε ενέργεια ο τελεστής Elvis. Εφόσον υπάρχει αντικείμενο το 0 γίνεται -1 και επιλέγει απευθείας τη πρώτη έκφραση, και αν δεν βρει έκφραση, δεν "μηδενίζει" αλλά αφήνει να επιστραφεί ο δείκτης του Α(2)...στο Α(2), άρα δεν αλλάζει κάτι! Απόδειξη είναι η  επόμενη τύπωσε όπου παίρνουμε τιμές 100 και 101.
Στους πίνακες (που δεν έχουν αρχικοποιηθεί με κάποια κλάση) μπορούμε να βάζουμε ότι θέλουμε στα στοιχεία τους, και εδώ στην Α(2) βάζουμε το 0, το οποίο όταν ξαναπεράσει από τον τελεστή, θα είναι 0 (λειτουργεί εκείνη τη στιγμή σαν τριπλός τελεστής) και θα φορτώσει το αντίγραφο του Χ, και έτσι στην ακόλουθη Τύπωσε βλέπουμε δυο φορές το 101 Παρακάτω βλέπουμε και άλλες εντολές, που μας δείχνουν και την αλλαγή τύπου (και πώς την διαβάζουμε).

Ομάδα Χ {
      Κ=100
}
Πίνακας Α(10)
Α(2)=Αν(Α(2)->,Χ)
Τύπωσε Α(2).Κ, Χ.Κ
Χ.Κ++
Α(2)=Αν(Α(2)->,Χ)
Τύπωσε Α(2).Κ, Χ.Κ
Α(2)=0 \\ Null τιμή
Α(2)=Αν(Α(2)->,Χ)
Τύπωσε Α(2).Κ, Χ.Κ
Α(2)=Αν(Α(2)->0,Χ)
Τύπωσε Τύπος$(Α(2)) \\ long
Α(2)=Αν(Α(2)->0,Χ)
Τύπωσε Τύπος$(Α(2)) \\ Group


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

Κλάση μετρητής {
      χ, μέγιστο
      Αξία {
            Αν .χ>=.μέγιστο Τότε Έξοδος
            ++
            =Αληθές
      }
Κλάση:
      Τμήμα μετρητής (, .μέγιστο) {}
}
Α=μετρητής(1,2) ' 1
Β=μετρητής(10,18) ' 8
Γ=μετρητής(5,6) ' 1
Δ=μετρητής(1,3) ' 2
μετρητής=1
\\ μέτρημα 1+8+1+2= 12 φορές
Ενώ Αν(Α->,Αν(Β->,Αν(Γ->,Δ))) {
      Τύπωσε Β.χ, Γ.χ, Δ.χ, μετρητής
      μετρητής++
}

Εδώ φαινεται ένα παράδειγμα απόδειξη ότι δεν εκτελεί όλες τις εκφράσεις

Ομάδα Χ {
      μετρ=0
      Αξία {
            .μετρ++
            =1
      }
}
Τύπωσε Αν(0 -> 10*Χ, 3*Χ)*30
Τύπωσε Αν(-1 ->, 3*Χ)*20
Τύπωσε Χ.μετρ=1
Τύπωσε Αν(5 -> 10*Χ , , , (χαρ$("A")-20)*Χ , 58*Χ , 62*Χ , 71)*10
Τύπωσε Χ.μετρ=2






\\ Στο δεύτερο μέρος χρησιμοποιούμε το ! πριν από πίνακα (το (Χ1, Υ1) για να περάσουμε τις τιμές του στον σωρό τιμών.κατά τη κλήση του Αλφα().
Χ1=10
Υ1=20
Κάνε Αλφα(Χ,Υ)=Χ**2+Υ
Τύπωσε Αλφα(Χ1,Υ1)
Τύπωσε Αλφα(!Αν(0->(Χ1,Υ1),(Υ1,Χ1))) ' 410
Τύπωσε Αλφα(!Αν(-1->(Χ1,Υ1),(Υ1,Χ1))) ' 120
Τύπωσε Αλφα(!Αν(1->(Χ1,Υ1),(Υ1,Χ1))) ' 410
Τύπωσε Αλφα(!Αν(2->(Χ1,Υ1),(Υ1,Χ1))) ' 120
Τύπωσε Αν$(3 -> "α","β","γ")


5. Τελεστής διαστημόπλοιο (spaceship operator)
Υπάρχει ήδη η συνάρτηση Σύγρινε () αλλά αυτή δουλεύει με μεταβητές μόνο.
Τύπωσε 10+2<=>19+2 ' δίνει -1  

 στην ισότητα δίνει 0 και αν το αριστερό σκέλος είναι μεγαλύτερο από το δεξιό δίνει το δεξιό.