Κυριακή, 2 Απριλίου 2017

Αναθεώρηση 9 (Έκδοση 8.6)

Σε αυτήν την αναθεώρηση διόρθωσα ένα Bug και έκανα μερικές προσθήκες.
Προσθήκη στις Καταστάσεις και στους Πίνακες να μπορούν να χρησιμοποιηθούν σωστά ομάδες με τιμές ή και με δείκτες και τιμές.
Προσθήκη δυνατότητας τελεστών σε ομάδες με όνομα αλφαριθμητικό, δηλαδή να γυρνούν/παίρνουν αλφαριθμητικό:

\\ φτιάχνουμε ομάδα Άλφα$ αλλά υπάρχει και το Άλφα
Ομάδα Άλφα$ {
Ιδιωτικό:
      τ$=""
Δημόσιο:
      Συνάρτηση Μέρος$ (αρχ, τελ) {
            Αν τελ<αρχ τότε Άλλαξε αρχ, τελ
            =Μεσ$(.τ$, αρχ, τελ-αρχ+1)
      }
      Τελεστής "+=" {
            Διάβασε π$
            .τ$<=.τ$+π$
            Βάλε .τ$
      }
      Ιδιότητα Μήκος {Αξία}=0
      Θέσε (.τ$) { .[Μήκος]<=Μήκος(.τ$) }
      Αξία {=.τ$}
}

Άλφα$="Γιώργος"
Τύπωσε Άλφα.Μήκος
Δες {
      Άλφα.Μήκος=100 \\  δεν γίνεται η Μήκος είναι μόνο για ανάγνωση!
}
Τύπωσε Τύπος$(Άλφα$) \\ αναφέρει Group (Ομάδα)
Α$=Άλφα$
Τύπωσε Τύπος$(Ά$) \\ αναφέρει String (Αλφαριθμητικό)
Β$=Ομάδα$(Άλφα$) \\ φτιάχνει ομάδα και με Β$ και με Β
Τύπωσε Β.Μήκος
Τύπωσε Β.Μέρος$(2,4) \\ ιώρ
β$+=" , Πρέβεζα"
Τύπωσε β$



 (Για την ώρα οι τελεστές δουλεύουν για αντικείμενα ομάδες που έχουν όνομα. Για να χρησιμοποιήσουμε τελεστές σε ομάδες σε πίνακες ή καταστάσεις (λίστες με κλειδί) θα πρέπει να χρησιμοποιήσουμε την Για {} πχ Για Α(1) { } και εκεί να πάρουμε το Αυτό και να το ενώσουμε με ένα όνομα π.χ. Ένωση Αυτό στο ΌνομαΑ - γίνεται και σε αλφαριθμητικό πχ Ένωση Αυτό στο  ΌνομαΑ$, και για όσο δεν είμαστε εκτός μπλοκ, θα υπάρχει η ΌνομαΑ ή η ΌνομαΑ$ και θα λειτουργούν οι τελεστές. Σε επόμενη αναθεώρηση θα το λύσω το θέμα)
 

Για το Bug, είναι πολύπλοκο, αλλά το γράφω: είχα κάνει την κλάση (που είναι συνάρτηση που φτιάχνει ομάδες) να γίνεται με κώδικα της Μ2000 που ενσωματώνεται στον ορισμό της κλάσης. Αν και είχα δυο εκδόσεις, την ελληνική και την αγγλική, σκέφθηκα, κακώς, στην προηγούμενη αναθεώρηση να αφήσω μόνο την αγγλική. Αυτό είχε ως αποτέλεσμα να δημιουργεί μόνο αγγλικό κώδικα για την ομάδα που θα έφτιαχνε (το βασικό μέρος) παρόλο που γράφονταν η κλάση στα ελληνικά, και όλα τα μέλη της. Όταν όμως φτιάχνουμε το μέλος Αξία {}  ή το μέλος Θέσε {}  επειδή εσωτερικά χρησιμοποιούμε την Αξία ή την Αξία$ στα αγγλικά θα έπρεπε να ήταν Value και Value$. Επειδή ο ορισμός ομάδας βασίζεται στην εντολή Group ή Ομάδα ο διερμηνευτής παίρνει την γλώσσα της εντολής και ανάλογα δημιουργεί (σαν μακροεντολή) τα όποια υπόλοιπα θέλει - δεν το αναπτύσσω εδώ). 'Ετσι αφού το είχα αφήσει μόνο στο αγγλικό...τα Value και Value$ δούλευαν, ενώ τα Αξία και Αξία$ όχι!

Στο παράδειγμα παρακάτω εκτός από την χρήση της Αξίας, για να περιορίσουμε την αλλαγή τιμής μιας ιδιότητας, δείχνω και μερικά άλλα πράγματα!

Κλάση Α {
      ΑπλήΜεταβλητή
      Ιδιότητα Κ { Αξία, Θέσε } \\ δίνει και παίρνει τιμή
      Ιδιότητα Κ1 {
            Αξία,
            Θέσε {
             Αν Αξία<0 ή Αξία >100 Τότε έξοδος \\ δεν αλλάζει τιμή
            }
      }  \\ δίνει και παίρνει τιμή
      \\ η ομάδα Ν είναι ιδιότητα Ν που την φτιάξαμε με το χέρι!
      \\ έχει και δική της ιδιότητα την Μετρητής
      Ομάδα Ν {
      Ιδιωτικό:
            \ αν θέλουμε δίνουμε αρχική τιμή αλλιώς είναι 0
            Μ=1
      Δημόσιο:
            Αξία {
                  =
            }
            Θέσε {
                  Διάβασε .Μ
                  .[Μετρητής]++
            }
            \\ η Ιδιότητα φτιάχνει την [Μετρητής] ως ιδιωτική στην Ν
            \\ Εδώ λέμε ότι έχει μόνο Αξία (δίνει τιμή) και δεν παίρνει τιμή
            \\ όμως η ιδιωτική παίρνει
            \\ η ιδιωτική είναι αριθμητική μεταβλητή
            \\ ενώ η Μετρητής είναι ομάδα με αξία!
            Ιδιότητα Μετρητής {Αξία}
      }
}


Μ=Α()
Μ.Ν=10
Τύπωσε Μ.Ν.Μετρητής \\ 1
Μ.Ν=50
Μ.Ν=100
Τύπωσε Μ.Ν.Μετρητής \\ 3
Μ.ΑπλήΜεταβλητή=1000
Τύπωσε Μ.Ν, Μ.ΑπλήΜεταβλητή


\\ Μια χρησιμότητα των ιδιοτήτων είναι ότι
\\ μπορούν να φιλτράρουν την είσοδο
\\ εδώ η Μ.Κ1 δέχεται το 50 αλλά όχι το -10, ούτε το 1000
Μ.Κ1=50
Τύπωσε Μ.Κ1 \\ 50
Μ.Κ1=-10
Τύπωσε Μ.Κ1 \\ 50
Μ.Κ1=1000
Τύπωσε Μ.Κ1 \\ 50


Τμήμα ΔεςΤο (&Κ11) {
      Τύπωσε "Δες το"
      Τύπωσε Κ11
      Κ11=40
      Κ11=140
      Κ11=-40
}
\\ οι ιδιότητες μπορούν να περαστούν με αναφορά, χωρίς να περάσουμε
\\ όλο το αντικείμενο
ΔεςΤο &Μ.Κ1
Τύπωσε Μ.Κ1 \\ 40
ΜΜ=1000
ΔεςΤο &ΜΜ \\ εδώ περνάμε στο ίδιο τμήμα με αναφορά μια απλή μεταβλητή
Τύπωσε ΜΜ \\ -40    εδώ αλλάζει η τιμή, δεν υπάρχει μηχανισμός όπως στην ιδιότητα μιας ομάδας!