Τετάρτη, 8 Μαρτίου 2017

Αναθεώρηση 1, έκδοση 8.4

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

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

Το παρακάτω πρόγραμμα δείχνει τι γίνεται. Η λάμδα συνάρτηση L έχει δική της μεταβλητή την Χ και ο τελεστής << στην DIM κάνει την λάμδα να εκτελείται για κάθε στοιχείο του πίνακα α(). Επειδή χρησιμοποιούμε την number, η οποία διαβάζει από το σωρό, πρέπει να παρέχουμε ένα νούμερο στη κλήση της lambda, και αυτό κάνουμε με το νούμερο 200.
Μετά φτιάχνουμε την c ως ένας επαναλήπτης του πίνακα. Στην ουσία και η c είναι αναφορά στο πίνακα. Μάλιστα δίνουμε να ξεκινάει από το δέκατο στοιχείο (δεν δίνουμε το τέλος οπότε εξορισμού βάζει το τελευταίο). Θα μπορούσαμε να δώσουμε αρνητικά νούμερα, πχ το -2 σημαίνει δεύτερο από το τέλος. Μπορούμε να δώσουμε χωρίς το πρώτο κόμα μετά τον πίνακα γράμματα όπως :
c=each(a Start to End)
ή ελληνικά
c=κάθε(a Αρχή έως Τέλος) ή το ανάποδο c=κάθε(a Τέλος έως Αρχή) ή με νούμερα:
c=κάθε(a Αρχή έως 10) όπου 10 είναι το δέκατο στοιχείο.
Μετά φτιάχνουμε την b ως αναφορά στη c (που είναι αναφορά στην α()), αλλά είναι στην ουσία ένας επαναλήπτης και αυτός. Στο δέκατο στοιχείο Α(9) βάζουμε ένα νούμερο για να δείξουμε ότι όλες οι αναφορές είναι σωστές.
Ξεκινάμε την Ενώ και σκοπό έχουμε να δείξουμε τιμές με βήμα 12. Για να κάνουμε το βήμα, αναπρογραμματίζουμε τον επαναλήπτη. Η b^ είναι η τιμή του δρομέα, ο αριθμός δηλαδεί που ξεκινάει πάντα από το 0 για το πρώτο στοιχείο. Λέμε λοιπόν με την each(b, b^+12) να μεταθέσουμε την αρχή στο τωρινό στοιχείο συν 12. H While (Ενώ) ελέγχει το αντικείμενο b, και βλέπει ότι έχει αλλάξει ο εσωτερικός του μετρητής (ο οποίος γίνεται όσο το αρχικό νούμερο, εδώ το B^+12).

Μέσα στο μπλοκ εντολών έχουμε μια Τύπωσε (Print) η οποία δίνει τέσσερα πράγματα..η Πίνακας() ή Array() με μια παράμετρο δίνει το στοχείο που καθόρισε η While, και καταχώρησε στο πίνακα a() (αφού η b είναι αναφορά του a(), αν και έχει δικές ιδιότητες). Στη δεύτερη στήλη τυπώνουμε το a(b^) δηλαδή το στοιχείο που ήδη γνωρίζει ο a() (έχει καταχωρηθεί σε μια εσωτερική Index). Η εντολή πίνακας μπορεί να χρησιμοποιηθεί με παραμέτρους βάσει των διαστάσεων του πίνακα, εδώ τυπώμε το προηγούμενο στοιχείο b^-1 (το σύμβολο ^ όπως και το ** χρησιμοποιούνται για δυνάμεις, αλλά εδώ το b το χρησιμοποιεί αλλιώς). Τελευταία στήλη δείχνουμε ότι και ο πίνακας a() έχει δείκτη εσωτερικά για να δείξει αυτό που επιλέγει ο επαναλήπτης  b

Παρακάτω τυπώνουμε το τύπο του αντικειμένου, για τα b και c. Δείχνει mArray, που είναι η εσωτερική κλάση των πινάκων στη Μ2000.
Επίσης βλέπουμε ότι η πίνακας(c,9) ή array(c,9) δίνει το 12345 όπως θα περιμέναμε.
Μπορούμε να αλλάξουμε στη C τα όρια, και εδώ αυτό κάνουμε και παίρνουμε τα στοιχεια με την Τύπωσε (από την 8.4 τυπώνει πίνακες, καταστάσεις και αυτά τα δύο μέσω των επαναληπτών, όλα σ στήλες).
Στο τέλος βλέπουμε και τις φωλιασμένες λίστες (φωλιασμένοι πίνακες για την ακρίβεια) που φτιάχνουμε με τις παρενθέσεις. Χρησιμοποιούμε την Car() (την έχω πάρει από την Lisp) η οποία παίρνει το πρώτο στοιχείο και αν αυτός είναι πίνακας τον ανοίγει. Εδώ το πρώτο στοιχείο του πίνακα είναι ένας πίνακας τριών στοιχείων, τα δυο πρώτα εμφανίζονται, αλλά το τρίτο επειδή είναι πίνακας τον εμφανίνει η Τύπωσε ως ένα διάστημα στη στήλη του, οπότε πρακτικά δεν το βλέπουμε, παρά μόνο τα 1 και 2.


L=lambda X=0->{=X+number:X++}
Dim a(100)<<L(200) \\ fill 200.. 299
\\ walk from 10th (209) to end, step 12

c=each(a(), 10)
b=c \\ we can copy it
A(9)=12345
while b {
      \\ this is a special version of while, using an iterator
      \\ we can change b inside while block
      \\ b control internal index of array a()
      \\ array() with one parameter return item using internal index
       print array(b), a(b^), array(b, b^-1), array(a())
       b=each(b,b^+12)
}
Print type$(b),type$(c) \\ mArray is internal class of array
\\ b and c are all references to A()
Print array(c,9)
c=each(c 10 to 13) \\ 10th is the 9
Print c
m=(1,2,3,4)
n=((1,2,(3,4)), 10)
d=car(n)
Print d


Ειδικά για το παράδειγμα με τους πίνακες σε πίνακες υπάρχει το παρακάτω ωραίο παράδειγμα:

n=((1,2),3,(4,5))
Link n to a()
\\ print 1 2 3 4 5
Print a(0)(0),a(0)(1),a(1),a(2)(0),a(2)(1)
b=car(n)
c=car(cdr(n))
d=car(cdr(cdr(n)))
\\ Print 1 2 3 4 5
Print b,c,d
m=(1,) \\ this array of one item
k=() \\ zero len array
Print len(m), len(k)
z=cons(b,c,d)
Print z

Φτιάχνουμε τον πίνακα n με πρώτο στοιχείο ένα πίνακα (1,2), δεύτερο το 3 και τρίτο έναν άλλο πίνακα τον (4,5). Μπορούμε να συνδέσουμε το πίνακα n με αναφορά στον a(). Τώρα με την τύπωσε μπορούμε να εμφανίζουμε όποιο στοιχείο θέλουμε. Πχ. το a(0)(1) είναι το δεύτερο στοιχείο του πίνακα που είναι στο πρώτο στον a() που είναι αναφορά στον n.
Η εντολή b=car(n) βγάζει αντίγραφο του (1,2) στο b. Η εντολή car(cdr(n)) κάνει το εξής: βγάζει τα επόμενα στοιχεία από το πρώτο, ως αντίγραφο, τα οποία παίρνει η car() και εξάγει το πρώτο, άρα παίρνουμε το δεύτερο από την n, το 3.
Μετά με τα car(cdr(cdr(n))) παίρνουμε το (4,5). Η συνάρτηση car() μπήκε εδώ για να μετασχιματίσει το στοιχείο σε πίνακα πολλών στοιχείων (ήταν βέβαια, αλλά χωρίς την car() θα είχαμε ένα πίνακα ενός στοιχείου και εκεί το (4,5) δηλαδή το ((4,5)).
Τυπώνουμε τα b,c,d και παίρνουμε το 1 2 3 4 5
Με την m δείχνω πως βάζουμε ένα πίνακα ενός στοιχείου. (θέλει ένα κόμμα πριν την τελευταία παρένθεση). Αν δώσουμε δυο παρανθέσεις χωρίς στοιχεία, θα σχηματιστεί πίνακας, αλλά κενών από στοιχεία. Η συνάτηση Μήκος() εκτός από τη χρήση στα αλφαριθμητικά, τις καταστάσεις. χρησιμεύει και για τους πίνακες. Δείχνει το σύνολο των στοιχείων (σαν να ήταν μονοδιάστατος ο πίνακας, ενώ υπάρχει η συνάρτηση Διάσταση(), που δίνει τον αριθμό διαστάσεων, τη βάση του πίνακα 1 ή 0, και ανά διάσταση τον αριθμό στοιχείων, ανάλογα με τις παραμέτρους που παρέχουμε.
Θα πάρουμε 1 και 0 (αφού η k έχει μηδενικά στοιχεία.
Η z φτιάχνεται με την cons(b,c,d) οπότε με την εκτύπωση θα πάρουμε τα 1 2 3 4 5

Γ.Κ.