Τρίτη, 27 Ιουνίου 2017

Eκδοση 8.9

Μι μικρή δίορθωση πάνω στη προηγούμενη αναθεώρηση ώστε τα ορίσματα στις ιδιότητες των αντικειμένων όταν δεν καθαρίζονται επακριβώς να έρχονται στη σειρά που πρέπει, κατά την εςκχώρηση τιμής! Επειδή όμως ολοκληρώθηκε η προσθήκη άλλαξε ο αριθμός έκδοσης από 8.8 σε 8.9

Μπορεί κανείς να αφήσει τις χρωματισμένες παραγράφους! Αναφέρονται στην Ομάδα και στα αντικείμενα της Μ2000 γενικότερα.


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

Η συνάρτηση Ομάδα() δέχεται μια "επώνυμη" ομάδα και δίνει αντίγραφο ακόμα και αν έχει τμήμα Αξία (δεν το εκτελεί). Οι επώνυμες ομάδες αν πάρουν με εκχώρηση άλλη ομάδα, τότε δεν αντιγράφονται με την εκχωρούμενη αλλά συγχωνεύει την εκχωρούμενη στην υπάρχουσα. Αυτό σημαίνει ότι ενδέχεται να αποκτήσει νέα μέλη, και σε όσα υπάρχει κοινό μέλος τότε εκεί θα γίνει αντιγραφή.

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

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

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

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

Μπορούμε λοιπόν να έχουμε μια ομάδα που να έχει μια κατάσταση και στην αντιγραφή θα μεταφέρει απλά το δείκτη σε αυτήν. Και στην κατάσταση αυτή να υπάρχουν άλλες ομάδες.

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


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

Το group alfa (ομάδα alfa) μπορεί να είναι μέσα σε άλλο group (ομάδα). Όπως το έχουμε εδώ παίρνει τιμή αλλά δεν δίνει (δεν έχουμε το value ή αξία μέρος)


Με αγγλικές εντολές:

group alfa {
      set () {
            read d,a,b,c
            Print a,b,c,d
      }
  
}

alfa(1,2,3)=4
group alfa1 {
      set (a,b,c) {
            read d
            Print a,b,c,d
      }
  
}
alfa1(1,2,3)=4

group alfa2 {
      set (a,b) {
            read d, c
            Print a,b,c,d
      }
  
}
alfa2(1,2,3)=4

Με ελληνικές εντολές:

Ομάδα alfa {
      Θέσε () {
            Διάβασε d,a,b,c
            Τύπωσε a,b,c,d
      }
  
}

alfa(1,2,3)=4
Ομάδα alfa1 {
      Θέσε (a,b,c) {
            Διάβασε d
            Τύπωσε a,b,c,d
      }
  
}
alfa1(1,2,3)=4

Ομάδα alfa2 {
      Θέσε (a,b) {
            Διάβασε d, c
            Τύπωσε a,b,c,d
      }
  
}
alfa2(1,2,3)=4

Θα δούμε τώρα στο μέρος Value ή Αξία
Εδώ δεν έχουμε τιμή εκχώρησης, αλλά έχουμε επιστροφή τιμής (με το =)

Στα Αγγλικά
group alfa {
      value () {
            read a, b, c
            print a, b, c
            =100
      }
}
m=alfa(1,2,3)
group alfa1 {
      value (a,b,c) {
            print a, b, c
            =100
      }
}
m=alfa1(1,2,3)
group alfa2 {
      value (a) {
            read b, c
            print a, b, c
            =100
      }
}
m=alfa2(1,2,3)
Print m


Στα Ελληνικά
Ομάδα alfa {
      Αξία () {
            Διάβασε a, b, c
            Τύπωσε a, b, c
            =100
      }
}
m=alfa(1,2,3)
Ομάδα alfa1 {
      Αξία (a,b,c) {
            Τύπωσε a, b, c
            =100
      }
}
m=alfa1(1,2,3)
Ομάδα alfa2 {
      Αξία (a) {
            Διάβασε b, c
            Τύπωσε a, b, c
            =100
      }
}
m=alfa2(1,2,3)
Τύπωσε m



Υπάρχει μια "μακροεντολή" για τους ορισμούς ομάδων, η Ιδιότητα ή Property, η οποία φτιάχνει group (ομάδες) σε υπάρχον ομάδα. Κάνει μερικά πράγματα ώστε στη γονική ομάδα (σε αυτήν που θα βάλουμε την ιδιότητα), να υπάρχει η μεταβλητή με όνομα ίδιο με αυτό της ιδιότητας, πχ αν η ιδιότητα είναι το Αλφα θα υπάρχει το [Αλφα]  (οι χαρακτήρες [ και ] είναι αποδεκτοί για ονόματα μεταβλητών), ενώ αν είναι αλφαριθμητικό πχ Βήτα$ θα φτιαχτεί η [βήτα]$  (το $ στο τέλος), και θα είναι κρυφά (Ιδιωτικά ή Private).
Μια ομάδα σε γονική ομάδα δεν βλέπει τις μεταβλητές της γονικής (ούτε τις συναρτήσεις ή ότι άλλο έχει). Όμως η εντολή Ένωσε (ή Link) ενώνει με αναφορά και από γονική ομάδα όταν όμως του το ζητάμε, οπότε η μακροεντολή βάζει την εντολή αυτή και  λύνεται το ζήτημα του πώς από την εσωτερική ομάδα θα επιδράσουμε στην εξωτερική. Αν προσπαθήσει κάποιος να περάσει με αναφορά την ομάδα που έχουμε ως ιδιότητα τότε η ένωση θα αποτύχει (η ομάδα θα περαστεί χωρίς να έχει "γνώση" της γονικής ομάδα). Έτσι θα πρέπει να περάσει την ομάδα που περιέχει την ιδιότητα και τότε θα λειτουργήσει. Αυτό δεν συμβαίνει με τις απλές μεταβλητές μιας ομάδας. Αυτές μπορούν να περαστούν με αναφορά (έτσι και αλλιώς δεν επιδρούν άμεσα στο αντικείμενο, όπως κάνει η ιδιότητα). Επίσης μπορεί να περαστεί με αναφορά μια συνάρτηση ομάδας και αυτή μπορεί να επιδράσει στο αντικείμενο κατά την εκτέλεση. Η ιδιότητα όμως είναι ομάδα που γυρνάει τιμή (έχει δηλαδή μια ειδική συνάρτηση, κρυφή, για τη δουλειά αυτή), αν και μοιάζει να είναι συνάρτηση.

Κάθε ιδιότητα μπορεί να έχει μια από τις παρακάτω μορφές όπως φαίνεται στα παραδείγματα:

Στα αγγλικά
Group Alfa {
      Property Beta=10
}
Print Alfa.Beta
' we can change value
Alfa.Beta=50
Print Alfa.Beta
' poperty is not the same as a variable in group
Try ok {
      Alfa.Beta++
}
'  Group Alfa.Beta has no operator ++
If Error or not ok Then Print Error$
' We can't erase a group if it has a name (erased after this module terminate)
Group Alfa1 {
      Property Beta {Value}=10
      Module SetToBeta {
            Read .[Beta]
            ' assign value with <=
            ' else interpeter make a local [Beta]
            ' .[Beta]<=50
      }
}
Print Alfa1.Beta
Try ok {
      Alfa1.Beta=50
}
' No group in each side
If Error or not ok Then Print Error$
Alfa1.SetToBeta 50
Print Alfa1.Beta

Group Alfa2 {
      Property Beta {
            Set {
                  ' internal  there is a Read Value
                  Value=Value*2
                  ' Internal there is a [Beta]=Value
                  '  and [beta] is linked to Alfa2.[Beta] a pivate variable
            },
            Value
      }=10
}
Alfa2.Beta=100
Print Alfa2.Beta
Group Alfa0 {
      Value {
            =12345
      }
}

Group Alfa3 {
      Property Beta {
            Set {
                  If Type$(Value)="Group" Then {
                        Push Value*2 '  pass to stack the Value*2  (Value is group which return double)
                        Local Value ' shadow value with a new one
                        Print Type$(Value) ' type double
                        Read Value
                        Print Type$(Value) 'type double
                  } Else {
                        Value=Value*2
                  }
            },
            Value
      }=10
}
' always groups pass copies of them if no  value part exist
Alfa3.Beta=Group(Alfa0)
Print Alfa3.Beta
' pass a value from Alfa0 not object
Alfa3.Beta=Alfa0
Print Alfa3.Beta

' One parametet fot Set

Group Alfa4 {
      Property Beta {
            Set (n) {
                  If Type$(Value)="Group" Then {
                        Push Value*n
                        Local Value
                        Read Value
                  } Else {
                        Value=Value*n
                  }
            },
            Value
      }=10
}
Alfa4.Beta(10)=Alfa0
Print Alfa4.Beta

Group Alfa5 {
      Property Beta {
            Set () {
                  n=1
                  Read ? n
                  If Type$(Value)="Group" Then {
                        Push Value*n
                        Local Value ' shadow previous Value
                        Read Value
                        ' so now Value is not object but number
                  } Else {
                        Value=Value*n
                  }
            },
            Value
         
      }=10
}
Alfa5.Beta=1000
Print Alfa5.Beta
Alfa5.Beta(2)=1000
Print Alfa5.Beta
Alfa5.Beta(3)=1000
Print Alfa5.Beta

Στα ελληνικά
Ομάδα Άλφα {
      Ιδιότητα Βήτα=10
}
Τύπωσε Άλφα.Βήτα
' εδώ αλλάζουμε τιμή
Άλφα.Βήτα=50
Τύπωσε Άλφα.Βήτα
Δες οκ {
      Άλφα.Βήτα++
}
' θα πάρουμε λάθος γιατί η ομάδα Άλφα.Βήτα δεν υποστηρίζει τον τελεστή ++
Αν λάθος ή όχι οκ Τότε Τύπωσε Λάθος$
' Δεν μπορούμε να σβήσουμε την Άλφα, οπότε θα φτιάξουμε την Άλφα1
Ομάδα Άλφα1 {
      Ιδιότητα Βήτα {Αξία}=10
      Τμήμα ΘέσεΣτηΒήτα {
            Διάβασε .[Βήτα]
            ' με εκχώρηση θέλει το <=
            ' αλλιώς θα φτιάξει ο διερμηνευτής τοπική [Βήτα]
            ' .[Βήτα]<=50
      }
}
Τύπωσε Άλφα1.Βήτα
Δες οκ {
      Άλφα1.Βήτα=50
}
' δίνει λάθος γιατί ο διερμηνευτής βλέπει ομάδα στα αριστερά και τιμή στα δεξιά
' ενώ έχει δει ότι η ομάδα δεν έχει τμήμα Θέσε
Αν λάθος ή όχι οκ Τότε Τύπωσε Λάθος$
Άλφα1.ΘέσεΣτηΒήτα 50
Τύπωσε Άλφα1.Βήτα

' Πάμε στο τρίτο αντικείμενο Αλφα2
Ομάδα Άλφα2 {
      Ιδιότητα Βήτα {
            Θέσε {
                  ' Εδώ η τιμή που δίνοιυμε πάει στο Αξία
                  Αξία=Αξία*2
                  ' Εδώ  η Αξία είναι αριθμητική μεταβλητή
            },
            Αξία
      }=10
}
Άλφα2.Βήτα=100
Τύπωσε Άλφα2.Βήτα
                  ' Αν ήταν ομάδα ίσως να  μη την αφήναμε να καταχωρηθεί
                  ' γιατί στην επόμενη διάβασε θα κάνει συγχώνευση, και αυτό μπορεί να μην το θέλουμε
                  ' για να μην το επιτρέψουμε αυτό, δίνουμε μια εντοιλή Τοπική Αξία
                  ' οπότε σκιάζουμε την υπάρχουσα και δίνουμε μια άλλη με τιμή 0
Ομάδα Αλφα0 {
      Αξία {
            =12345
      }
}

Ομάδα Αλφα3 {
      Ιδιότητα Βήτα {
            Θέσε {
                  Αν Τύπος$(Αξία)="Group" Τότε {
                        Βάλε Αξία*2 ' γυρνάμε στο σωρό την αξία της ομάδας
                        Τοπική Αξία ' σκιάζουμε την Αξία με νεα μεταβλητή
                        Τύπωσε Τύπος$(Αξία) 'είνα τύπου double
                        Διάβασε Αξία ' διαβάζουμε την τιμή
                        Τύπωσε Τύπος$(Αξία) 'είνα τύπου double
                  } Αλλιώς {
                        Αξία=Αξία*2
                  }
            },
            Αξία
      }=10
}
Αλφα3.Βήτα=Ομάδα(Αλφα0)
Τύπωσε Αλφα3.Βήτα
' εδώ δώσαμε απευθείας τιμή και όχι ομάδα
Αλφα3.Βήτα=Αλφα0
Τύπωσε Αλφα3.Βήτα

' Εδώ βάζουμε μια παράμετρο στην Θέσε

Ομάδα Αλφα4 {
      Ιδιότητα Βήτα {
            Θέσε (ν) {
                  Αν Τύπος$(Αξία)="Group" Τότε {
                        Βάλε Αξία*ν
                        Τοπική Αξία
                        Διάβασε Αξία
                  } Αλλιώς {
                        Αξία=Αξία*ν
                  }
            },
            Αξία
      }=10
}
Αλφα4.Βήτα(10)=Αλφα0
Τύπωσε Αλφα4.Βήτα

Ομάδα Αλφα5 {
      Ιδιότητα Βήτα {
            Θέσε () {
                  ν=1
                  Διάβασε ? ν
                  Αν Τύπος$(Αξία)="Group" Τότε {
                        Βάλε Αξία*ν
                        Τοπική Αξία
                        Διάβασε Αξία
                  } Αλλιώς {
                        Αξία=Αξία*ν
                  }
            },
            Αξία
         
      }=10
}
Αλφα5.Βήτα=1000
Τύπωσε Αλφα5.Βήτα
Αλφα5.Βήτα(2)=1000
Τύπωσε Αλφα5.Βήτα
Αλφα5.Βήτα(3)=1000
Τύπωσε Αλφα5.Βήτα



Και εδώ μια επιπλέον προσθήκη (γράψτε το σε άλλο τμήμα έστω B). Η κλάση είναι συνάρτηση που επιστρέφει ομάδα. Είναι δηλαδή ένα "Εργοστάσιο" ομάδων!

Στα ελληνικά
Κλάση Άλφα {
      μετρητής=0
      ιδιότητα Βήτα {
            Θέσε () {
                  Διάβασε α
                  Ένωσε γονικό μετρητής στο μετ
                  μετ++
                  Διάβασε β,γ
                  Τύπωσε Αξία, α, β, γ
            },
            Αξία (α,β,γ) {
                  Αξία=10*α-500*β+γ**10
            }
      }
}
Δέλτα=Άλφα()
Δέλτα.Βήτα(1,2,3)=100
Τύπωσε Δέλτα.μετρητής
Πίνακας Α(10)
Α(1)= Άλφα()
Α(1).Βήτα(1,2,3)=200
Α(1).Βήτα(1,2,3)=300
Τύπωσε Α(1).Βήτα(1,2,3)
Τύπωσε Α(1).μετρητής
Κατάσταση έψιλον=1:=100,"α":="500", "β":=Άλφα()
έψιλον("β").Βήτα(1,2,3)=200
Τύπωσε έψιλον("β").Βήτα(1,2,3), έψιλον("β").μετρητής
έψιλον("β").Βήτα(1,2,3)=300
Τύπωσε έψιλον("β").Βήτα(1,2,3), έψιλον("β").μετρητής


Στα αγγλικά

Class Alpha {
      counter=0
      Property Beta {
            Set () {
                  read a
                  link parent counter to cc
                  cc++
                  Read b,c
                  Print value, a, b, c
            },
            value (a,b,c) {
                  value=10*a-500*b+c**10
            }
      }
}
delta=Alpha()
delta.Beta(1,2,3)=100
Print delta.counter
Dim A(10)
A(1)= Alpha() ' or give this group(delta) which counter is now equal to 1
A(1).Beta(1,2,3)=200
A(1).Beta(1,2,3)=300
Print A(1).Beta(1,2,3)
Print A(1).counter
inventory epsilon=1:=100,"a":="500", "b":=Alpha()
epsilon("b").Beta(1,2,3)=200
Print epsilon("b").Beta(1,2,3), epsilon("b").counter
epsilon("b").Beta(1,2,3)=300
Print epsilon("b").Beta(1,2,3), epsilon("b").counter