Δευτέρα 7 Δεκεμβρίου 2015

Επέκταση με Ισχνές Αναφορές ΙΙΙ (αναθ. 105)

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

Για να γίνει περισσότερο ενδιαφέρον, βάζουμε στην ομάδα αλφαριθμητικό, πραγματική, πίνακα ακεραίων, μια συνάρτηση και ένα τμήμα. Η συνάρτηση επιστρέφει δυο φορές το αλφαριθμητικό της ομάδας.
Η πιο παράξενη εντολή είναι η Αυτό=Εκφρ(κκ$.) όπου στα δεξιά έχουμε επιστροφή ενός αντικειμένου. Το κκ$ είναι η ισχνή αναφορά. η τελεία μετά εδώ είναι πλεονασμός γιατί δεν έχει λόγο ο διερμηνευτής να ξεχωρίσει αν  θέλουμε το αλφαριθμητικό ή αυτό που δείχνει το αλφαριθμητικό, αλλά δεν είναι λάθος (χρειάζεται στην Εκφρ$() που γυρίζει αλφαριθμητικό, εκτός και αν μετά την ισχνή αναφορά ακολουθεί ιδιότητα ή μέθοδος, δείτε το πρόγραμμα). Έτσι όταν η Εκφρ() έρθει η στιγμή να εκτελεστεί θα βλέπει το αντικείμενο και θα γυρίσει το αντικείμενο. Το οποίο θα πάει στο Αυτό. Το "Αυτό" είναι το αντικείμενο στο οποίο είναι το Τμήμα, δηλαδή η ομάδα. Στην συνάρτηση α$ τα .α$ είναι κανονικά Αυτό.α$ αλλά δεν χρειάζεται να το γράφουμε:

      Συνάρτηση α$ {
            =Αυτό.α$+Αυτό.α$
      }


Αυτό λοιπόν που κάνουμε είναι να αντιγράψουμε το τρέχον κκ$ στο Αυτό. Στην πρώτη περίπτωση που έχουμε την ισχνή αναφορά στο α, στο επώνυμο τμήμα, αυτά τα δύο ταυτίζονται. Η αντιγραφή στο ίδιο δεν μας χαλάει! Στην δεύτερη περίπτωση όμως δεν ταυτίζονται. Δείτε στην ΔοκιμασέΜε την εντολή:

      κκ$.α 1234, κκ$

Λέμε στο αντικείμενο kk$ που είναι κλειστό να ανοίξει (άρα παίρνει ένα όνομα αυτόματα έστω α123 και καλούμε το α123.α με παραμέτρους 1234 και την ισχνή αναφορά στην kk$. Άρα όταν φτιαχτεί το α123 θα έχουμε σε δυο σημεία την ομάδα, στην κλειστή και στην ανοικτή μορφή. Αν δεν δίναμε την ισχνή αναφορά δεν θα υπήρχε κανένα ζήτημα, και στο τέλος το σύστημα μαζεύει τα μέλη, και τα αντιγράφει στη κλειστή ομάδα. Αλλά εδώ μέσα στο τμήμα ανοίγουμε την κλειστή ομάδα εκ νέου. με τη χρήση της ισχνής αναφοράς έχουμε τη κανονική ομάδα σε άμεση αναφορά όποτε το ζητήσουμε. Και δεν ανοίγει μια φορά αλλά τέσσερις (με μια Για {} θα την ανοίγαμε μια φορά, αλλά δεν μας πειράζει αυτό). Κάθε φορά οι αλλαγές αποθηκεύονται στο κανονικό (αφού κλείνει άμεσα). Αν παραλείψουμε την αντιγραφή του κανονικού στο "ανοιγμένο", το ΑΥΤΟ,  όταν θα κλείσει θα μας σβήσει ότι κάναμε στο κανονικό!


Φόρμα 60,32
Ομαδα α {
      α$="οκ"
      β=10
      Πίνακας α%(20)=2
      Συνάρτηση α$ {
            =.α$+.α$
      }
      Τμήμα α {
            Διάβασε α, κκ$
            κκ$.β-! ' αλλαγή προσίμου
            κκ$.α$<="*** "
            Τύπωσε "Μέσα στο α, στην ομάδα α"
            Τύπωσε α, συναρτηση(κκ$.α$()), εκφραση(κκ$.β)
            Αυτο=Εκφρ(κκ$.) ' αυτό το χρειάζεται αν η κκ$ δείχνει σε ανώνυμη ομάδα (σε στοιχείο πίνακα)
            \\ αλλά δεν μας χαλάει να είναι εδώ ακόμα και αν  έχουμε επώνυμη ομάδα!
            }
}
\\ κάνω ένα αντίγραφο της α στη β
β=α
Τμήμα ΔοκιμασέΜε {
      \\ διαβάζουμε την ισχνή αναφορά ομάδας
      Διάβασε κκ$
      Τύπωσε Εκφρ$(κκ$.α$) \\ τυπώνω αλφαριθμητικό
      Τύπωσε Εκφρ(κκ$.β) \\ τυπώνω αριθμό
      Τύπωσε Εκφρ(κκ$.α%(3)) \\ τυπώνω στοιχείο ακέραιου πίνακα
      Τύπωσε Εκφρ$(κκ$.α$()) \\ τυπώνω αποτέλεσμα συνάρτησης
      \\ χρειάζεται πέρασμα γενικής
      κκ$.α$<="123"    \\ η χρήση του = δημιουργεί τοπική μεταβλητή...
      κκ$.β<=123 \\ ...αλλά όχι το α$ αλλά όλο το όνομα μαζί με το ΔοκίμασέΜε
      κκ$.α%(3)=123 \\ οι πίνακες δεν παίρνουν <= (γιατί δεν δημιουργούνται με =_
      κκ$.α 1234, κκ$ \\ καλώ τμήμα και περνάω μια μεταβλητή και την ισχνή αναφορά
      ? Εκφρ(κκ$.β), "β"
}
ΔοκιμασέΜε Ισχνη$(α)
Διαμέσου Δείξεμου(Ισχνη$(α))
Τύπωσε "***************************************************"
\\ Φτιάχνω έναν πίνακα με 10 στοιχεία από 0 έως 9
\\ και βάζω από ένα αντίγραφο του α από την αρχική τιμή που είχα σώσει στη β
Πίνακας Α(10)=β
\\ Απόδειξη:
Τύπωσε α(2).β, α(5).β
Τύπωσε "***************************************************"
αα$= Ισχνή$(α(2))
ΔοκιμασέΜε αα$
Διαμέσου Δείξεμου(αα$)


\\ κάνει έξοδο μόλις φτάσει σε ρουτίνες ο διερμηνευτής
\\ είναι μαθημένος...:)
Ρουτινα Δείξεμου(εδώ$)
      Για εδώ$ {
            Τύπωσε .α$
            Τύπωσε
            Τύπωσε .α%(3)
            Τύπωσε .α$()
      }
Επιστροφή



Περί της ΓΙΑ {}
Η ΓΙΑ έχει δυο μορφές επανάληψης:
Για ι=1 έως 1000 ανά 2 { Τύπωσε ι }
-έχει και το έξοδος για να βγαίνει από το μπλοκ εντολών αλλά μπορεί να βγεί και με ΠΡΟΣ/GOTO

και
Για ι=1 έως 1000 ανά 2 : Τύπωσε ι : Επόμενο ι
- έχει και το Έξοδος Για  και μπορούμε να έχουμε και άλλο Επόμενο ι για επιτόπου επιστροφή στην αρχή.
Επίσης η ΓΙΑ έχει τρεις χρήσεις ακόμα:
Μια χρήση για το ΑΥΤΟ (ακόμα και σε τμήμα και σε συνάρτηση δουλεύει), όπου ανοίγει ένα μπλοκ για προσωρινές μεταβλητές, πίνακες, τμήματα, συναρτήσεις. Ό,τι νέο φτιάχνεται με το πέρας εκτέλεσης του Για Αυτό {}  διαγράφεται. Όμως ο σωρός τιμών και οι μεταβλητές που υπήρχαν δεν παθαίνουν τίποτα. Έτσι αν κάτι θέλουμε να το χρειαστούμε τοπικά αυτό κάνει δουλειά
Αν μια μεταβλητή έστω η Ι υπάρχει πιο πριν και θέλουμε μια προσωρινή τότε λέμε Τοπική Ι και δημιουργείται τοπική. Ομοίως αν θέλουμε πίνακα με ίδιο όνομα με κάποιο που υπάρχει στο τμήμα το δηλώνουμε ως τοπική (με κόμμα παίρνει και άλλους πίνακες και μεταβλητές χωρίς τιμές)

Πίνακας α(10)=2
Για Αυτό {
     Τοπική α(5)=5
      Τύπωσε α(3) ' 5
}
Τύπωσε α(7) '2


Στο ίδιο μοτίβο παίζουν και τα Για ομάδα {} και Για ισχνήαναφοράομάδας$ {}
Δείτε όμως τη διπλή τελεία στην εντολή Τύπωσε. Η διπλή τελεία λέει ότι το α(ι) είναι του δ, η μονή ότι είναι του β.
Μπορούμε να την σπάσουμε τη διπλή Για σε φωλιασμένα Για.

Κλάση α1 {α, β , γ, Πίνακας α(10)=3}
β=α1()
β.α(0)=9,8,7,6,5,4,3,2,1,0
δ=α1()
δ.α(0)=0,1,2,3,4,5,6,7,8,9
Για ι=0 έως 9 {
      Για β, δ {
            Τύπωσε .α(ι)*10+..α(ι)
      }
}      

Για ι=0 έως 9 {
      Για β {
            Για δ {
                  Τύπωσε .α(ι)*10+..α(ι)
            }
      }


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

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

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

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