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

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

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

2.Επίσης σημαντική διόρθωση πήρε και η Για κάποια_ομάδα { } για να δουλεύουν τα φωλιασμένα Για σωστά και όταν είναι με κόμμα/


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


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

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


ή έτσι (αφαιρέθηκε το μπλοκ, και μπήκε και η άλλη μορφή της Για, όπου εδώ στο Επόμενο έχουμε βάλει και το ι, το οποίο ελέγχει αν είναι το σωστό, αν και είναι προαιρετικό, δηλαδή αν δεν βάλουμε ξέρει πιο είναι και γλιτώνουμε και έναν έλεγχο)
Πίνακας ι(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
            Τύπωσε κ(ι),
      Επόμενο ι
      Τύπωσε
} Αλλιώς Άδειασε Λάθος ' καμιά φορά χρειάζεται να αδειάσουμε το λάθος!



ή έτσι:
Κάνε Αλφα()=(1,2,3,4,5,6,7,8,9,10)
Πίνακας κ()
Δες οκ {
      κ()=Αλφα()
}
Αν οκ Τότε
      Τύπωσε διάσταση(κ())
      Για ι=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
κ$=οκν$(μεσ$("αλφα123456789", αριθμός))


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


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

Πίνακας Α()
Α()=συνάρτηση(οκν$(1,2,3,4,5,6,7))
Τύπωσε Α(6)

            7
Στις νεότερες εκδόσεις (έκδοση 9 και 10) ο πίνακας θα μπεί στο ίδιο αντικείμενο (απόδειξη).
Πίνακας Α()
Μ=Α() ' ο Μ είναι δείκτης σε πίνακα
Α()=συνάρτηση(οκν$(1,2,3,4,5,6,7)) ' τα στοιχεία μπήκαν στον εσωτερικό πίνακα του αντικειμένου
Τύπωσε Α(6)
Τύπωσε Μ ' εδώ μας φέρνει όλα τα στοιχεία στη κονσόλα της Μ2000
Τύπωσε Μ είναι Α() ' Αληθές
Μ=("οκ",)
Τύπωσε Μ είναι Α() ' Ψευδές


Ο τελεστής είναι χρησιμοποιείται για αντικείμενα. Για τις ομάδες υπάρχει και το είναι τύπος

Προχωρημένο Παράδειγμα! (13 Δεκ 2021, έκδοση διερμηνευτή 10)

Κλάση ΧΨ {
      Χ=10, Ψ=30
Κλάση:
      Τμήμα ΧΨ (, ) {
      }
}
Κλάση Αλφα ως ΧΨ {
      Συνάρτηση ΧΨΖ(Ζ) {
            =**2-*+Ζ
      }
}
Α=Άλφα()
Τύπωσε Τύπος$(Α)="Group"
Τύπωσε Τύπος$(Α.Χ)="Double"
Τύπωσε Τύπος$(Α.Ψ)="Double"
Τύπωσε Τμήμα(Α.ΧΨΖ())=Αληθές
Τύπωσε Τμήμα(Α.ΧΨ)=Ψευδές ' το τμήμα υπήρχε μόνο στη κατασκευή του Αλφα.
Τύπωσε Α είναι τύπος Αλφα = Αληθές
Β->Α ' Δείκτης σε ομάδα - στην ουσία αυτός εδώ είναι αναφορά στην Α
Τύπωσε Α είναι Β = Αληθές
Τύπωσε Α.ΧΨΖ(200)=0
Α=ΧΨ(20, 50) ' ίδιο με αυτό: Α=Α με ΧΨ(20, 50)  κάνει συγχώνευση
Τύπωσε Α.ΧΨΖ(200)=-400 ' Αληθές
Τύπωσε Β=>ΧΨΖ(200)=-400 ' Αληθές
Β->(Α) ' δείκτης σε αντίγραφο - δείκτης σε κλειστό αντικείμενο
Τύπωσε Α είναι Β = Ψευδές
Τύπωσε Β=>ΧΨΖ(200)=-400 ' Αληθές
Τύπωσε Β είναι τύπος Αλφα=Αληθές
Τύπωσε Β είναι τύπος ΧΨ=Αληθές ' και ΧΨ τύπος είναι!
Α$=οκν$(Β=>ΧΨΖ(αριθμός))
Ένωσε ισχνή Α$ στο ΧΨΖ()
Τύπωσε συνάρτηση(Α$, 200)=-400
Τύπωσε ΧΨΖ(200)=-400
' τώρα αλλάζουμε αντικείμενο στο Β
Β->Άλφα()
Τύπωσε συνάρτηση(Α$, 200)=0 ' Αληθές
Τύπωσε ΧΨΖ(200)=0

Στο παράδειγμα στο τέλος φτιάχνουμε μια συνάρτηση στο A$, και μέσω αυτής την ΧΨΖ που κάνει οκνηρή αποτίμηση επίσης! Απόδειξη: Όταν αλλάζουμε το Β να δείχνει σε νέο αντικείμενο το βλέπουμε στη ΧΨΖ() (που έχει αντίγραφο της Α$ της ισχνής αναφοράς). Μπορούμε να δούμε τον κώδικα, δηλαδή το περιεχόμενο της Α$ με μια Αναφορά Α$. Η εντολή Αναφορά χειρίζεται αλφαριθμητικά ως κείμενο με αλλαγές γραμμών, και εμφανίζει γραμμές με το πολύ 3/4 των γραμμών της οθόνης για ολίσθηση, και έτσι μπορούμε να δούμε ένα κείμενο με διαδοχικά πατήματα του διαστήματος ή με αριστερό κλικ του ποντικιού.

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 τότε {
      Τύπωσε παραμ(εδώ$)
} αλλιώς {
      Τύπωσε παραμ$(εδώ$)
}






Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.