Σάββατο, 14 Μαΐου 2016

Αναθεώρηση 16 (έκδοση 8.1)

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

Αυτό λειτουργούσε:
a=lambda->100*number
level1(a)

Sub Level1(item)
      Level2(&item)
End Sub
Sub Level2(&item)
      Print item(3)
End Sub

όπως και αυτό (η Κατάσταση  ή Inventory περνάει πάντα με αναφορά, ακόμα και αν δε το δώσουμε με αναφορά, και αυτό συμβαίνει γιατί και η αντιγραφή κάνει αντιγραφή δείκτη, άρα είναι αναφορά:

Function a {
      Dim a(number)=100
      =a()
}
inventory alfa= "m1":= lambda->100*number , 100:=lambda->5*number, 200:=a(10)
level1(alfa)
Print alfa(200)(5) \\ 12345
Print alfa(200)(6) \\ 101

Sub Level1(item) ' inventory always passed by reference
      Level2(&item)
End Sub
Sub Level2(&item)
      Print item("m1")(5)
      Print item(100)(5)
      item(200)(5)=12345
      item(200)(6)++
End Sub

αλλά στις προηγούμενες εκδόσεις δεν γίνονταν τα παρακάτω, γιατί έβρισκε το &item() ότι υπήρχε όνομα item() στο ίδιο τμήμα (οι ρουτίνες δεν έχουν δικό τους όνομα χώρου, όπως τα τμήματα και οι συναρτήσεις, και ότι υπάρχει στο τμήμα είναι "θεατό" ή "εντός σκοπού" για την ρουτίνα. Εδώ είναι μερικά παραδείγματα που τώρα δουλεύουν! Οι λάμδα συναρτήσεις αντιγράφονται σε όλα τα στοιχεία τους (εκτός αν το στοιχείο είναι Κατάσταση ή Inventory, όπου και εδώ θα έχουμε αναφορά)

a$=lambda$->"Hello"+str$(number)
level1(a$)

Sub Level1(item$)
      Level2(&item$)
End Sub
Sub Level2(&item$)
      Print item$(100)
End Sub

σε άλλο τμήμα:

a$="Hello"
level1(a$)

Sub Level1(item$)
      Level2(&item$)
End Sub
Sub Level2(&item$)
      Print item$
End Sub

σε άλλο τμήμα:

Dim a(10)=10
level1(a())

Sub Level1(item())
      Level2(&item())
End Sub
Sub Level2(&item())
      Print item(3)
End Sub

σε άλλο τμήμα:

Dim a%(10)=10
level1(a%())

Sub Level1(item%())
      Level2(&item%())
End Sub
Sub Level2(&item%())
      Print item%(3)
End Sub

σε άλλο τμήμα:

a%=10
level1(a%)

Sub Level1(item%)
      Level2(&item%)
End Sub
Sub Level2(&item%)
      Print item%
End Sub


Σε ελληνικά (στα ονόματα ρουτινών τα μικρά-μεγάλα-τονισμένα είναι διαφορετικά, δεν ισχύει αυτό στα τμήματα και στις συναρτήσεις και στις μεταβλητές):

α$="Γεια χαρά"
Επίπεδο1(α$)

Ρουτίνα Επίπεδο1(κάτι$)
      Επίπεδο2(&κάτι$)
Τέλος Ρουτίνας
Ρουτίνα Επίπεδο2(&κάτι$)
      Print κάτι$
Τέλος Ρουτίνας