Δευτέρα 22 Νοεμβρίου 2021

Αναθεώρηση 40. Έκδοση 10

 Έγιναν αρκετά πράγματα και σtην αναθεώρηση 39, και μια μικρή διόρθωση στη 40 (δεν δούλεψε η Όσο με κεφαλαίο Ό με τόνο στην 39).

1) Προστέθηκε μια νέα δομή ελέγχου, η Επανέλαβε Όσο, οι αλλαγές ήταν ελάχιστες πάνω στη Επανέλαβε Μέχρι, αφού ουσιαστικά αυτό που αλλάζει είναι η αντιστροφή του αποτελέσματος της συνθήκης που ακολουθεί τη Μέχρι. Στα Ελληνικά υπάρχει και το Επανάλαβε Όσο (αλλάζει το έ με το ά). Θεωρώ και τα δυο σωστά! Στα Αγγλικά είναι το Repeat When και το Do When (εδώ αλλάζει η πρώτη λέξη αλλά είναι ίδια εντολή). Δεν έβαλα το Do While γιατί η While υπάρχει σαν εντολή και δεν θέλω να μπερδεύει τον αναγνώστη του κώδικα!

ι=0
Επανέλαβε
      ι++
      Τύπωσε ι
Όσο ι<10

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

ι=0
Επανέλαβε {
      ι++
      Τύπωσε ι
} Όσο ι<10

Λειτουργεί και η Συνέχισε (όπως και η Έξοδος, καθώς και η Διέκοψε που τερματίζει όλα τα φωλιασμένα μπλοκ μέχρι και το τμήμα που τρέχει ο κώδικας, αλλά μπορεί να ανακοπεί η έξοδος αν βάλουμε ένα μπλοκ Δες { }, το οποίο σχετίζεται με χειρισμό λαθών). Η Ξεκίνα έχει την ίδια ενέργεια με την Συνέχισε εδώ, γιατί κάθε φορά που γίνεται επανεκίνηση του μπλοκ εντολών γίνεται έλεγχος συνθήκης. 

κ=τυχαίος(5, 7)
ι=0
Επανέλαβε
      ι++
      Αν ι=κ τότε Συνέχισε
      Τύπωσε ι
Όσο ι<10

Να σημειώσω ότι η Ενώ Τέλος Ενώ, έχει δυο ξεχωριστές λειτουργίες. Η μία είναι όπως του Επανέλαβε Όσο, με τη διαφορά ότι γίνεται έλεγχος πρώτα και μετά εκτέλεση και έλεγχος. Δηλαδή εδώ έχουμε έναν έλεγχο παραπάνω στην αρχή.

ι=0
Ενώ ι<10
      ι++
      Τύπωσε ι
Τέλος Ενώ


κ=τυχαίος(5, 7)
ι=0
Ενώ ι<10
      ι++
      Αν ι=κ τότε Ξεκίνα
      Τύπωσε ι
Τέλος Ενώ

ι=0
Ενώ ι<10 {
      ι++
      Τύπωσε ι
}

η άλλη είναι πιο προχωρημένη: Η Α είναι δείκτης σε λίστα. Η λίστα έχει 7 αριθμούς. Τα Μ και Μ1 είναι επαναλήπτες. Είναι αντικείμενα που συνδέουν έναν δρομέα με μια λίστα (ή ένα σωρό, ή ένα πίνακα). Αυτοί φτιάχνονται από την Κάθε() και μπορούμε να δώσουμε αρχή και τέλος. Μπορούμε δε να αναπρογραμματίσουμε τους επαναλήπτες πριν τελειώσει η επανάληψη!  Τα Μ^ και Μ1^ είναι ο δρομέας ως αριθμός. Για να ξεκινήσουν την επανάληψη πρέπει να μπουν στην Ενώ. Η Ενώ βλέπει ότι έχει να κάνει με αντικείμενα (τα Μ και Μ1) και τα εκτελεί μέχρι ένα τουλάχιστον από αυτά να δηλώσει τερματισμό.

Α=Λίστα:=1,2,5,6,7,30, 40
Μ=Κάθε(Α)
Μ1=Κάθε(Α, -1,1) ' από το τέλος στην αρχή
Ενώ Μ, Μ1
      Τύπωσε Μ^, Εκφρ(Μ), Εκφρ(Μ1), Μ1^
Τέλος Ενώ

         0    1   40    6
         1    2   30    5
         2    5    7    4
         3    6    6    3
         4    7    5    2
         5   30    2    1
         6   40    1    0

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

Α=Λίστα:=1,2,5,6,7,30, 40
Μ=Κάθε(Α)
Ενώ Μ
      Τύπωσε Α(Μ^!), Εκφρ(Μ)
      Μ=Κάθε(Α, Μ^+2)
Τελος Ενώ


2) Προστέθηκε νέο αντικείμενο, αν και για την ώρα θέλει και άλλη δουλειά, το httpRequest, το οποίο διαβάζει και Https (δηλαδή σελίδες ασφαλείας, με το λουκέτο που βλέπουμε στον Chrome και στον Firefox). Αντί να χρησιμοποιώ κάποιο έτοιμο τoυ συστήματος προτίμησα κάποιο που να μπορώ να το τροποποιήσω όπως θέλω, οπότε η τροποποίηση που του έκανα είναι να δουλεύει χωρίς γεγονότα (θα του βάλω σε επόμενη φάση), αλλά με δυνατότητα να επιτρέπει την εκτέλεση νημάτων της Μ2000. Το παλιό Download αντικείμενο υπάρχει αλλά έχει άλλη δουλειά, κατεβάζει σε αρχείο, και δεν παίζει με TLS.

Στο παρακάτω πρόγραμμα, η ροή εκτέλεσης σταματάει στη Method, αλλά επειδή δώσαμε το true, η εκτέλεση του i νήματος συνεχίζει, και μας δείχνει το πόσο μεγαλώνει το κείμενο του BODY. Προς το παρόν είναι σε ανάπτυξη!

DECLARE req HTTPREQUEST
PRINT TYPE$(req)
WITH req, "BODY" AS body$
THREAD {
      PRINT Len(body$)
      REFRESH
} AS i INTERVAL 10
PROFILER    ' RESET HIGH RESOLUTION TIMER
METHOD req,"HttpsRequest", "georgekarras.blogspot.com", true AS ok
PRINT timecount
THREAD i ERASE
IF ok THEN
      PRINT Len(body$)
END IF
DECLARE req NOTHING


Ή με νήματα και φόρμα, όπου ανοίγει μια φόρμα (modal) και με ένα κλικ ξεκινάει το διάβασμα σε ένα νήμα k, ενώ παράλληλα ένα νήμα i που ήδη είχε ξεκινήσει ενημερώνει τον τίτλο της φόρμας και τη κοσνόλα της Μ2000 με το μήκος του επιστρεφόμενου σώματος! Τα νήματα τερματίζουν μέσα από το νήμα k. Αν δεν δώσουμε το click στη φόρμα και απλά τη κλείσουμε δεν γίνεται τίποτα. Αν βγάλουμε τα REM (ή απλά πατήσουμε Enter να κατεβάσουμε την εντολή σε δεύτερη γραμμή) στη συνάρτηση εξυπηρέτησης του Click γεγονότος στη φόρμα, τότε σε 200ms θα κλείσουμε τη φόρμα! Για να δουλέψουν τα νήματα χρειάζεται χρόνος, που τον δίνουν αναμονές όπως και αυτή του modal παράθυρου. Εδώ θέλουμε να δούμε τι γίνεται για το κατέβασμα. Προς το παρόν δεν έχω βάλει την ακύρωση φόρτωσης. Δεν προλαβαίνει κανείς να τη σταματήσει γιατί είναι γρήγορες οι συνδέσεις!


DECLARE Form1 FORM
WITH Form1, "Title" AS Form1.Title$
DECLARE req HTTPREQUEST
PRINT TYPE$(req)
WITH req, "BODY" AS body$
ok=false
THREAD {
      Form1.Title$=Str$(Len(body$))
      PRINT Len(body$)
      REFRESH
} AS i INTERVAL 1
THREAD {
      PROFILER ' RESET HIGH RESOLUTION TIMER
      METHOD req,"HttpsRequest", "georgekarras.blogspot.com", true AS ok
      PRINT timecount
      Form1.Title$=Str$(Len(body$))
      PRINT Len(body$)
      REFRESH
      THREAD i ERASE
      THREAD This ERASE
} AS k INTERVAL 1000
THREAD K HOLD
onetime=true
FUNCTION Form1.click {
      IF onetime THEN
            onetime=false
            THREAD K INTERVAL 100
            THREAD K RESTART
            REM WAIT 200
            REM METHOD Form1, "CloseNow"
      END IF
}
METHOD Form1, "Show", 1
PRINT "FORM CLOSED"
REFRESH
THREADS ERASE
IF ok THEN
      PRINT Len(body$)
END IF
DECLARE req NOTHING


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

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