Τρίτη 8 Μαρτίου 2016

Γεγονότα και Αντικείμενα Εκτέλεσης (ανανεώθηκε)

Σχετίζεται με την αναθεώρηση 182.

Από τις 29/2 που  σκέφτηκα να βάλω τα γεγονότα την Μ2000, διερευνώ τις δυνατότητές τους. Πολλές φορές ο τρόπος που φτιάχνουμε κάτι, μας δίνει και άλλες δυνατότητες (από αυτές που αρχικά σκεφτήκαμε). Εδώ θα δούμε τα γεγονότα και στατικές μεταβλητές.

Aς δούμε ένα γεγονός Α με μια συνάρτηση  (χωρίς στατική μεταβλητή), απλά για να κατανοήσουμε ότι μπορούμε να συνδέσουμε μια άλλη συνάρτηση (εκτός από την ανώνυμη που περιλαμβάνεται στον ορισμό). Επίσης βλέπουμε ότι δεν έχει παραμέτρους.
Η πρώτη Κάλεσε Γεγονός θα μας τυπώσει το Γειά σου Κόσμε. Η δεύτερη θα το ξανατυπώσει αλλά θα τυπώσει και το Hello World.

Γεγονός Α {
      Συνάρτηση {
            Τύπωσε "Γειά Σου Κόσμε"
      }
}
Κάλεσε Γεγονός Α
Συνάρτηση ΚαιΑυτό {
      Τύπωσε "Hello World"
}
Γεγονός Α νέο ΚαιΑυτό()
Κάλεσε Γεγονός Α



Παρακάτω θα φτιάξουμε μια συνάρτηση που θα ονομάσουμε Βηματική και θα βάλουμε μια στατική Α. Στατικές φτιάχνουμε για απλές μεταβλητές, όχι για πίνακες ή αντικείμενα, και λέγονται στατικές όχι γιατί συνδέονται με τον κώδικα αλλά επειδή συνδέονται με το αντικείμενο εκτέλεσης του κώδικα. Αν από το ίδιο τμήμα καλούμε τη συνάρτηση τότε έχουμε το ίδιο αντικείμενο εκτέλεσης. Όμως αν κληθεί διαδοχικά από ένα γεγονός τότε αποδίδεται νέο αντικείμενο.

Καθαρό  \\ προσοχή σβήνει όλες τις μεταβλητές και τις στατικές
Συνάρτηση Βηματική {
      Στατική Α=1
      Επίλεξε Με Α
      Με 1
      Τύπωσε "Ένα",
      Με 2
      Τύπωσε "Δύο",
      Με 3
      Τύπωσε "Τρία",
      Αλλιώς
      {
            Τύπωσε "Τέσσερα",
            Α=0
      }
      Τέλος Επιλογής
      Α++
      Τύπωσε Αριθμός
}
Γεγονός Α { Διάβασε X }
Γεγονός Α Νέο Βηματική()
Κάλεσε Γεγονός Α, 0
Κάλεσε Γεγονός Α, 0
Τύπωσε Υπό
Γεγονός Α Νέο Βηματική()
Κάλεσε Γεγονός Α, 0
Τύπωσε Υπό
Γεγονός Α Νέο Βηματική()
Για Ι=1 έως 3 {
      Κάλεσε Γεγονός Α, Ι
      Τύπωσε Υπό
}
Γεγονός Α Πέτα Βηματική()
Κάλεσε Γεγονός Α, 0


Κάθε φορά που καλούμε το γεγονός τρέχουν ξεχωριστά αντικείμενα - συναρτήσεις! Κάθε μία έχει τη δική της στατική και ξέρει σε τι βήμα βρίσκεται! Περνάμε και μια τιμή η οποία λαμβάνεται από την Αριθμός στη τελευταία εντολή Τύπωσε Αριθμός. Έχουμε δώσει τρεις νέες συναρτήσεις Βηματική(). Στο τέλος πετάμε τη τελευταία που δώσαμε, και καλούμε τις άλλες δυο.

Πιο δύσκολο είναι το παρακάτω, αν και μοιάζει με το αρχικό, εδώ περνάμε δυο οκνηρές συναρτήσεις. Οκνηρές γιατί το ΚαιΑυτό() δεν είναι η συνάρτηση που δίνουμε αλλά αυτή που περιέχεται σε μια ανώνυμη. Όταν θα κληθεί από το Γεγονός τότε αυτή η ανώνυμη συνάρτηση θα βρεθεί στο χώρο του τμήματος, επειδή γνωρίζει σε ποιον τμήμα δημιουργήθηκε, και θα καλέσει την ΚαιΑυτό(100,Αριθμός) όπου ο αριθμός είναι αυτός που του δίνει το Γεγονός, ενώ το 100 θα μπορούσε να ήταν μια μεταβλητή από το τμήμα,

Καθαρό
Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε "Γειά Σου Κόσμε"
      }
}
Συνάρτηση ΚαιΑκόμηΑυτό {
      Διάβασε Α
      Τύπωσε "Hello World 1"
}
Συνάρτηση ΚαιΑυτό {
      Διάβασε Α, Β
      Τύπωσε "Hello World", Α, Β
}
Γεγονός Α νέο Οκν$(ΚαιΑυτό(100, Αριθμός)), Οκν$(ΚαιΑυτό(150, Αριθμός)), ΚαιΑκόμηΑυτό()
Γεγονός Α νέο ΚαιΑκόμηΑυτό()
Κάλεσε Γεγονός Α, 10
Σωρός


Δείτε κάτι άλλο, που θα χρησιμοποιήσουμε αργότερα με την γεγονός: Έχω μια συνάρτηση που την καλώ και μου δίνει τον επόμενο ή το ίδιο χαρακτήρα (Ανάλογα με μια τιμή 1 ή 0). Η εσωτερική μεταβλητή Θέση δίνει τη θέση του δρομέα (στο Χ άξονα, για το Υ έχουμε την γραμμή).

Καθαρό
Συνάρτηση ΚάθεΧαρ$ {
      Στατική α$, β
      διάβασε κ$, βήμα_χαρ
      αν κ$<>α$ τότε β=1 : α$=κ$
      Αν β>0 τότε {
            =μέσ$(α$, β,1)
            β+=βήμα_χαρ
      } Αλλιώς =""
}
Γ$="Γιώργος"
Ενώ ΚάθεΧαρ$(Γ$, 0)<>"" {
      Αν θέση>0 τότε Τύπωσε "-";
      Τύπωσε ΚάθεΧαρ$(Γ$, 1);
}
Τύπωσε


Τυπώνει:
Γ-ι-ώ-ρ-γ-ο-ς


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

Καθαρό
Κλάση ΚΧ {
      α$, β      
      Συνάρτηση ΚάθεΧαρ {
            διάβασε κ$, βήμα_χαρ, &αποτέλ$
            αν κ$<>.α$ τότε<=1 : .α$<=κ$
            Αν >0 τότε {
                  αποτέλ$=μέσ$(.α$, )
                  +=βήμα_χαρ
            } Αλλιώς αποτέλ$="" : .α$<=""
      }
}
Γ$="Γιώργος"
Δ$="Αλέξανδρος"
Γεγονός Α1 { Διάβασε αλφαριθμητικό$, &μετρητής, &Αποτέλεσμα$ }
Α=ΚΧ()
Γεγονός Α1 Νέο Α.ΚάθεΧαρ()
Γεγονός Α2 { Διάβασε αλφαριθμητικό$, &μετρητής, &Αποτέλεσμα$ }
Β=ΚΧ()
Γεγονός Α2 Νέο Β.ΚάθεΧαρ()
Τι$=""
{
      Κάλεσε Γεγονός Α1, Γ$, 1, &Τι$
       Αν Τι$<>"" τότε Τύπωσε Τι$
      Κάλεσε Γεγονός Α2, Δ$, 1, &Τι$
      Αν Τι$<>"" τότε Τύπωσε Τι$: Κυκλικά
}

Παρατήρηση: Στα γεγονότα δεν καταχωρούνται οι στατικές, οπότε η παραλλαγή μπορεί να γίνει με αντικείμενα, που έχουν μέλη τις μεταβλητές που θέλουμε για στατικές. (Έκδοση 10).



Μπορώ να περάσω και ανώνυμη συνάρτηση σε αλφαριθμητικό.

Γεγονός Α {
      Διάβασε Χ
}
Πρόσημο=-1
Ομάδα Αλφα {
      μια_τιμή=10
      Συνάρτηση Κ {
            διάβασε Χ, Προ
           Τύπωσε Χ*.μια_τιμή*Προ
      }
}


Γεγονός Α νέο οκν$(Αλφα.Κ(αριθμός, Πρόσημο)), "{Τύπωσε Αριθμός}"
Κάλεσε Γεγονός Α, 30


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

Παρατήρηση. Δεν έχουμε στατικές στη συνάρτηση Αντικείμενο(), αλλά φτιάχτηκε η κλάση ΜεΑντικείμενο που δίνει τις Ποιός, και Αποθήκη, σαν να είναι στατικές. Απλά φτιάχνουμε τρια αντικείμενα Α1, Α2, Α3 και δίνουμε σαν συναρτήσεις τις αντίστοιχες συναρτήσεις από το καθένα. Επίσης χρησιμοποιήθηκε η εντολή Σταθερές (ή Σταθερή) που δημιουργεί ονόματα με τιμές που δεν αλλάζουν.

Καθαρό
Άδειασε
Γενική Ομάδα Λογάριασε {
      Μετρητής=1
      Συνάρτηση Άλλο {
            =.Μετρητής
            ? "Νέος="; .Μετρητής
            .Μετρητής++
      }
}
Γενικό Γεγονός Α {
      Διάβασε για_εκτύπωση$
      Συνάρτηση {
            Τύπωσε για_εκτύπωση$
      }
}


Κλάση ΜεΑντικείμενο {
Ποιός=-1, Αποθήκη$
Συνάρτηση Αντικείμενο {
      Αν .Ποιός=-1 τότε .Ποιός<=Λογάριασε.Άλλο()
      Διάβασε Χειριστής
      Αν .Ποιός=Χειριστής ή Χειριστής=0 τότε {
            Διάβασε ΟδηγίαΜου, &Κάτι$
            Επίλεξε Με ΟδηγίαΜου
            Με 1
                .Αποθήκη$<=Κάτι$
            Με 2
                Κάτι$<=.Αποθήκη$
            Με 3
                  Κάλεσε Γεγονός Α, .Αποθήκη$
            Τέλος Επιλογής
      }
}
}
Α1=ΜεΑντικείμενο()
Α2=ΜεΑντικείμενο()
Α3=ΜεΑντικείμενο()
Γεγονός Όλα { Διάβασε Χειριστής, ΟδηγίαΜου, &Κάτι$ }
Γεγονός Όλα Νέο Α1.Αντικείμενο(), Α2.Αντικείμενο(), Α3.Αντικείμενο()
Συνάρτηση ΚάλεσεΚάτι$ {
      Διάβασε &Δράση, Αντικείμενο, Εντολή, ΜιαΤιμή$
      Κάλεσε Γεγονός Δράση, Αντικείμενο, Εντολή, &ΜιαΤιμή$
      =ΜίαΤιμή$
}
Σταθερές ΒάλεΤιμή=1, ΠάρεΤιμή=2, ΤύπωσεΤιμή=3


Κάλεσε κενή ΚάλεσεΚάτι$(&Όλα, 1, ΒάλεΤιμή, "Πρώτο Θέμα")
Κάλεσε κενή ΚάλεσεΚάτι$(&Όλα, 2, ΒάλεΤιμή, "Άλλο Θέμα")
Κάλεσε κενή ΚάλεσεΚάτι$(&Όλα, 3, ΒάλεΤιμή, "Τελευταίο Θέμα")
Για Ι=1 έως 3 {
      Κάλεσε κενή ΚάλεσεΚάτι$(&Όλα, Ι, ΤύπωσεΤιμή, "")
}
\\  διαβάζω την 2 - η Παράθεση βάζει εισαγωγικά
Τύπωσε "Διαβάζω τη 2 ="+Παράθεση$(ΚάλεσεΚάτι$(&Όλα, 2,ΠάρεΤιμή, ""))
Τύπωσε "Με μια εντολή τυπώνω όλα"
Κάλεσε κενή ΚάλεσεΚάτι$(&Όλα, 0, ΤύπωσεΤιμή, "")



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

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