Σάββατο 19 Σεπτεμβρίου 2015

Υποκλάσεις και άλλα θέματα στη Μ2000 (Ανανέωση)

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


Όταν γράφτηκε αυτό το παράδειγμα δεν υπήρχαν τύποι, ούτε δείκτες σε ομάδες (μεταβλητές που κρατάνε "εν ζωή" μια ομάδα). Έτσι εδώ έχουμε "επώνυμες" ομάδες, που η ζωή τους χάνεται στο πέρας εκτέλεσης του τμήματος, και πτητική (στα α(0), α(1), α(2), α(3)) που έχουν μοναδικό δείκτη, δηλαδή δεν γίνεται εξαγωγή δείκτη πχ στο ΈναΌνομα=α(0), αλλά έμμεσα στο Για α(2) { } φτιάχνεται ένα επώνυμο - με όνομα που δεν βλέπουμε- για να το χειριστούμε στο μπλοκ της Για αντικείμενο [, αντικείμενο] {}.

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

Στο πρόγραμμα τα Μ, Κ, ΚΚ είναι επώνυμες ομάδες, το Λ είναι δείκτης σε ομάδα (όχι όμως ο υποτύπος δείκτης σε επώνυμη ομάδα). Στην α(0) έχουμε απλά μια πτητική ομάδα (ομάδα που μεταφέρεται με τον πίνακα, όπου κατά την αντιγραφή, αντιγράφεται ως νέα πτητική ομάδα), ενώ στην α(3) ξεκίνησες ως πτητική και άλλαξε σε δείκτης σε ομάδα όταν ζητήσαμε δείκτη με το τελεστή ->. Έτσι οι α(3) και α(4) είναι δείκτες σε ομάδα και μια αντιγραφή του  α() στον Β(), θα δώσει αντιγραφές δεικτών για τα α(3) και α(4) άρα θα "βλέπουμε" το ίδιο αντικείμενο, αλλά στο α(0) θα βλέπουμε διαφορετικό, επειδή ο κανόνας στις πτητικές είναι να αντιγράφονται ως ομάδες, ενώ στους δείκτες με ομάδες έχουμε αντιγραφή δείκτη!

Κλάση Βήτα {
      Ιδιότητα Χ {Αξία}=10      
      Συνάρτηση χν(ν) {
            =.[Χ]*ν
      }
      Τελεστής "++" {
            .[Χ]++
      }
}


Μ=Βήτα()
Τύπωσε Μ.Χ
Μ++
Τύπωσε Μ.Χ
Δες {
      Μ.Χ=50 ' δεν το κάνει βγάζει λάθος
}
Τύπωσε Μ.χ=11, Μ.χν(100)=1100
Πίνακας α(10)
α(3)=Βήτα()
α(4)->α(3)
Λ=α(3)
Τύπωσε Λ=>Χ=10
Λ++
Τύπωσε Λ=>Χ=11, Λ=>χν(100)=1100, α(4).χ=11, α(4).χν(100)=1100 ' Η Λ δείναι δείκτης
Τύπωσε Λ είναι α(4), Λ είναι α(3) ' Αληθές Αληθές
α(0)=Βήτα()
// η Α(0) έχει μοναδικό δείκτη, δεν είναι όπως στο α(3), α(4)
// Οπότε δεν έδωσε δείκτη, αλλά πτητική ομάδα που έγινε στο Κ επώνυμη
Κ=Α(0)
Τύπωσε Κ.Χ=10, Κ.χν(100)=1000
// η α(3) έχει δείκτη σε ομάδα
// αλλά με την Ομάδα() μετατρέπουμε το δείκτη σε ομάδα σε πτητική ομάδα με μοναδικό δείκτη.
// και αυτή η ομάδα δίνει τη ΚΚ ως επώνυμη ομάδα
ΚΚ=Ομάδα(α(3))
Τύπωσε ΚΚ.Χ=11, ΚΚ.χν(100)=1100

Πίνακας Β()
Β()=α()
Τύπωσε β(0) είναι α(0) = Ψευδές
Τύπωσε β(3) είναι α(3) = Αληθές



Το παλιό πρόγραμμα του 2015




\\ Παραθέτω το κώδικα με τις επεξηγήσεις!
\\ τα αντικείμενα της Μ2000 είναι ομάδες
\\ Οι κλάσεις είναι κατασκευαστές ομάδων
\\ Ένα τμήμα με το ίδιο όνομα με την κλάση παίρνει τυχόν παραμέτρους
\\ Το Αυτό είναι η ομάδα που θα δώσει η κλάση στην επιστροφή της
\\ όταν την καλέσουμε σαν συνάρτηση να παραδώσει μια ομάδα.
\\ Μπορούμε λοιπόν πάνω σε αυτό να ρίξουμε μια άλλη ομάδα πριν
\\ παραδόσει η κλάση! Και έτσι παρέχουμε μια υποκλάση μαζί με την κλάση.


οθονη 1, 0 \\ μπλε στανταρ χρώμα, διαχωρισμός στην 0 γραμμή - άρα χωρίς
Αναφορά 2, "Παράδειγμα Υποκλάσεων"


Κλάση Άλφα {
      χ=10, υ
      α$="Γειά"
}
Κλάση Γενική Άλφα2 {
      χ=1000
      α$="Γειά χαρά"
      Συνάρτηση Γειά_σου$ {
            =.α$+" και σε σένα"
      }
}
Κλάση Βήτα {
      κ=50
      Τμήμα Βήτα {
            Αν ταύτιση("G") τότε { \\ G από το Group
                  Διάβασε μια_ομάδα
                  Αυτό=μια_ομάδα
            }
      }
}


\\ το 4 σημαίνει αναλογική γραφή, στανταρ τρόπος
\\ το 6 είναι το μέγεθος της στήλης (μη αναλογικής γραφής)
\\ το (,) λέει να μην αλλάξει γραμμή η Τύπωσε, να μείνει ο δρομέας στη στήλη.
Τύπωσε $(4,6),


\\ Υποκλάση Άλφα με στοιχεία της κλάσης Βήτα
β=Βήτα(Άλφα())
Τύπωσε β.χ, β.κ, β.α$


\\ Υποκλάση Άλφα2 με στοιχεία της κλάσης Βήτα
γ=Βήτα(Άλφα2())
Τύπωσε γ.χ, γ.κ, γ.Γειά_σου$()


δ=Βήτα()
Τύπωσε δ.κ


\\ Μπορούμε όμως να προσθέσουμε μετά!
δ=Άλφα()
Τύπωσε δ.χ, δ.κ, δ.α$


\\ Μπορούμε να προσθέσουμε και την Άλφα2
\\ Αλλά τώρα για όσες μεταβλητές υπάρχουν με το ίδιο όνομα στο Άλφα2
\\ δεν θα προσθέσουμε αλλά θα αλλάξουν τιμές αυτές που υπάρχουν ήδη στο δ
δ=Άλφα2()
Τύπωσε δ.χ, δ.κ, δ.α$,δ.Γειά_σου$()
δ.κ++
\\ Τώρα φτιάχνουμε ένα τμήμα και θα περάσουμε τη δ με αναφορά
Τμήμα ΔοκίμασεΑναφορά {
      Διάβασε &μιαΟμάδα
      ομάδα μιαΟμάδα {
            χ=12345
            α$="Όλα καλά"
            ΔενΘαΥπάρχωΜετά = 100
      }
      Τύπωσε μιαΟμάδα.χ, μιαΟμάδα.κ, μιαΟμάδα.Γειά_σου$()
      Τύπωσε μιαΟμάδα.ΔενΘαΥπάρχωΜετά
}
ΔοκίμασεΑναφορά
Τύπωσε δ.χ, δ.κ, δ.α$,δ.Γειά_σου$()
\\ η ΔενΘαΥπάρχωΜετά δεν παραμένει στην ομάδα
Τύπωσε Έγκυρο(δ.ΔενΘαΥπάρχωΜετά) \\ 0  δεν είναι



\\ Μπορούμε να ξανά ορίσουμε ένα τμήμα!
Τμήμα ΔοκίμασεΑναφορά {
      Διάβασε &μιαΟμάδα
      μιαΟμάδα=Αλφα2() \\ την είχαμε ορίσει γενική
      ομάδα μιαΟμάδα {
            ΔενΘαΥπάρχωΜετά = 1024
      }
      Τύπωσε μιαΟμάδα.χ, μιαΟμάδα.κ, μιαΟμάδα.Γειά_σου$()
      Τύπωσε μιαΟμάδα.ΔενΘαΥπάρχωΜετά
}
ζ=Βήτα()
ΔοκίμασεΑναφορά
Τύπωσε Έγκυρο(ζ.χ) \\ δεν υπάρχει ούτε η χ, η ομάδα είναι η Βήτα() καθαρή!


\\ Θα χρησιμοποιήσουμε ένα τμήμα σαν συνάρτηση.
\\ Ενώ μια συνάρτηση επιστρέφει μια τιμή, ένα τμήμα μπορεί
\\ να επιστρέφει πολλές τιμές τοποθετώντας αυτές στο σωρό
\\ ο σωρός της Μ2000 μπορεί σε άλλες γλώσσες να λέγεται στοίβα.
\\ ο σωρός αποτελείται από θέσεις τιμών. Κάθε τιμή μπορεί να είναι μια απλή
\\ ή μια σύνθετη όπως μια πτητική ομάδα, ή ένας πίνακας.
\\ Τα τμήματα έχουν πάντα το σωρό του πατρικού για σωρό
\\ Οι συναρτήσεις ξεκινούν με δικό τους σωρό, που στην επιστροφή θα χαθεί.
\\ Τα νήματα έχουν δικό τους σωρό...αν και βλέπουν κοινές μεταβλητές με
\\ το τμήμα που τα δημιουργεί. Έτσι καλούν άλλα τμήματα με παραμέτρους
\\ στο δικό τους σωρό. Ένα τμήμα σε μια ομάδα όταν το τρέξουμε θα έχει
\\ το σωρό του πατρικού, πάντα.
\\ Στα τμήματα όμως στην επιστροφή δεν χάνεται ο σωρός
\\ Όταν περνάμε τιμές στα τμήματα πάνε στο σωρό, στις πρώτες θέσεις
\\ Το ίδιο ισχύει και για τις συναρτήσεις. Να γιατί δεν ορίζουμε μεταβλητές
\\ ούτε στα τμήματα, ούτε στις συναρτήσεις "εισόδου". 
\\ Υπάρχει η Διάβασε που σηκώνει τις τιμές εκεί που θέλουμε!


Τμήμα ΔοκίμασεΑναφοράΜεΑντιγραφή {
      Διάβασε μιαΟμάδα
      μιαΟμάδα=Αλφα2() \\ την είχαμε ορίσει γενική
      ομάδα μιαΟμάδα {
            ΔενΘαΥπάρχωΜετά = 1024
      }
      Τύπωσε μιαΟμάδα.χ, μιαΟμάδα.κ, μιαΟμάδα.Γειά_σου$()
      Τύπωσε μιαΟμάδα.ΔενΘαΥπάρχωΜετά
      Βάλε μιαΟμάδα \\ η ομάδα από "στέρεα" έγινε "πτητική" (κλειστή).
}
ΔοκίμασεΑναφοράΜεΑντιγραφή ζ
Διάβασε ζ \\ τώρα αντιγράφτηκε η μιαΟμάδα που μπήκε στο σωρό!
Τύπωσε ζ.χ, ζ.ΔενΘαΥπάρχωΜετά


\\ Αν ένα τμήμα είναι σε ομάδα "πτητική", όταν το καλέσουμε θα γίνει η ομάδα
\\ προσωρινά "στέρεα" και θα κληθεί το τμήμα. Στο πέρας της κλήσης η ομάδα
\\ θα "επιστρέψει"...στην "πτητική" κατάσταση.
\\ Εδώ είδαμε ότι η πτητική ομάδα υπάρχει στο σωρό και την διαβάζουμε σε
\\ μια "στέρεα" ομάδα. Τώρα θα δούμε τις πτητικές ομάδες.
\\ θα αντιγράψουμε αυτές που έχουμε στο α(). Θα έχουμε πλήρη αντιγραφή
\\ Μαζί με τυχόν πίνακες, συναρτήσεις, τμήματα.
Πίνακας α(10)
α(0)=β, γ, δ, ζ
Τύπωσε α(3).ΔενΘαΥπάρχωΜετά
α(0).κ++
Τύπωσε α(0).κ
\\ Επειδή  κάθε φορά έχουμε τη διαδικασία της αντιγραφής σε προσωρινή
\\ στέρεα κατάσταση, υπάρχει τρόπος να το κάνουμε αυτό για πολλές εργασίες
\\ Όμως υπάρχει μια διαφορά. Μέσα στη Για ότι νέο δημιουργήσουμε θα χαθεί!
\\ Εκτός από νήμα (αλλά τα νήματα δεν έχουν όνομα, μόνο αριθμό χειρισμού)


Για α(1) {
Τοπική α$, ν \\ και να υπάρχουν πριν προσωρινά θα φτιαχτούν νέες
Βάλε &αυτό : Διάβασε α$ : α$=α$+"." \\ μετατροπή αναφορά σε αλφαριθμητικό
για ν=1 έως ομάδα.σύνολο(αυτό) {
      \\ κόβουμε το α$ από το όνομα κάθε μέλους.
      τύπωσε δεξιμέρος$(μέλος$(αυτό,ν), α$), μέλους.τύπος$(αυτό, ν)
}
\\ δεν μπορώ να ορίσω τοπική την Λ$ γιατί τότε
\\ δεν μπορώ να της δώσω αναφορά.
Βάλε μέλος$(αυτό, 3) : Διάβασε &Λ$
Τύπωσε Λ$
Λ$="Κάτι άλλο"
}
\\ τώρα ότι φτιάξαμε στη Για έχει χαθεί, εκτός από ό,τι έχουμε αφήσει στις
\\ μεταβλητές της ομάδας. Δείτε εδώ:
Τύπωσε α(1).α$


Τμήμα ΔοκίμασεΠτητικήΟμάδα {
\\ πέρασμα και με αντιγραφή και με αναφορά, ένα την κάθε φορά!
Αν ταύτιση("A") τότε { Διάβασε Π() \\ προσοχή "Α" κεφαλαίο λατινικό.
} αλλιώς Διάβασε &Π()
      Για Π(1) {
      ++
      Βάλε &αυτό : Διάβασε α$ : α$=α$+"."
            για ν=1 έως ομάδα.σύνολο(αυτό) {
            τυπωσε δεξιμέρος$(μέλος$(αυτο,ν), α$), μέλους.τύπος$(αυτό, ν)
      }
      }
}
\\ περνάμε με αναφορά ένα πίνακα που έχει τέσσερις ομάδες
\\ στις πρώτες θέσεις.
\\ Αν σκεφτεί κανείς ότι μια ομάδα μπορεί να έχει πίνακες
\\ και ότι οι πίνακες αυξομειώνονται δυναμικά τότε ένα πέρασμα μπορεί
\\ να περάσει πολύ πράγμα!
Τύπωσε α(1).κ \\50
ΔοκίμασεΠτητικήΟμάδα &α()
Τύπωσε α(1).κ \\51
\\ Στην αντιγραφή αντιγράφονται όλες οι ομάδες (και οτιδήποτε)
\\ Για το λόγο αυτό δεν έχουμε (κανονικά) αναφορές προς τα έξω μέσα στις ομάδες
\\ στις μεταβλητές της, ενώ πρόσκαιρα μπορούν να υπάρχουν στα τμήματά της.
\\ Εκτός και αν κρατάμε αυτές που λέμε "ισχνές αναφορές" δηλαδή
\\ απλά κάποια αλφαριθμητικά που έχουμε καταχωρήσει αναφορές.
\\ Μια πραγματική αναφορά σημαίνει όνομα που δείχνει σε κοινή μνήμη
\\ Και προέρχεται από την Διάβασε, η οποία βρίσκει ένα αλφαριθμητικό
\\ στο σωρό, κοιτάει αν υπάρχει όντως μνήμη, και την δίνει στο νέο όνομα.
\\ Σε ομάδες υπάρχει το Ανέθεσε που κάνει αλλαγή αναφοράς
\\ σε μεταβλητές της ομάδας, άρα όχι σε νέο όνομα! Αλλά αυτή έχει νόημα
\\ σε μη πτητική ομάδα (ή για όσο η ομάδα είναι στέρεα).
\\ Μια ισχνή αναφορά είναι το αλφαριθμητικό που χρειαζόμαστε για να κάνουμε
\\ μια πραγματική αναφορά με τη Διάβασε.
ΔοκίμασεΠτητικήΟμάδα α()
Τύπωσε α(1).κ \\51 δεν αλλάζει

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

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

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