Τετάρτη 13 Ιανουαρίου 2016

Ισότητα για αντικείμενα (Μ2000)

Στις νέες εκδόσεις και ειδικότερα στην 10 υπάρχει ο τελεστής είναι που μας λέει αν δυο αναγνωριστικά δείχνουν το ίδιο αντικείμενο. Επίσης υπάρχει ο τελεστής είναι τύπος  που παίρνει δεξιά τον όνομα του τύπου ενός αντικειμένου (βασικού τύπου Ομάδα) και αριστερά μια ομάδα και μας λέει αν είναι ή όχι αυτός ο τύπος:
Κενός=(,)
Α=(1,2,3,4)
Β=Α
Τύπωσε Α είναι Β, Α είναι Κενός ' Αληθές Ψευδές
Α=Κενός
Τύπωσε Α είναι Β, Α είναι Κενός ' Ψευδές Αληθές


Κλάση Αλφα {
Χ=1, Ψ=1
}
Γ=Αλφα()
Τύπωσε Γ είναι τύπος Αλφα ' Αληθές
Κλάση Βήτα ως Αλφα {
Τμήμα ΧΨ {
Τύπωσε ,
}
}
Δ=Βήτα()
Τύπωσε Δ είναι τύπος Βήτα ' Αληθές
Τύπωσε Δ είναι τύπος Αλφα ' Αληθές
Τύπωσε Γ είναι τύπος Βήτα ' Ψευδές
Δες {
Τύπωσε Γ είναι Α
}
Αν Λάθος Τότε Τύπωσε Λάθος$
Ζ->Γ
Τύπωσε Ζ είναι Γ ' Αληθές
Ζ->Δ
Τύπωσε Ζ είναι Γ ' Ψευδές
Τύπωσε Δ είναι Γ
Μ=Δ
Τύπωσε Δ είναι Μ ' Ψευδές

Το Γ δεν μπορεί να συγκριθεί με το Α είναι εντελώς διαφορετικού τύπου αντικείμενα! Το Ζ επειδή είναι δείκτης για αντικείμενο μπορεί να χρησιμοποιηθεί! Το Μ είναι νέο αντικείμενο από το Δ άρα δεν είναι το Δ.



Στη Μ2000 δεν έχουμε συνάρτηση η μέθοδο που να μας δηλώνει αν δυο αντικείμενα είναι ίδια.
Μπορούμε να δούμε αν έχουν ίδιες τιμές, με δική μας συνάρτηση.

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

\\ We use a small module for printing
Module PrintBool {
      \\ read any from stack
      \\ numbers  0 or -1 are dispalyed as False or True
      \\ All are right justify in column
     While Not Empty {
            If IsNum then {
                  Print $(7),str$(Number,";\T\r\u\e;\F\a\l\s\e;"),$(0)
            } Else Print $(7),Letter$,$(0)
     }
     Print
}
Class Alfa {
      A=10, B$, K
      Function AxK {
            Read .K
            =.A*.K
      }
}
\\ now we have a Alfa() class function
\\ so we can make a group X
X=Alfa()
\\ now we have a X with 3 parameters and a function
Flush \\ we empty the stack...to ensure that PrintBool take only what we give
PrintBool format$("X.AxK(10)={0}",X.AxK(10)) ' prints X.AxK(10)=100
\\ we can make a Group Y also
Group Y {
      A=10, B$, K
}
\\ In M2000 we don't have an equal operator for Groups
\\ Groups return 0 as value - and also pass a reference
\\ So we make these functions
Function Equal {
      Read A, B
      =A.A=B.A and A.B$=B.B$ and A.K=B.K
}
Function Equal2 {
      Read &A, &B
      =A.A=B.A and A.B$=B.B$ and A.K=B.K
}
KK=X=Y \\ KK is a copy of Y  -- So Don't used it
PrintBool Type$(KK) \\ also we can print labels
KK1=X=Y or true \\ KK1 is a double with value -1  -- also don't used
PrintBool Type$(KK1)
\\ we can't use an operatror for Equality
\\ We can use a user function and extract what we mean by equal
\\ Here Equal as for variables


\\ Because PrintBool read any number of parammeters is good to open a clear new stack
Stack New {
      PrintBool Equal(X,Y) \\ false
      Y.K=10
      PrintBool Equal(X,Y) \\ true  as for variables  - PASSING BY VALUE -COPY
      PrintBool Equal2(&X,&Y) \\ true  as for variables PASSING BY REFERENCE
      Y=X \\ we can make a union - so now Y has a function AxK()
      Print Y.AxK(20)
      Push 10=10 \\ look the effect of using stack, the next module read 4 parameters
      PrintBool Equal2(&X,&Y),3=3, 4>5
}


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

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

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