Τρίτη, 11 Ιουλίου 2017

Αναθεώρηση 12 (Έκδοση 8.9)

 Σε αυτήν την αναθεώρηση έχουν γίνει βελτιώσεις; και αφαιρέθηκαν κάποια λάθη. Επιπλέον η δομή Αν Τοτε.... Αλλιώς.Αν Τότε ... Αλλιώς (if Then else.if Then  else) μπορεί να γραφεί και χωρίς μπλοκ εντολών αρκεί να βάβουμε δίπλα στο Τότε ή στο Αλλιώς σε μια Αλλιώς.Αν (στην ίδια γραμμή) μια σειρά εντολών που θα εκτελεστούν ή όχι ανάλογα με τη συνθήκη
πχ
Για Α=Αληθές έως Ψευδές {

      Αν Α Τότε Τύπωσε "ναι"
      Αλλιώς Τύπωσε "οχι"

      Αν Α Τότε {
            Τύπωσε "ναι"
      }
      Αλλιώς Τύπωσε "οχι"


      Αν Α Τότε {
            Τύπωσε "ναι"
      } Αλλιώς Τύπωσε "οχι"

}

Μεταβλητές ως στατικές σε Ομάδες και Λάμδα συναρτήσεις

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

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

α=λάμδα χ=10, ψ=2 -> {
      =χ**2+ψ
      χ++
      ψ++
}
Για ι=1 έως 5 {
      Τύπωσε α(),
}
Τύπωσε
β=α
Για ι=1 έως 5 {
      Τύπωσε α(),
}
Τύπωσε
Για ι=1 έως 5 {
      Τύπωσε β(),
}
Τύπωσε

Για να κατανοήσουμε γιατί λέμε ανώνυμες τις λάμδα δείτε την συνέχεια του προηγούμενου παραδείγματος, οπου τοποθετούμε ένα αντίγραφο της α σε ένα στοιχείο πίνακα, και ένα αντίγραφο της β σε μια κατάσταση στο κλειδί "κλειδί1"
Μπορούμε να εκτελέσουμε τις λάμδα απευθείας από το πίνακα και την κατάσταση
Με τις λάμδα φτιάχνουμε γεννήτριες σειρών αριθμών, και με την αντιγραφή κρατάμε την σειρά από το σημείο που θέλουμε

Πίνακας Δ(3)
Δ(1)=α
Για ι=1 έως 5 {
      Τύπωσε Δ(1)(),
}
Τύπωσε
Κατάσταση Μ="κλειδί1":=β
Για ι=1 έως 5 {
      Τύπωσε Μ("κλειδί1")(),
}
Τύπωσε

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

Καθαρο  ' για να καθαρίσει τις στατικές στην επόμενη εκτέλεση
Ομάδα Βήτα {
      μετρητής=0
      Συνάρτηση Α1 (χ, ψ) {
            .μετρητής++
            =χ**2+ψ
      }
}
Τμήμα Δες_Αυτό (&φ()) {
      Στατικές χ=10, ψ=2
      Τύπωσε φ(χ, ψ)
      χ++
      ψ++
}
Για ι=1 έως 5 {
      Δες_Αυτό &Βήτα.Α1()
}
Τύπωσε Βήτα.μετρητής
.

\\ προχωρημένο: θα βάλουμε από ένα αντικείμενο τύπου ομάδα (αντίγραφο) σε πίνακα και σε κατάταση
Πίνακας Βάση 1, Π(10)
Π(10)=Βήτα
\\ μπορούμε να χρησιμοποιήσουμε το Ομάδα(Βήτα) αν το Βήτα γυρνάει τιμή και όχι Ομάδα.
\\ Ξέρουμε αν γυρνάει τιμή επειδή έχουμε δώσει το Αξία {} στον ορισμό του.
\\ ή μπορούμε να το δούμε αυτό: Βάζουμε στο σωρό της Ελ() μια τιμή και κοιτάμε αν είναι ομάδα (ο σωρός θα αδειάσει στην επιστροφή)
\\ η συνάρτηση Ταύτιση κοιτάει αν ταυτίζεται μια ακολουθία τύπων (τους δίνουμε με ένα γράμμα) στα στοιχεία του σωρού τιμών από την κορυφή.
Κάνε Ελ()=Ταύτιση("Ο")
Τύπωσε Ελ(Βήτα) ' θα δώσει -1

Τύπωσε Ελ(5), Ελ(Βήτα.Μετρητής) ' θα δώσει 0  και 0
Κατάσταση Κ="κλειδί1":=Βήτα
\\ τα αντικείμενα Ομάδα μέσα σε πίνακες και καταστάσεις λέγονται κλειστά
\\ γιατί τα μέλη δεν είναι στη λίστα μεταβλητών και στη λίστα τμημάτων/συναρτήσεων
\\ όπως επίσης τα αντικείμενα δεν έχουν όνομα, άρα δεν μπορούμε να πάρουμε αναφορά
\\ Όμως πρόσκαιρα μπορούμε να πάρουμε αναφορά, το κάνει ο διερμηνευτής ανοίγοντας τα αντικείμενα
\\ Άνοιγμα σημαίνει να δώσει όνομα και να "απλώσει" βάσει αυτού τα μέλη του αντικειμένου στις λίστες
\\ μόλις γίνει η χρήση γίνεται το "μάζεμα"
Για Π(10), Κ("κλειδί1") {
      Τύπωσε .Α1(10,2), .Μετρητής
      Τύπωσε ..Α1(10,2), ..Μετρητής \\ με δυο τελείες κοιτάμε στο δεύτερο αντικείμενο
      \\ εδώ γίνεται κλήση με αναφορά, γιατί υπάρχουν (αλλά δεν φαίνονται) ονόματα αυτόματα!
      Δες_Αυτό &.Α1()
      Δες_Αυτό &..Α1()
      Τύπωσε .Μετρητής
      Τύπωσε ..Μετρητής \\ με δυο τελείες κοιτάμε στο δεύτερο αντικείμενο
}
\\ μπορούμε να ανοίγουμε τα αντικείμενα άμεσα
Τύπωσε Π(10).Μετρητής, Κ("κλειδί1").Μετρητής
Π(10).Μετρητής=0
Κ("κλειδί1").Μετρητής=0
Τύπωσε Π(10).Μετρητής, Κ("κλειδί1").Μετρητής

1 σχόλιο: