Τρίτη 1 Μαρτίου 2016

Αναθεώρηση 174 - Νέο Αντικείμενο Γεγονός.

Η νέα αναθεώρηση πρόσθεσε μια προαιρετική  παράμετρο στην Πάνω ώστε να βγάζει μια σειρά αντίγραφα στη κορυφή του σωρού. (χωρίς την δεύτερη παράμετρο θα βγάλει ένα αντίγραφο από μια θέση που θα υποδείξουμε, με τη δεύτερη θα κάνει το ίδιο Ν φορές)
Άδειασε  \\ αδειάζει ο σωρός τιμών
Σειρά 1,2,3,4,5,6 \\ μπαίνουν στο τέλος, οπότε θα βγει το 1 πρώτο
Πάνω 3,3
Σωρός    \\ δείχνει το σωρό με 1 2 3 1 2 3 4 5 6

Αν θέλω να βγάλω την κορυφή 10 φορές τότε Πάνω 1, 10

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

Κύρια προσθήκη στην αναθεώρηση αυτή είναι το αντικείμενο Γεγονός. Βασίζεται στην ιδέα του προγράμματος παραδείγματος στην με το αντικείμενο TheEvent. Όμως δεν είναι ίδιο. Το σύστημα δουλεύει για την επικοινωνία των αντικειμένων με γεγονότα, και σε αυτό όντως έχουμε το ίδιο πράγμα. Επιπλέον όμως μπορούμε αν πετάμε ή να βάζουμε νέες συνδρομές (subscriptions) και επίσης μπορούμε να βάλουμε μια ή περισσότερες συνδρομές "ανώνυμες" που δεν μπορούμε να πετάξουμε.
Ένα Γεγονός μπορεί να ανήκει σε μια ομάδα, ή σε ένα τμήμα τοπικά ή να το ορίσουμε γενικό. Το Γεγονός πυροδοτείται με κλήση σε αυτό και πέρασμα τιμών (και με αναφορά αν θέλουμε). Μόλις συμβεί αυτό τότε το Γεγονός καλεί όλες τις συνδρομές με αντίγραφα των τιμών (και των αναφορών). Οι συνδρομές είναι συναρτήσεις, τις οποίες κρατάει ως αντίγραφο το Γεγονός παρέχοντας όμως και το περιβάλλον, με συνέπεια αν μια συνάρτηση ανήκει σε ένα αντικείμενο τότε αυτή να μπορεί να αλλάξει τιμές του αντικειμένου!

Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε Χ**2, " οκ"
      }
}

Συνάρτηση Β {
      Διάβασε Κ
      Τύπωσε Κ
}


Συνάρτηση Γ {
      Διάβασε Κ
      Τύπωσε Κ*10
}


Γεγονός Α νέο Β(), Γ()
\\ καλεί τις δυο συναρτήσεις χωρίς να περιμένει αποτέλεσμα
Κάλεσε Γεγονός Α, 20
\\ τυπώνει 20 και 200
Γεγονός Α πέτα Β()
Κάλεσε Γεγονός Α, 20
\\ τυπώνει  200
Γεγονός Α Κράτησε
Κάλεσε Γεγονός Α, 20
\\ δεν κάνει τίποτα
Γεγονός Α Άφησε
Βάλε 20
Κάλεσε Γεγονός Α
\\ τυπώνει  200
\\ η κάλεσε δίνει πρόσβαση στο σωρό του τμήματος
\\ αλλά το Γεγονός θα πάρει τον αριθμό στοιχείων που δηλώθηκαν
Τύπωσε Τύπος$(Α)
\\ δίνει mEvent  


\\ Στο σωρό μπαίνει με αναφορά (αν μπει χωρίς θα είναι άχρηστο)
Τμήμα ΔεςΕδώ {
      Διάβασε
      Κάλεσε Γεγονός Β, 40
}
ΔεςΕδώ


Γεγονός Α Καθαρό
Κάλεσε Γεγονός Α, 100 \\ δεν κάνει τίποτα και πετάει το 100
\\ Μπορώ να το ορίσω ξανά
Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε Χ**2, " οκ2"
      }
}
Κάλεσε Γεγονός Α 100 \\ το πρώτο κόμμα είναι προαιρετικό, εδώ δεν υπάρχει!


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

\\ Μπορώ να φτιάξω ένα γενικό γεγονός
\\ που θα έχουν όλα τα τμήματα πρόσβαση
Γενικό Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε Χ**2, " οκ3"
      }
}
Κάλεσε Γεγονός Α 100



Ομάδα Αλφα {
      μετρητής
      Γεγονός Κ {
            Διάβασε Κάτι$
            Συνάρτηση {
                  \\ η συνάρτηση είναι προαιρετική χωρίς όνομα
                  \\ μπορώ να βάλω σημείωσεις μόνο εδώ
                  \\ τη Διάβασε Κάτι$ την βάζει το σύστημα
                  Τύπωσε Κάτι$
                  .μετρητής++
                
            }
      }
      Τμήμα Διαδικασία {
            Κάλεσε Γεγονός,"οκ"
      }
}


Αλφα.Διαδικασία



Και εδώ το μεγάλο παράδειγμα στα Αγγλικά χωρίς τη χρήση του TheEvent αντικειμένου (δες παράδειγμα στην αναθεώρηση 173)


Ανανεώθηκε 25/10/2021
Στα Windows 10 δεν επιτρέπεται να γράφουμε απ΄ευθείας στο ριζικό κατάλογο C:, οπότε το άλλαξα σε dir$ (τρέχον κατάλογο,  η εντολη Dir User ορίζει τρέχον κατάλογο τον ειδικό κατάλογο της Μ2000, και αυτό γίνεται αυτόματα όταν ανοίγει η Μ2000 σε κατάστασης κονσόλας). Δείτε το με το ? dir$.
Επίσης υπάρχει μια εντολή που ανοίγει το αρχείο στο Notepad.

Form 60,30
Pen 14
Cls 5
Global nl$=chr$(13)+chr$(10)
Class Global Boiler {
Private:
       temp, pressure
Public:
      Module Boiler { Read .temp, .pressure }
      Function getTemp { =.temp }
      Function getPressure {=.pressure }
}


\\  TheEvent publisher
Class Global DelegateBoilerEvent {
      m=1000
      Event BoilerLogHandler { Read message$, &byrefValue }
      Module LogProcess {
               Read tempNow
                remarks$ = "O. K"
               b = Boiler(100, tempNow) : t = b.getTemp()
               p = b.getPressure()
               If ( t > 150 ή t < 80 ή p < 12 ή p > 15) Then {
                  remarks$ = "Need Maintenance"
               }
               Call .OnBoilerEventLog("Logging Info:\n", &.m)
               Call .OnBoilerEventLog("Temparature" + str$(t) + "\nPressure:" + str$(p), &.m)
               Call .OnBoilerEventLog("\nMessage: " + remarks$+"\n", &.m)
               Pen 15 { Print .m } \\ 1006   1012
      }
      Function OnBoilerEventLog {
            Call Event .BoilerLogHandler
      }
}
Class Global BoilerInfoLogger {
Private:
      filename$, fHandler, fHandlerRead, LogNo
Public:
      Module BoilerInfoLogger {
            Read .filename$
            If Not Exist(.filename$) Then {
                  Open .filename$ For Wide Output As .fHandler
                  close #.fHandler
         }
         Open .filename$ For Wide Append As .fHandler
         Open .filename$ For Wide Input As .fHandlerRead
      }
      Function Logger {
          Read info$, &k
          k++
          .LogNo++
          Print # .fhandler, Replace$("\n", nl$, info$);
      }
      Function GetLogNo {=.LogNo}
      Module MoveToStart {
            seek #.fHandlerRead,1
      }
      Function NextLine {
            If Not Eof(#.fHandlerRead ) Then {
                  Line Input #.fHandlerRead, Paragraph$
                  Report Paragraph$
                  =True
            }
      }
      Module Close {
            Close #.fHandler , #.fHandlerRead
      }
   }
Group RecordBoilerInfo {
       Function Logger {
                  Read Info$, &k
                  k++ : Report Replace$("\n", nl$, info$)
                  Rem : Print "stack for values size:", Stack.Size
            }
      Module Main {
            Read YourLogFile$
            filelog = BoilerInfoLogger(YourLogFile$)
            boilerEvent = DelegateBoilerEvent()
            Event boilerEvent.BoilerLogHandler new .Logger(), filelog.logger()

            boilerEvent.LogProcess 12 : GetAllMessages()
            boilerEvent.LogProcess 11 : filelog.MoveToStart : GetAllMessages()

            filelog.Close
            Print filelog.GetLogNo()

            Sub GetAllMessages()
                  Pen 11 {
                        While filelog.NextLine() { }
                  }
            End Sub
     }
}
\\ Begin
RecordBoilerInfo.Main dir$+"boilerNew.txt"
\\ End
win "notepad", dir$+"boilerNew.txt"
Dos "Del "+quote$(dir$+"boilerNew.txt");


Αποτέλεσμα στο text αρχείο:
Logging Info:
Temparature 100
Pressure: 12
Message: O. K
Logging Info:
Temparature 100
Pressure: 11
Message: Need Maintenance

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

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

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