Πέμπτη, 20 Απριλίου 2017

Αναθεώρηση 11 (Έκδοση 8.7)

Σε αυτήν την αναθεώρηση έκανα μερικές βελτιώσεις:
1) Πίνακες
Μπορούμε να κατά την αλλαγή μεγέθους ενός πίνακα στους δείκτες του να έχουμε τον ίδιο πίνακα σε συνάρτηση (παλιά δεν γίνονταν γιατί καθώς ξεκίναγε ο διερμηνευτής την αλλαγή μεγάθους, πείραζε τα στοιχεία που θα έπρεπε να διαβάζονταν μετά, οπότε η λύση που βρήκα ήταν απλή, βάζουμε σε άλλες μεταβλητές την αλλαγή και την δίνουμε στο τέλος στις κανονικές - χρήσεως).
Με αυτόν τον τρόπο αν πάμε να αλλάξουμε το μέγεθος πίνακα (η Μ2000 στην αλλαγή μεγέθους αφήνει τα στοιχεία, που θα μείνουν από πριν, ανέπαφα, εκτός και αν δώσουμε κάτι για να γεμίσουμε το πίνακα) και δώσουμε κάτι λάθος, εφόσον έχουμε την Δες { } που απορρίπτει το λάθος, ο πίνακας δεν αχρηστεύται, γιατί τελικά δεν ενημερώνεται για τις αλλαγές (που έτσι και αλλιώς δεν μπορούν να γίνουν)

2) Διορθώθηκε το Match("A") ή Ταύτιση("Π")  για να δίνει -1 (Αληθές) αν έχουμε πίνακα στη κορυφή του σωρού.
Τώρα παίζει το παρακάτω χωρίς την ListLit (δες προηγούμενο μήνυμα)
Το () είναι κενός πίνακας, το (1,) είναι πίνακας με ένα στοιχείο, το (1,2) πίνακας με δυο
Το ((1,2),(3,4)) είναι πίνακας με δυο στοιχεία πίνακες με δυο στοιχεία).  Στη γραμμή παρακάτω ζητάμε από το πίνακα το δεύτερο στοιχείο (το πρώτο είναι στο 0) και παίρνουμε τον πίνακα (4,5) και από αυτόν ζητάμε το δεύτερο στοιχείο, και παίρνουμε το 5.

Τύπωσε Πίνακας(Πίνακας(((1,2,3),(4,5)),1),1)
 Το x=(Number,) παίρνει τον αριθμό από το σωρό (αν δεν έχει θα βγει λάθος) και τον βάζει σε έναν πίνακα ενός στοιχείου στην θέση 0. Προσέξτε το κόμμα. Αν δεν υπήρχε θα ήταν απλά η έκφραση, αλλά με το κόμμα ξέρει ο διερμηνευτής ότι η προηγούμενη έκφραση θα πάει σε πίνακα, και συνεχίζει, δεν βρίσκει άλλο και το αφήνει έτσι!



Range =lambda (x) -> {
      L=Lambda M=1 ->{=M:M++}
      Dim A(x)<<L()
      =A()
}


Goal=Lambda (op) ->{
       'Goal take three parameters, but 2nd and 3rd can be number or Array object
      If Match("N") Then {
            x=(Number,)
      } Else.If Match("A") Then {
             Read x
       } Else Error "(second argument Not a number Or Array)"
   
      If Match("N") Then {
            y=(Number,)
      } Else.If Match("A") Then {
             Read y
       } Else Error "(third argument Not a number Or Array)"
  
      Dim Z(Len(x)*Len(y))
      M=0
      x1=each(x)
      While x1 {
            y1=each(y)
            While y1 {
                        Z(M)=op(array(x1),array(y1))
                        M++
                  }
      }
      =Z()
}
Mult=Lambda (x,y)->x*y
Print Goal(Mult,3,4)
Print Goal(Mult,(1,2,3),3)
Print Goal(Mult,Range(30),3)
Print Goal(Mult,Range(10),5)
Print Goal(Mult,5,Range(10))
Print Goal(Mult, Goal(Mult,5,Range(10)),(100,200,300))
Try ok {
      Print Goal(Mult,5)
}
If Error Or Not ok Then Print : Report Error$
Add=Lambda (x,y)->x+y
Power=Lambda (x,y)->x**y
Print Goal(Add,(1,2,3,4,5,6),10)
Print Goal(Power,2,Range(16))
\\ this is a closure for x and stp and fun (fun as lambda)
generator=Lambda (x, stp, fun) -> {
      =lambda x ,stp, fun (m, n) -> {=fun(m*x,n) : x+=stp }
      }
gen2=lambda goal,Mult, Range (multiplier, times)->Goal(Mult,multiplier,Range(times))
Print Goal(generator(20,5, Add),(3,6,9), (5,10,15))
\\ same but with gen2()
Print Goal(generator(20,5, Add),gen2(3,3), gen2(5,3))
AddOffset=Lambda (offset, fun) -> {
      = lambda offset, fun -> {
            =offset+fun(number, number)
      }
}
Print Goal(AddOffset(100,Mult),3, gen2(2,10))
Print Goal(Mult,3, gen2(2,10))


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

4) Η φόρμα έλεγχος τώρα δείχνει αν κάτι είναι συνάρτηση ή όχι, αν έχουμε λάμδα δείχνει τον κώδικα (παλιότερα δεν το έδειχνε), αν είναι νήμα δείχνει το κώδικα και η βηματική εκτέλεση τα σταματάσει σε αναμονή (σταματάει τον εσωτερικό TaskManager) και με συνεχόμενο πάτημα, βλέπουμε όλα τα νήματα να τρέχουν (πιο αργά) και φαίνεται και ο κώδικάς τους καθώς τρέχουν.
Η φόρμα πήρε περισσότερο χώρο για το αριστερό πάνω μέρος (γράφεται το τμήμα/συνάρτηση/Νήμα, αμέσως από κάτω η εντολή που εκτελείται και αμέσως από κάτω το υπόλοιπο της εντολής.
Η μεταβλητή τικ ή tick δίνει το ρολόι του TaskManager. Κάθε νήμα έχει έναν αριθμό και το βλέπουμε στη φόρμα έλεγχος. Και το Main.Task είναι νήμα.
(σε προηγούμενες εκδόσεις όταν έτρεχαν νήματα δεν βλέπαμε κώδικα)



test "here"
A$=lambda$ -> {
      Print 10201
      print 455, tick
      ="ok"
}
N$=""
thread {
      aa()
      N$= A$()
} as M interval 100


Main.Task 50 {
      If keypress(32) then exit
}


Sub aa()
      Print "Wow"
End Sub