Τετάρτη 22 Αυγούστου 2018

Αναθεώρηση 7 Έκδοση 9.4

1.Διορθώθηκε ένα Bug στις λάμδα συναρτήσεις σε σχέση με κλείσιμο δείκτη σε ομάδα.
Στο πρόγραμμα που ακολουθεί η next_fact  έχει την fix ως δείκτης σε ομάδα. Αυτή η ομάδα έχει  μια λάμδα την f. Αρχικά αυτή η f  δίνει το 1. Αφού φτιάξουμε την next_fact, πάμε στην fix=>f  και βάζουμε την next_fact, ως αντίγραφο. Τώρα ζητάμε το 5 παραγοντικό, και αυτό βγαίνει χωρίς αναδρομή, απλά με εκτέλεση του αντιγράφου που είναι στην fix.

Class fixme {
      f=lambda->1
}
fix->fixme()
next_fact=lambda fix (x)->{
     if x<=1 then =1 :exit
     =x*fix=>f(x-1)
}
fix=>f=next_fact
Print next_fact(5)
m=next_fact
Print m(5)


Δεν χρειάζεται να κάνουμε τόσα πολύπλοκα πράγματα, γιατί οι λάμδα έχουν αναδρομή με την χρήση της λάμδα() ή λάμδα$() και στα αγγλικά με τις Lambda() και Lambda$(), οι οποίες καλούν την λάμδα, με οποιοδήποτε όνομα και είναι συνδεδεμένες.

2. Μπορούμε από αυτή την αναθεώρηση να εκτελέσουμε μια λάμδα άμεσα, χωρίς να την  δώσουμε σε ένα αναγνωριστικό, βάζοντας παρενθέσεις με τιμές αμέσως μετά τις αγκύλες του σώματος της λάμδα. Επειδή οι λάμδα μπορούν να γραφτούν χωρίς σώμα, αλλά απευθείας με έκφραση, πχ λαμδα (χ)->χ**2  δεν πάει το () (δεν ξέρει ο διερμηνευτής για που πάει, για την έκφραση ή για τη λάμδα;).. Οπότε την γράφουμε έτσι Τύπωσε λαμδα (χ)->{=χ**2}(3)  και θα τυπώσει το 9. Δείτε ότι βάλαμε τις αγκύλες και ένα '=.

Module Ycombinator {
      \\ factorial
      Print lambda (g, x)->{=g(g, x)}(lambda (g, n)->if(n=0->1, n*g(g, n-1)),10)
       \\ fibonacci
      Print lambda (g, x)->{=g(g, x)}(lambda (g, n)->if(n<=1->n,g(g, n-1)+g(g, n-2)), 10)

      \\ Using closure in y, y() return function
      y=lambda (g)->lambda g (x) -> g(g, x)
   
      fact=y((lambda (g, n)-> if(n=0->1, n*g(g, n-1))))
      Print fact(6), fact(24)
   
      fib=y(lambda (g, n)->if(n<=1->n,g(g, n-1)+g(g, n-2)))
      Print fib(10)
}
Ycombinator



λειτουργεί και με την λάμδα για αλφαριθμητικά:
m$=lambda$ (a)->{
      =lambda$ (n)-> {
            =string$("x", n)
      }(a)
}(3)
Print m$





Και ένα ωραίο παράδειγμα με γεγονότα. Η ομάδα Άλφα έχει μια συνάρτηση για να παράγει την ακολουθία fibonacci. Παράλληλα καλεί γεγονότα. Αν έχουμε συνδέσει την ομάδα με συναρτήσεις εξυπηρέτησης γεγονότων (εδώ έχουμε) θα έχουμε ενημέρωση των συναρτήσεων και αυτές εδώ κρατάνε "απογραφή" τα ήδη υπολογισμένα στοιχεία της ακολουθίας, στην Κατάσταση Getit.
Απλά η ομάδα δεν γνωρίζει πώς κρατάμε τα στοιχεία. Απλά ζητάει ένα στοιχείο, ενώ το έχει γράψει ως -1, και αν δει ότι άλλαξε τότε το δέχεται ως σωστό και το επιστρέφει άμεσα. Επίσης κάθε νούμερο που έχει υπολογισθεί, δίνεται για οποιαδήποτε χρήση (εδώ απλά το σώνουμε για να το βρίσκει άμεσα ο αλγόριθμος). Η αναζήτηση σε Κατάσταση γίνεται σε χρόνο O(1)


fixed inversion 9.7 revision 10 (for 9.6 we have to use .fib() instead of lambda())


Module CheckEvents {
      \\ we can use standard functions (not lambda functions)
      \\ we can use lambda() so we can use function with different names
      \\ We can define functions inside groups with events
     Group WithEvents Alfa {
           Event "GetIt", "PushIt"
           Function fib(n) {
                  if n<=1 then {
                        =val(n->Decimal)
                  } else {
                        if n<140 then { m=-1@} else m=-1
                        call event "Getit", n, &m
                        if m>-1 then =m : exit
                        \\ m1 may get double if a decimal can write the result
                        \\ if we use m we get overflow error
                        m1=lambda(n-1)+lambda(n-2)
                        call event "Pushit", n, m1
                        =m1
                  }            
            }
      }
      \\ we use an Inventory list to save old values
      Inventory Getit
      \\ event's service functions
      \\ if not event's functions exist, call event skipped
      Function Alfa_Getit {
            Read new key, &m
            if exist(Getit, key) then m=eval(Getit)
      }      
      Function Alfa_Pushit {
            Read new key, m
            Append Getit, key:=m
      }
      Module Inner (&fibonacci()){
            acc=0
            For i=1 to 200 ' until 139 we get decimal type, above it we get double
                  Print fibonacci(i),
            Next i
      }
      Inner &Alfa.fib()
}
CheckEvents





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

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

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