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

Επέκταση με Ισχνές Αναφορές ΙΙ


Σε αυτό το παράδειγμα θα ασχοληθούμε με μια ομάδα με μια μεταβλητή alfa$. Στο τέλος θα χρησιμοποιήσουμε την ισχνή αναφορά στην ομάδα για να κάνουμε αλλαγή στην alfa$ σε ένα τμήμα (το οποίο δεν βλέπει την kk ομάδα, αλλά πρόσκαιρα την βλέπει σε μια Για {}.)

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

Με απλά λόγια η ισχνή αναφορά είναι αναφορά στη ζήτηση (on demand), εκθέτοντας το όνομα ως  γενική μεταβλητή ενώ η κανονική αναφορά είναι μια πραγματική αναφορά  που φτιάχνει τοπικό όνομα ενώ δείχνει στην ίδια μνήμη, από την δημιουργία της.

Που μας εξυπηρετεί η ισχνή αναφορά; Εκτός από το να φτιάχνουμε αναφορές σε στοιχεία πίνακα που δεν γίνονται με κανονικές αναφορές (οι κανονικές γίνονται στα ονόματα μόνο), η ισχνή αναφορά έχει ένα πλεονέκτημα το οποίο μπορεί να γίνει μειονέκτημα. Έχει το πλεονέκτημα να μην χρειάζεται να αποδοθούν ονόματα. 

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

Το μειονέκτημα είναι ότι η ισχνή αναφορά ΔΕΝ είναι αναφορά. Δηλαδή αν την φυλάξω κάπου και βγω από το χώρο που την έφτιαξα τότε η χρήση της δεν βγάζει κάπου, δεν θα υπάρχει το συγκεκριμένο αναφερόμενο, ή το χειρότερο μπορεί να συμπέσει μια άλλη δημιουργία με κοινά ονόματα. Έτσι η άμεση αναγωγή της ισχνής αναφοράς σε αναφορά δεν είναι πάντα σίγουρη.

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

Σχηματικά: 
Ισχνή Αναφορά -> Παράδοση ονόματος για χρήση χωρίς άλλο όνομα, ως γενική μεταβλητή, άρα οπουδήποτε διαβάζεται αρκεί να μην την έχουμε σβήσει!
Κανονική Αναφορά-> Εξαγωγή ονόματος και στη παραλαβή Δημιουργία Ονόματος τοπικού. Σε ομάδες γίνεται κανονικά παραγωγή ονόματος για κάθε μέλος της (και για τις ομάδες που μπορεί να περιέχει).

Ομάδα kk {
      alfa$="ok"
}
Τύπωσε Εκφρ$(kk.alfa$) ' δίνει την τιμή της μεταβλητής  - ok
k$=Ισχνή$(kk.alfa$) ' τώρα παράγουμε την ισχνή αναφορά
\\ στην Εκφρ$() δέχεται αλφαριθμητικό άρα υπάρχει θέμα
\\ πώς θα ξέρει αν αυτό είναι κανονικό ή αναφορά
\\ το βρίσκει αν υπάρχει τελεία μετά το $
Τύπωσε Εκφρ$(k$.) ' γυρνάει το "οκ"
Τύπωσε Εκφρ$(k$) ' γυρνάει  ??.kk.alfa$ όπου ?? το πρόθεμα που μπαίνει αυτόματα.
\\ Την τελεία την ελέγχει όταν βρει ένα αλφαριθμητικό
\\ άρα και σε αλφαριθμητικές συναρτήσεις
Τύπωσε Εκφρ$(Ισχνή$(kk.alfa$).) ' γυρνάει το "οκ"
Τύπωσε Εκφρ$(Ισχνή$(kk.alfa$)) ' γυρνάει  ??.kk.alfa$
\\ ο λόγος που "παίζει" η τελεία είναι ότι μπορούμε να προσθέσουμε
\\ μια μεταβλητή "ζωντανά", δηλαδή τη στιγμή που το θέλουμε
\\ Εδώ η Ισχνή$(kk) γυρνάει ισχνή αναφορά μόνο για την ομάδα
\\ μπορώ όμως να το "προσθέσω"
Τύπωσε Εκφρ$(Ισχνή$(kk).alfa$) ' γυρνάει το "οκ"
\\ την κρατάω σε μια μεταβλητή
k1$=Ισχνή$(kk)
Τύπωσε Εκφρ$(k1$.alfa$) ' γυρνάει το "οκ"
\\ Η Ισχνή$() δουλεύει και πάνω στο εξαγώμενο άλλης Ισχνή$()
k2$=Ισχνή$(k1$.alfa$)
Τύπωσε Εκφρ$(k2$) 'γυρνάει  ??.kk.alfa$
Τύπωσε Εκφρ$(k2$.) 'γυρνάει το "οκ"
\\ Μπορώ το k1$.alfa$ να το έχω στην αριστερή πλευρά άμεσα!
\\ ενώ δεξιά θα το έχω σε Εκφρ$()
\\ Όμως είναι σαν τις γενικές τώρα θέλουν <=
k1$.alfa$<="yes"
\\ Μπορώ να χρησιμοποιήσω την Για με ισχνή αναφορά. Αυτό είναι νέο!
\\ Εδώ θα κάνουμε δοκιμή μέσα σε τμήμα.
\\ Ουσιαστικά το kk$
Τμήμα ΔοκιμασέΜε {
      Για Γράμμα$ {
            Τύπωσε .alfa$
            .alfa$<=.alfa$+" "+.alfa$
            Τύπωσε .alfa$ ' yes yes
      }
}
ΔοκιμασέΜε k1$

Τύπωσε Εκφρ$(k2$.) ' yes yes
Τύπωσε Εκφρ$(k1$.alfa$) ' yes yes


\\ Λειτουργία με κανονική αναφορά
kk.alfa$="yes"
Τμήμα ΔοκιμασέΜε2 {
Διάβασε &kk2
      Για kk2 {
            Τύπωσε .alfa$
            .alfa$=.alfa$+" "+.alfa$
            Τύπωσε .alfa$ ' yes yes
      }
}
ΔοκιμασέΜε2 &kk




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

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

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