Παρασκευή, 10 Μαρτίου 2017

Αναθεώρηση 4 (έκδοση 8.4)

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

Το παράδειγμα είναι στα αγγλικά. Το αντικείμενο Ζ θα πάρει την Χ και μια συνάρτηση από την ομάδα t. Την συνάρτηση μόνο για όσο είναι στο τμήμα Alfa. Επειδή όμως υπάρχει η Χ πριν μπει η b ως Ζ στο τμήμα Alfa της t, θα παραμείνει με την αλλαγή τιμής σε 500.
Στην ιδιότητα m πρόσθεσα μια ιδιότητα, Locked, μια συνάρτηση που διαβάζει την κανονική τιμή της ιδιότητας και έναν τελεστή "++"
Έχει γίνει αλλαγή στο κώδικα βάσει της 8.5 έκδοσης. Προστέθηκε η μεταβλητή Αξία (Value) στο τμήμα Value {} η οποία παίρνει αρχική τιμή την τιμή της ιδιότητας και μπορούμε να την αλλάξουμε πριν δοθεί ως επιστροφή. Παραμένει η αναφορά στην τιμή της ιδιότητας, και μπορούμε να την αλλάξουμε!

group b {
      x=100
      property m {
         value {
               if value>200 then value=200
            }
         set {
               if .Locked then exit
               if value>1000 then Error "High Value"
         }
      }=100 \\ set value
      \\ Property {} =... is a  macro
      \\ we can expand this property
      \\ using group {}
      group m {
            Property Locked =False
            function OriginalValue {
                  link parent [m] to m
                  =m
            }
            operator "++" {
                  link parent [m] to m
                  m++
            }
      }
}
    
group t {
      X=500
      function Alfa {=.X**2}
      module alfa {
            read &Z
            Z.m<=600 \\ use <= not =
            Z.m++
            print Z.m, Z.m.OriginalValue()
            z=This
            .X<=100
            print .X, .Alfa()
            print Z.X, Z.Alfa(), Z.m
      }
}      
t.alfa &b
Print b.X