Κυριακή, 20 Δεκεμβρίου 2015

Νέα Αναθεώρηση 122, Εντολή Οκν$(),Lazy$()

Η Αναθεώρηση 121 ψόφησε στο δρόμο..Ζήτω η 122...
1. Διορθώθηκαν μερικά bug. Ένα ήταν για το ω που στην αναθεώρηση 120  δεν βγαίνει στην γραμμή εντολών (είχα πειράξει το ctrl+V οπότε από λάθος σημείου κώδικα, διέγραφε την εισαγωγή του ωμέγα).

2.Επίσης σημαντική διόρθωση πήρε και η Για κάποια_ομάδα { } για να δουλεύουν τα φωλιασμένα Για σωστά και όταν είναι με κόμμα  π.χ. Για κάποια_ομαδα, .κάποια_άλλη_ομάδα {  } όπου η κάποια_άλλη_ομάδα είναι εντός της πρώτης.
Π.χ. εδώ η .beta ομάδα που ανήκει στην alfa δεν αναγνωρίζονταν σε παλαιότερη αναθεώρηση!

Ομάδα alfa {
      Ομάδα beta {
           a$="ok"        
            Τμήμα do_it {
                  Τύπωσε .a$
            }
      }
}
Για alfa, .beta { ..do_it }



3. Διορθώθηκε η εντολή Συνέχισε, στην For και όπου αλλού, όπου είχε πρόβλημα αν είχαμε και άλλο μπλοκ γύρω από το μπλοκ που δίναμε τη Συνέχισε! Π.χ. το παρακάτω πρόγραμμα δεν έτρεχε στη 120, ενώ τρέχει στην 121. Αν αφαιρέσουμε το πρόσθετο μπλοκ  { } τότε τρέχει και στις δυο κανονικά.

Πίνακας ι(10)
ι(0)=1,0,1,0,1,0,1,0,1,0
κ=0
{
      Για ι=0 Έως 9 {
            Αν ι(ι) Τότε Συνέχισε
            κ++
      }
}
Τύπωσε κ


Προσθήκες

Σε αυτή την αναθεώρηση μπήκαν νέες εντολές και λειτουργίες:

1. Επιστροφή πολλαπλών τιμών από Συνάρτηση! Αυτό επιτυγχάνεται με αυτόματη παραγωγή πίνακα όπου μπαίνουν όλες οι τιμές. Έτσι επιστρέφουμε πίνακα και όχι μια τιμή! Μπορούμε να ελέγχουμε το λάθος (αν δεν γυρίσει πίνακα θα βγει λάθος). Εδώ χρησιμοποιώ τη Για Επόμενο (αλλά θα μπορούσα να χρησιμοποιήσω την Για με μπλοκ εντολών{}, που είναι πιο γρήγορη.
Το κόμμα στην Τύπωσε αλλάζει στήλη. Οπότε έχουμε μια Τύπωσε σκέτη στο τέλος για να κάνει αλλαγή γραμμής

Συνάρτηση Αλφα {
\\ κρύψε με \\ την επόμενη γραμμή
     =1,2,3,4,5,6,7,8,9,10
}
Πίνακας κ()
Δες οκ {
      κ()=Αλφα()
}
Αν οκ Τότε {
      Τύπωσε διάσταση(κ()) \\ Τυπώνει 1, μονοδιάστατος
      Για ι=0 έως διάσταση(κ(),1)-1
            Τύπωσε κ(ι),
      Επόμενο ι
      Τύπωσε
} Αλλιώς Άδειασε Λάθος ' καμιά φορά χρειάζεται να αδειάσουμε το λάθος!





Το λάθος "αδειάζει" με την ανάγνωση του λάθους. Αν χρησιμοποιήσω την Δες χωρίς μεταβλητή ελέγχου τότε κάθε λάθος "καταπνίγεται" εντός.

2. Οκνηρή αποτίμηση! Επέκτεινα την Μ2000 με την δυνατότητα να περάσω όχι απλά τιμή μέσα σε ένα τμήμα αλλά και το περιβάλλον του τμήματος όπου φτιάχνω μια οκνηρή αποτίμηση μέσω ανώνυμης συνάρτησης!
Το θέμα εδώ είναι λίγο δύσκολο. Η συνάρτηση αα θα κληθεί ως αα αλλά θα "πιστεύει" ότι είναι το το τμήμα που "φτιάχτηκε" στην οκν$(&αα()) η οποία δίνει μια ισχνή αναφορά σε αυτήν, με τροποποίηση. Μια εντολή Αναφορά οκν$(&αα())  μας δείχνει την τροποποίηση. Όμως έχει προετοιμαστεί και ο κώδικας της Μ2000 για να γυρίσει κανονικά την τιμή ή τις τιμές (δες το 1 όπου γυρίζουμε πίνακα που φτιάχνεται αυτόματα).
Έτσι η Συνάρτηση αα έχει τα α και Χ που ανήκουν στο όνομα χώρου του αρχικού τμήματος. Μάλιστα το Χ μετά το πέρας δεν θα υπάρχει αφού δεν έχουμε δηλώσει κάποιο Χ όπως έχουμε δηλώσει την α (με τιμή 10).
Μόλις καλέσουμε την Β έχουμε στο σωρό τιμών (ειδική στοίβα στη Μ2000) τις ισχνές αναφορές δυο  ανώνυμων συναρτήσεων. Οι ισχνές αναφορές για τις συναρτήσεις είναι στην ουσία αντιγραφή κώδικα π.χ. "{=10} είναι μια συνάρτηση που γυρίζει το 10, απλά πρέπει με κάποιο τρόπο να την τρέξουμε π.χ. Τύπωσε Συνάρτηση("{=Αριθμός**2}", 10 θα πάει το Χ στο σωρό, και θα διαβαστεί από την Αριθμός οπότε θα πάρουμε το 10**2 ή 100  (εκτός από αυτό ** και το ^ κάνει για ύψωση σε δύναμη). Για να καταλάβει ο διερμηνευτής ότι έχει αναφορά σε συνάρτηση πρέπει να δει ένα μπλοκ σε ένα αλφαριθμητικό. Δεν εξετάζει τι έχει μέσα, ούτε πως προέκυψε. Αρκεί να το βρει εκεί που ψάχνει για κάτι τέτοιο. Αν επέστρεφα αλφαριθμητικό τότε θα χρησιμοποιούσα την Συνάρτηση$(). Πρέπει να ξέρει ο διερμηνευτής τι ζητάμε, γιατί θέλει να "σχηματίζει γνώμη" τι τύπου έκφραση έχει μπροστά του, χωρίς να αναλύει κάθε αναγνωριστικό.

Εντός λοιπόν στην Β θα δώσουμε ονόματα στις δυο ανώνυμες συναρτήσεις, ως ββ() και ββ$(). Ο χαρακτήρας & δηλώνει ότι θέλουμε αναφορές. Αν είχαμε πίνακες στο σωρό θα έφτιαχνε πίνακες! Δηλαδή εμείς έχουμε την ευθύνη του τι του "σερβίρουμε". Στην επανάληψη Για έχουμε πέρασμα μεταβλητής στην ββ() ενώ όχι στη ββ$. Κάθε φορά που εκτελούνται έχουμε άλλη έξοδο, άλλη αποτίμηση. Επιπλέον η ββ() αλλάζει τιμές στο α, στο αρχικό τμήμα.
Εδώ δηλαδή δεν μπορούμε να πούμε ότι έχουμε πέρασμα με τιμή ή πέρασμα με αναφορά, είναι κάτι άλλο! Οι συνέπειες από το πέρασμα σχετίζονται και με τις αποτιμήσεις ή όχι ανάλογα τι έχουμε δώσει! Στην ββ$() έχουμε δώσει κάτι που κάθε φορά αλλάζει από μόνο του! Η οκν$() μας βοηθάει να κάνουμε την ισχνή αναφορά γρήγορα.
Παρακάτω κάνουμε κάτι γρήγορο και το τοποθετούμε σε μια κ$. Βάζουμε αντί της συνάρτησης Τυχαίος() να παίρνει έναν αριθμό. Η συνάρτηση στο κ$...δεν υπάρχει στη λίστα των συναρτήσεων, αλλά για τη στιγμή που τρέχει υπάρχει και μάλιστα αλλάζει όνομα. Ουσιαστικά εδώ τρέχουμε μια γραμμή κώδικα σαν να μην υπήρχε συνάρτηση αλλά το mid$("αλφα123456789"Χ)

α=10
Συνάρτηση αα {
      Διάβασε Χ
      α+=Χ
      =Χ
}
Τμήμα Β {
     Διαβασε &ββ(), &ββ$()
     Για ι=1 έως 10 {
      ? ββ(ι), ββ$()
      }     
}


Κάλεσε Β, οκν$(&αα()), οκν$(μεσ$("αλφα123456789",τυχαιος(1,10)))
Τύπωσε α \\ Τυπώνει 65
κ$=οκν$(mid$("αλφα123456789", αριθμός))


Για κ=1 εως 5 { Τύπωσε συνάρτηση$(κ$, κ) }


Εδώ βλέπουμε πως μπορούμε να φτιάξουμε έναν πίνακα και να τον δώσουμε στον Α() ..(μοιάζει με αντιγραφή αλλά δεν είναι. Το προηγούμενο αντικείμενο διαγράφεται και το Α() δείχνει το καινούριο).Πίνακας Α()
Α()=συνάρτηση(οκν$(1,2,3,4,5,6,7))
Τύπωσε Α(6)

            7
3. Οι εντολές Παραμ() και Παραμ$()
Μια ακόμα προσθήκη είναι οι εντολές που παίρνουν όρισμα ένα αλφαριθμητικό με αποτελέσματα, αριθμούς ή αλφαριθμητικά ή και τα δύο. Αυτές οι εντολές μετατρέπουν το όρισμα ως σειρά παραμέτρων!
Τα αποτελέσματα τα γράφουμε με Προσθήκη$() όπου τα αλφαριθμητικά γράφονται με εισαγωγική (δεν μπορούμε να έχουμε μέσα σε αυτά εισαγωγικά, η Μ2000 χρησιμοποιεί τα εισαγωγικά και τις αγκύλες για αλφαριθμητικά - τις αγκύλες και για να ορίζει μπλοκ εντολών - ο χρωματιστής ξεχωρίζει αμέσως αν ένα μπλοκ είναι μπλοκ εντολών ή αλφαριθμητικό, επειδή γνωρίζει μετά από ποιες εντολές ακολουθούν μπλοκ εντολών.). Επιπλέον μπορούμε να τα γράψουμε με τη Σωρός$() όπου τα αλφαριθμητικά γράφονται με μήκος (οπότε μπορούμε να έχουμε ό,τι θέλουμε, ίσως και άλλους σωρούς ...μέσα σε σωρούς).

Η σημασία αυτής της προσθήκης είναι να παρέχει το αντιστρόφως ανάλογο σε την οκνηρή αποτίμηση. Εδώ οι τιμές έχουν αποτιμηθεί, αν και εμείς τις χρησιμοποιούμε σε δεύτερο χρόνο.


Χ=10
\\β$=σωρός$(1,30*3,"άλφα", "βήτα",1,2, Χ)
\\β$=παράθεση$(1,30*3,"άλφα", "βήτα",1,2, Χ)
\\β$=σωρός$("α",30*3,"άλφα", "βήτα",1,2, Χ)
β$=παράθεση$("α",30*3,"άλφα", "βήτα",1,2, Χ)
Πίνακας Α(7)
\\ η σωρός$() ξεχωρίζει τα αλφαριθμητικά με το 2 - χρησιμοποιεί μετά το 2 δείκτη μήκους.
\\ με τη σωρός$() μπορούμε να έχουμε αλφαριθμητικά με άλλους σωρούς τιμών
\\ η παράθεση$() με το 34 - χρησιμοποιεί εισαγωγικά
Αν κωδ(β$)<>2 και κωδ(β$)<>34 τότε {
      Α(0):=παραμ(β$)
} Αλλιώς {
      Α(0):=παραμ$(β$) \\"α",30*3,"άλφα", "βήτα",1,2, Χ
}
Τύπωσε Α(1), Α(6) \\ τυπώνει 10
\\ μπορώ να διαβάζω και τα αλφαριθμητικά
\\ αλλά πρέπει να συνδέσω το πίνακα με έναν αλφαριθμητικό
\\ αλλιώς θα πέρνω τιμή 0
Ένωσε Α() στο Α$()
Τύπωσε Α$(3) \\ βήτα
Α$(3)=Α$(2)+" "+Α$(3)
Τύπωσε Α$(3) \\ άλφα βήτα
Στοκ Α(0) για 7, εδώ$
\\ το εδώ$ φτιάχνεται με τη συνταγή της Σωρός$()
Αν κωδ(εδώ$)<>2 τότε {
      Τύπωσε παραμ(εδώ$)
} αλλιώς {
      Τύπωσε παραμ$(εδώ$)
}