Τρίτη 4 Ιουνίου 2019

Αντικείμενα στην Μ2000, απλό παράδειγμα.

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

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

Η πιο απλή δομή για αντικείμενα είναι ο πίνακας. Στο παράδειγμα εδώ κάνουμε χρήση πίνακα. Ειδικά η Μ2000 μπορεί να ορίζει ξανά έναν πίνακα χωρίς να διαγράφει στοιχεία, εκτός και αν τα λιγοστέψουμε, οπότε διαγράφει τα επιπλέον. Κάθε στοιχείο πίνακα μπορεί να πάρει οποιαδήποτε τιμή, έναν αριθμό, ένα αλφαριθμητικό, ένα αντικείμενο. Αν το όνομα του πίνακα έχει το $ τότε ένα Α$(3)=1000 θα βγει λάθος, όχι γιατί δεν μπορεί να γραφτεί ο αριθμός αλλά δεν το επιτρέπει αυτός ο συντακτικός τρόπος. Στο παράδειγμα που ακολουθεί φτιάχνουμε πίνακα 10 στοιχείων ως α$(). Αυτό σημαίνει ότι η Τύπωσε α$() θα πρέπει να εμφανίσει αλφαριθμητικό (αν γίνεται). Μια α$(1)="Πέτρος" θα βάλει αλφαριθμητικό στο α$(1). Οι πίνακες έχουν βάση το 0, αλλά μπορούμε να το αλλάξουμε. Πχ Πίνακας Βάση1, α$(10) θα έχουμε από 1 μέχρι 10 στοιχεία. Ενώ Πίνακας α$(2 έως 11) θα έχουμε βάση το 2 και πάλι δέκα στοιχεία (μπορούμε να δώσουμε και αρνητικούς αριθμούς). Μέγιστο διαστάσεων είναι οι δέκα διαστάσεις, ενώ ελάχιστο είναι το 0, δηλαδή καμία διάσταση.

πίνακας α$(10)
μ=α$() ' το μ είναι δείκτης στο α$()
επιστροφή μ, 3:=100
τύπωσε α$(3) ' δίνει 100 ως αλφαριθμητικό
\\ πιο γρήγορος τρόπος
α$(4):=1000
τύπωσε α$(4) ' δίνει 1000 ως αλφαριθμητικό
Ένωσε α$() στο α() ' κάνει το α() αναφορά του α$()
Τύπωσε α(3)+α(4)=1100


Περί διαστάσεων πινάκων και πως τις διαβάζουμε:
Πίνακας α(), β(0)
Τύπωσε μήκος(α())=0, διάσταση(α())=0
Τύπωσε μήκος(β())=0, διάσταση(β())=0
Πίνακας α(5), β(-2 έως 2)
Τύπωσε μήκος(α())=5, διάσταση(α())=1
Τύπωσε μήκος(β())=5, διάσταση(β())=1
Πίνακας α(2, 5), β(-1 έως 0, -2 έως 2)
Τύπωσε μήκος(α())=10, διάσταση(α())=2
Τύπωσε μήκος(β())=10, διάσταση(β())=2

Τύπωσε διάσταση(β(),1)=2, διάσταση(β(),2)=5
Τύπωσε διάσταση(β(),1,0)=-1, διάσταση(β(),1,1)=0
Τύπωσε διάσταση(β(),2,0)=-2, διάσταση(β(),2,1)=2



Περί Ομάδων

Παρακάτω έχουμε κώδικα που μπορούμε να το γράψουμε στο τμήμα Α και να το καλέσουμε ως Α
Στο τμήμα Α έχουμε το τμήμα ΔοκιμήΑ το οποίο θα φτιάξει ένα πίνακα με δυο αντικείμενα και μετά με ένα ακόμα, όπου τα δυο πρώτα θα είναι ζώα, το ένα σκύλος και το άλλο γάτα. Το τρίτο αντικείμενο το βάζουμε για να δείξουμε ότι η χρήση μιας μεταβλητής μόνο για ανάγνωση μπορεί να χρησιμοποιηθεί για να δώσει τύπο στα αντικείμενα. Τα αντικείμενα τύπου ομάδα δεν έχουν χωριστό τύπο, εκτός και αν ορίσουμε μια μεταβλητή για να δείχνει ότι έχουν χωριστό τύπο!

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

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

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

Αν δώσουμε σαν τελευταία γραμμή το Μ=Κ τότε το Μ θα γίνει ένα αντίγραφο του Κ. Σε κάποιες γλώσσες δεν έχουμε αντιγραφή αντικειμένου, αλλά αντιγραφή δεικτών. Η Μ2000 έχει και δείκτες σε αντικείμενα ομάδα, αλλά αν δεν είναι απαραίτητοι δεν τους χρησιμοποιούμε.

Μια ομάδα μπορεί να περάσει με τιμή σε μια συνάρτηση ή ένα τμήμα, ή με αναφορά. Εδώ έχουμε μια περίπτωση με ανφορά της Κ εκεί που καλούμε το τμήμα Προσωρινό.με το &Κ. Το &Α θα είναι ένα νέο αντικείμενο με μέλη που είναι αναφορές στα μέλη του Κ.

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

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

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

Αυτό που δεν υπάρχει άμεσα στη Μ2000 για τα αντικείμενα είναι ο τρόπος εξαγωγής μόνο των δεδομένων, σε ένα αλφαριθμητικό για καταχώρηση σε ένα αρχείο, και αργότερα για ανάγνωση από αυτό. Πρέπει να φτιάξουμε τρόπο εγγραφής και ανάγνωσης μέσα στο αντικείμενο. Απλά θα παρέχουμε τον αριθμό του αρχείου (file handler) και όλα θα γίνονται εντός του αντικειμένου.

Ένα πρόγραμμα το διαβάζουμε είτε από την αρχή προς το τέλος, είτε αφήνοντας τους ορισμούς για όταν κάτι το χρησιμοποιήσουμε πρώτη φορά. Πχ το παρακάτω το διαβάζουμε αφήνοντας το Τμήμα ΔοκιμήΑ { } και πάμε αμέσως μετά. Στη γραμμή που καλούμε το ΔοκιμήΑ γυρνάμε στον ορισμό.

Τα τμήματα δέχονται στη κλήση έναν σωρό τιμών και τον επιστρέφουν στην επιστροφή. Σε αυτόν γράφονται και τυχόν ορίσματα που δίνουμε, είτε με αντιγραφή είτε με αναφορά (και η αναφορά είναι μια τιμή που αντιγράφεται, και ειδικά στη Μ2000 είναι αλφαριθμητικό και περιέχει αυτό που αναφέρεται, και λέγεται ισχνή αναφορά, γιατί δεν έχει "συνδεθεί" όσο είναι στο σωρό τιμών).. Το ίδιο ισχύει αν κληθούν συναρτήσεις με την Κάλεσε.

Οι συναρτήσεις που φτιάχνουμε και καλούμε σε εκφράσεις δημιουργούν δικό τους σωρό τιμών, και αυτός δεν επιστρέφεται. Έτσι αν περάσουμε περισσότερα ορίσματα και αυτά δεν χρησιμοποιηθούν τότε χάνονται μαζί με το σωρό τιμών. Για το λόγο αυτό η Μ2000 στη κλήση συναρτήσεων δεν κάνει έλεγχο ορισμάτων, τα βάζει όπως τα δίνουμε. Ο έλεγχος γίνεται στη συνάρτηση. Αν ζητάμε αριθμό και έχουμε αλφαριθμητικό θα βγει λάθος.

Ε'ιτε γράψουμε Συνάρτηση Αλφα {=Αριθμός**2}  (όπου το ** είναι η ύψωση σε δύναμη, όπως και το ^ είναι επίσης η ύψωση σε δύναμη), είτε Συνάρτηση Αλφα(χ) {=χ**2} είτε:
Συνάρτηση Αλφα {
Διάβασε χ : =χ**2
}
Είναι το ίδιο πράγμα (με τη διαφορά ότι στην πρώτη δεν θα φτιαχτεί μεταβλητή, θα διαβαστεί άμεσα ο αριθμός από το σωρό τιμών).

Αρχικοποίηση
Δεν μπορούμε να χρησιμοποιήσουμε μια μεταβλητή αν δεν έχουμε δώσει αρχική τιμή. Δεν ισχύει αυτό στους πίνακες, γιατί η αρχική τιμή τους "Empty" μεταφράζεται αυτόματα σε 0 ή "" ανάλογα με το όνομα του πίνακα (αν έχει $ στο τέλος του ονόματος είναι αλφαριθμητικό)

Περί θεάσης μεταβλητών
Αν ένα όνομα δεν ορίζεται τοπικά τότε το αναζητεί ο διερμηνευτής ως γενική. Η διαφορά τοπικής Α με γενική Α είναι ότι η τοπική έχει ένα πρόθεμα που δεν βλέπουμε, ενώ η γενική δεν έχει πρόθεμα. Γενικές μπορούμε να φτιάξουμε οπουδήποτε, αλλά θα διαγραφούν μαζί με τις τοπικές. Μια τοπική Α και μια γενική Α μπορούν να υπάρχουν μαζί, αλλά η τοπική θα σκιάσει τη γενική. Για να αλλάξουμε τιμή σε μια γενική θα πρέπει να δώσουμε το <= αντί του =. Το απλό = δημιουργεί τοπική ακόμα και αν υπάρχει γενική με το ίδιο όνομα.

Στο μικρό παράδειγμα έχουμε μια ομάδα με δυο μέλη, τα χ και κ, και ένα τμήμα το Κάππα. Σε αυτό το τμήμα ορίζουμε μια γενική το κ (θα υπάρχει μέχρι το τμήμα να διαγραφεί), και μια ομάδα το Άλφα, με μέλος το χ και δυο μεθόδους, τη συνάρτηση Βήτα και το τμήμα ΆλλαξεΧ.
Καλούμε το Δέλτα.Καππα και στην επιστροφή εκτελούμε τη Λίστα και μας δείχνει ότι υπάρχουν σαν μεταβλητές τρια πράγματα, το Δέλτα, το Δέλτα.χ και το Δέλτα.κ. Ό,τι κάναμε στην Δέλτα.Κάππα έχουν διαγραφεί. Αν γυρνάγαμε την ομάδα Άλφα τότε θα είχαμε το πρόβλημα στην συνάρτηση Βήτα() με το κ που είναι γενικό και δεν υπάρχει πια. Για το λόγο αυτό δεν χρησιμοποιούμε γενικές που φτιάχνονται προσωρινά σε μεθόδους ομάδων. Εδώ απλά δεν έχουμε πρόβλημα γιατί δεν κάνουμε χρήση της ομάδας ως επιστρεφόμενη τιμή.

Ομάδα Δέλτα {
      χ=5000
      κ=2
      Τμήμα Κάππα {
            Γενική κ=100
            Τμήμα Εσωτερικό {
                  Ομάδα Αλφα {
                        χ=2
                        Συνάρτηση Βήτα (μ){
                              =.χ**μ+κ
                        }
                        Τμήμα ΆλλαξεΧ (μ) {
                              \\ χρειάζεται το .χ είναι της ομάδας
                              .χ<=μ
                        }
                  }
                  Τύπωσε Αλφα.Βήτα(4)=116
                  Τύπωσε Αλφα.χ=2
                  \\ γίνεται να αλλάξει γιατί το Αλφα.χ είναι μια εταβλητή τοπική στο Εσωτερικό
                  Αλφα.χ=3
                  Τύπωσε Αλφα.Βήτα(4)=181
                  Αλφα.ΆλλαξεΧ 5
                  Τύπωσε Αλφα.Βήτα(4)=725
            }
            \\ απλή κλήση
            Εσωτερικό
            \\ μέσω της Κάλεσε
            Κάλεσε Εσωτερικό
      }
}
Δέλτα.Κάππα
\\ υπάρχουν μόνο τρεις, η Δέλτα,  Δέλτα.χ και Δέλτα.κ
Λίστα 





Το παράδειγμα





Τμήμα ΔοκιμήΑ {
      \\ δεν χρειάζεται η παρακάτω, αλλά μπορούμε να την δώσουμε
      Κάνε ι ως ακέραιος, εντάξει ως λογικός
      \\ όσα μέρη μιας κλάσης είναι μετά την ετικέτα Κλάση: δεν περιέχονται στο τελικό αντικείμενο       \\ οι κλάσεις είναι συναρτήσεις (γενικές) που επιστρέφουν αντικείμενο       \\ Μια μέθοδος με το όνομα της κλάσης είναι ο κατασκευαστής, που καλείται αφού πρώτα       \\ φτιαχτεί ένα αντικείμενο με ότι έχουμε στον ορισμό.       \\ η κλήση της Ζώο() μπορεί να γίνει στο κατασκευαστή της Σκύλος() γιατί είναι γενική              \\ Οι ιδιότητες είναι ομάδες (αντικείμενα) που ετοιμάζονται με δυνατότητες όπως:       \\ επιστροφή τιμής αν υπάρχει το πεδίο Αξία. Μπορούμε να ορίσουμε το τρόπο που θα επιστρέφεται η τιμή       \\ αλλαγή τιμής αν υπάρχει το πεδίο Θέσε. Μπορούμε να ορίσουμε το τρόπο που θα διαβάζει μια τιμή       \\ Σε κάθε περίπτωση το $ χρησιμοποιείται όταν η τιμή επιστροφής ή αλλαγής είναι αλφαριθμητικό       \\ μια ιδιότητα μπορεί να έχει μεθόδους και τμήματα όπως όλα τα αντικείμενα, αλλά δεν έχει κατασκευαστή.                     \\ Στο παράδειγμα φτιάχνουμε δυο αντικείμενα τοποθετημένα σε ένα πίνακα       \\ Καλούμε διαδοχικά την τι$() συνάρτηση του κάθε αντικειμένου       \\ και το κάθε αντικείμενο καλεί την δική του συνάρτηση.                     \\ εδώ δεν έχουμε δείκτη σε αντικείμενο. Τα αντικείμενα είναι μοναδικά, και επειδή βρίσκονται σε πίνακα       \\ είναι ανώνυμα. Το κάθε αντικείμενο είναι μια κατασκευή και περιέχει ότι του έχουμε βάλει.       \\ αν δοκιμάσουμε να αλλάξουμε το όνομα$ θα πάρουμε λάθος.              \\ Θέλουμε το κάθε ζώο να έχει έναν αριθμό       \\ θα έχουμε μια γενική μεταβλητή ΑΑ και μια συνάρτηση που θα παράγει την επόμενη ΑΑ       \\ τη γενική συνάρτηση θα την καλούμε στη Ζώο() συνάρτηση (που επιστρέφει αντικείμενο)              Γενική ΑΑ=1              Συνάρτηση Γενική ΝέοςΑριθμός {             =ΑΑ             ΑΑ++       }                            Κλάση Ζώο {       Ιδιωτικό:             \\ η αρίθμηση είναι ιδιωτική, και εδώ είναι και τελική             τελική αρίθμηση=ΝέοςΑριθμός()       Δημόσιο:             \\ όλα τα αντικείμενα χρήστη είναι τύπου Ομάδα (Group)             \\ αν θέλουμε φτιάχνουμε μια μεταβλητή για να μας λέει..             \\ τι τύπος είναι για εμάς.                          \\ η τύπος$ είναι σταθερά για το αντικείμενο             τελικό τύπος$="Ζώο"             \\ ιδιότητα που δίνει μόνο τιμή, δεν δέχεται             Ιδιότητα όνομα$ {Αξία}="χωρίς όνομα"             \\ ιδιότητα που αλλάζει τιμή και δίνει τιμή             \\ το παρακάτω είναι όμοιο με το αμέσως επόμενο             \\ Ιδιότητα Κάνει$ {Αξία, Θέσε} ="Δεν έχει οριστεί"             Ιδιότητα Κάνει$ ="Δεν έχει οριστεί"             \\ αυτή η συνάρτηση δεν είναι τελική και μπορεί να αλλάξει             Συνάρτηση Τελική Ποιο$ {                   =μορφή$("Είμαι το υπ' αριθμόν {0} ζώο",.αρίθμηση)             }             Συνάρτηση Τι$ {                   ="Με λένε "+.όνομα$+" και κάνω "+Κάνει$             }       Κλάση:             Τμήμα Ζώο {                   \\ μπορούμε να θέσουμε στην ιδιωτική της ιδιότητας                   \\ μόνο  μέσα από τμήμα ή συνάρτηση του αντικειμένου                   Διάβασε .[όνομα]$, .[Κάνει]$             }       }       Κλάση Σκύλος {             Συνάρτηση Τελική Τι$ {                   ="Είμαι σκύλος και με λένε "+.όνομα$+" και κάνω "+πεζ$(.Κάνει$)             }       Κλάση:             Τμήμα Σκύλος (ονομα$) {                   \\ ήδη η Σκύλος έχει την τελική Τι$ και δεν θα την αλλάξει                   \\ παρόλο που το Ζώο() του την παρέχει                   Αυτό<=Ζώο(ονομα$,"Γαβ γαβ")             }       }       Κλάση Γάτα {             Συνάρτηση Τελική Τι$ {                   ="Είμαι γάτα και με λένε "+.όνομα$+" και κάνω "+πεζ$(.Κάνει$)       }       Κλάση:             Τμήμα Γάτα (όνομα$) {                   Αυτό<=Ζώο(όνομα$, "Νιάου νιάου")             }       }              \\ δεν δίνουμε αρχική τιμή στα στοιχεία του πίνακα       \\ η αρχική τιμή που γυρνάει η Τύπος$() είναι "Empty"       Πίνακας Βάση 1, α(2)       Τύπωσε τύπος$(α(1))="Empty"   ' Αληθές       \\ βάζουμε στα 1 και 2 από ένα αντικείμενο       α(1)=Σκύλος("Αζόρ"),Γάτα("Ψιψίνα")       \\ Τώρα ο τύπος της α(1) είναι Group (ομάδα)       Τύπωσε τύπος$(α(1))="Group"   ' Αληθές              \\Μπορούμε να καλέσουμε την τι$() από τα δυο στοιχεία του πίνακα       \\ επειδή είναι συνάρτηση βάζουμε τις παρενθέσεις παρόλο που δεν βάζουμε ορίσματα       Για ι=1 έως 2             Τύπωσε α(ι).τι$()       Επόμενο              Δες Εντάξει {             α(1).όνομα$="Μαξ"       }       \\ βγάζει λάθος, λέει ότι χρειάζεται μια ομάδα στη δεξιά έκφραση, επειδή δεν έχει οριστεί πεδίο Θέσε.       Αν όχι Εντάξει τότε Πένα 11 {τύπωσε Λάθος$}              \\ η κάνει$ είναι ιδιότητα που αλλάζει τιμή       α(1).κάνει$="Γαβ γαβ γαβ"              \\ αυξάνουμε το πίνακα κατά 1       Πίνακας α(1 εως 3)       Κλάση ΚάτιΆλλο {             τελική τύπος$="Κάτι Άλλο"       }       α(3)=ΚάτιΆλλο()              Για ι=1 έως 2             Αν α(ι).τύπος$="Ζώο" Τότε                   Τύπωσε α(ι).Ποιο$()                   Τύπωσε α(ι).τι$()             Τέλος Αν       Επόμενο              \\ πιο ωραίος κώδικας, και πιο γρήγορος, γιατί ο διερμηνευτής έχει έτοιμο το α(ι)       \\ για κάθε .κάτι που καλούμε              Για ι=1 έως 2             Για α(ι) {                   Αν .τύπος$="Ζώο" Τότε                         Τύπωσε .Ποιο$()                         Τύπωσε .τι$()                   Τέλος Αν             }       Επόμενο       \\ εδώ τελειώνει ο κώδικας       \\ οι συναρτήσεις, ο πίνακας και οι μεταβλητές Εντάξει και ι θα διαγραφούν       Βάλε α(1) } \\ Δεν χρειάζεται να ορίσουμε το Κ ως ομάδα, αλλά μπορούμε να το κάνουμε Ομάδα Κ \\ καλούμε το τμήμα ΔοκιμήΑ ΔοκιμήΑ \\ Περιμένουμε μια τιμή στο σωρό τιμών, στη κορυφή \\ αν έχουμε ομάδα τότε το ταύτιση("Ο") είναι αληθές Αν ταύτιση("Ο") τότε       Τμήμα Προσωρινό(&α) {             \\ Μπορούμε να προσθέσουμε ένα τμήμα που θα διαβάζει την αρίθμηση             \\ και επειδή η προσθήκη μπήκε στην αναφορά του Κ στο α             \\ δεν θα υπάρχει στο Κ                          \\ αυτό συμβαίνει γιατί το α έχει με αναφορά όλα τα μέλη το Κ,             \\ αλλά το α είναι διαφορετικό αντικείμενο από το Κ             \\ με αυτόν τον τρόπο, ενώ ένα αντικείμενο δεν διαγράφει μέλη             \\ μπορούμε να πάρουμε αντίγραφο με αναφορά στις τιμές             \\ και σε αυτό να φτιάξουμε νέα μέλη             \\ και στην έξοδο από το τμήμα το αντίγραφο θα διαγραφεί             \\ αλλά δεν θα διαγραφούν οι αναφερόμενες τιμές.             Ομάδα α {                   Τμήμα Δείξε_Αρίθμηση {                         Τύπωσε .αρίθμηση                   }             }             α.Δειξε_Αρίθμηση             Τύπωσε Τμήμα(α.Δείξε_Αρίθμηση)=Αληθές       }       \\ και την διαβάζουμε στη Κ (αν η Κ δεν είναι νέα και δεν είναι ομάδα βγαίνει λάθος)       Διάβασε Κ       Τύπωσε Τύπος$(Κ)="Group"       Τύπωσε Κ.τύπος$="Ζώο"  ' Αληθές       Τύπωσε Κ.Κάνει$="Γαβ γαβ γαβ"       Προσωρινό &Κ       Τύπωσε Τμήμα(Κ.Δείξε_Αρίθμηση)=Ψευδές Τέλος Αν

Πέμπτη 23 Μαΐου 2019

Rank of programming languages per entries from rosetta.org




Sample output on Thursday, May 23, 2019:

rank:   1.  1144 entries - Go
rank:   2.  1078 entries - Perl 6
rank:   3.  1057 entries - Python
rank:   4.  1042 entries - Kotlin
rank:   5.  1025 entries - Perl
rank:   6.  1024 entries - Phix
rank:   7.  1011 entries - Julia
rank:   8.   989 entries - Racket
rank:   9.   949 entries - C
rank:  10.   944 entries - J
rank:  11.   933 entries - Zkl
rank:  12.   930 entries - Tcl
rank:  13.   908 entries - Java
rank:  14.   906 entries - REXX
rank:  15.   876 entries - Ruby
rank:  16.   875 entries - D
rank:  17.   869 entries - Haskell
rank:  18.   809 entries - Sidef
rank:  19.   793 entries - Scala
rank:  20.   775 entries - C sharp
rank:  21.   774 entries - PicoLisp
rank:  22.   764 entries - C++
rank:  23.   748 entries - Mathematica
rank:  24.   678 entries - Common Lisp
rank:  25.   667 entries - Ada
rank:  26.   636 entries - JavaScript
rank:  27.   630 entries - Lua
rank:  28.   628 entries - AutoHotkey
rank:  29.   610 entries - Ring
rank:  30.   592 entries - Clojure
rank:  31.   590 entries - Unicon
rank:  32.   572 entries - Factor
rank:  33.   565 entries - ALGOL 68
rank:  34.   563 entries - Nim
rank:  35.   562 entries - PureBasic
rank:  36.   560 entries - BBC BASIC
rank:  37.   557 entries - Fortran
rank:  38.   556 entries - OCaml
rank:  39.   539 entries - PARI/GP
rank:  40.   533 entries - F Sharp
rank:  41.   532 entries - Icon
rank:  42.   517 entries - Elixir
rank:  43.   495 entries - Erlang
rank:  44.   493 entries - FreeBASIC
rank:  45.   482 entries - Rust
rank:  46.   473 entries - PowerShell
rank:  47.   462 entries - Jq
rank:  48.   456 entries - Pascal
rank:  49.   450 entries - Forth
rank:  50.   448 entries - AWK
rank:  51.   441 entries - Seed7
rank:  52.   434 entries - R
rank:  53.   408 entries - Groovy
rank:  54.   403 entries - PL/I
rank:  55.   401 entries - PHP
rank:  56.   383 entries - VBA
rank:  57.   361 entries - Scheme
rank:  58.   359 entries - MATLAB
rank:  59.   348 entries - Swift
rank:  60.   343 entries - Maple
rank:  61.   342 entries - M2000 Interpreter
rank:  62.   337 entries - Liberty BASIC
rank:  63.   314 entries - Run BASIC
rank:  64.   308 entries - Oforth
rank:  65.   307 entries - Prolog
rank:  66.   306 entries - Octave
rank:  67.   305 entries - XPL0
rank:  68.   304 entries - EchoLisp
rank:  69.   290 entries - Bracmat
rank:  70.   290 entries - UNIX Shell
rank:  71.   289 entries - VBScript
rank:  72.   287 entries - NetRexx
rank:  73.   284 entries - Objeck
rank:  74.   280 entries - Oz
rank:  75.   272 entries - E
rank:  76.   270 entries - COBOL
rank:  77.   265 entries - BASIC
rank:  78.   260 entries - Smalltalk
rank:  79.   259 entries - Lasso
rank:  80.   258 entries - Wolfram Language
rank:  81.   253 entries - Delphi
rank:  82.   244 entries - AppleScript
rank:  83.   239 entries - Elena
rank:  84.   232 entries - Euphoria
rank:  85.   226 entries - Visual Basic .NET
rank:  86.   220 entries - OoRexx
rank:  87.   217 entries - CoffeeScript
rank:  88.   210 entries - Maxima
rank:  89.   208 entries - Stata
rank:  90.   208 entries - ZX Spectrum Basic
rank:  91.   206 entries - Logo
rank:  92.   204 entries - 360 Assembly
rank:  93.   204 entries - Batch File
rank:  94.   196 entries - Ursala
rank:  95.   194 entries - Lingo
rank:  96.   193 entries - Standard ML
rank:  97.   183 entries - ERRE
rank:  98.   174 entries - Gambas
rank:  99.   168 entries - ALGOL W
rank: 100.   168 entries - IS-BASIC
rank: 101.   167 entries - Aime
rank: 102.   166 entries - Befunge
rank: 103.   163 entries - Modula-2
rank: 104.   161 entries - GAP
rank: 105.   159 entries - Objective-C
rank: 106.   156 entries - HicEst
rank: 107.   155 entries - TUSCRIPT
rank: 108.   153 entries - Fantom
rank: 109.   152 entries - Eiffel
rank: 110.   150 entries - Nemerle
rank: 111.   148 entries - Yabasic
rank: 112.   146 entries - Applesoft BASIC
rank: 113.   143 entries - REBOL
rank: 114.   140 entries - K
rank: 115.   140 entries - NewLISP
rank: 116.   139 entries - TXR
rank: 117.   137 entries - Emacs Lisp
rank: 118.   127 entries - LiveCode
rank: 119.   126 entries - Slate
rank: 120.   124 entries - Modula-3
rank: 121.   121 entries - ActionScript
rank: 122.   119 entries - BaCon
rank: 123.   116 entries - Oberon-2
rank: 124.   116 entries - SNOBOL4
rank: 125.   115 entries - MAXScript
rank: 126.   115 entries - TI-83 BASIC
rank: 127.   112 entries - Ursa
rank: 128.   112 entries - Visual Basic
rank: 129.   111 entries - Jsish
rank: 130.   111 entries - Retro
rank: 131.   107 entries - Pike
rank: 132.   106 entries - Vedit macro language
rank: 133.   105 entries - Déjà Vu
rank: 134.   105 entries - Frink
rank: 135.   105 entries - MUMPS
rank: 136.   104 entries - DWScript
rank: 137.   102 entries - APL
rank: 138.   100 entries - ACL2
rank: 139.    97 entries - Mercury
rank: 140.    96 entries - AutoIt
rank: 141.    96 entries - Pop11
rank: 142.    95 entries - TI-89 BASIC
rank: 143.    94 entries - Ceylon
rank: 144.    93 entries - Axe
rank: 145.    93 entries - Io
rank: 146.    92 entries - Crystal
rank: 147.    92 entries - PostScript
rank: 148.    91 entries - ARM Assembly
rank: 149.    91 entries - FunL
rank: 150.    88 entries - Simula
rank: 151.    86 entries - 8th
rank: 152.    86 entries - Bc
rank: 153.    85 entries - 11l
rank: 154.    81 entries - M4
rank: 155.    81 entries - МК-61/52
rank: 156.    80 entries - Ol
rank: 157.    78 entries - Dart
rank: 158.    77 entries - LFE
rank: 159.    77 entries - Raven
rank: 160.    76 entries - FutureBasic
rank: 161.    75 entries - Logtalk
rank: 162.    75 entries - Min
rank: 163.    75 entries - Sinclair ZX81 BASIC
rank: 164.    74 entries - Component Pascal
rank: 165.    74 entries - X86 Assembly
rank: 166.    71 entries - Red
rank: 167.    69 entries - ABAP
rank: 168.    69 entries - Ela
rank: 169.    69 entries - Sather
rank: 170.    69 entries - XLISP
rank: 171.    68 entries - Brat
rank: 172.    68 entries - SQL
rank: 173.    66 entries - Neko
rank: 174.    66 entries - Scilab
rank: 175.    65 entries - Burlesque
rank: 176.    65 entries - LabVIEW
rank: 177.    65 entries - OxygenBasic
rank: 178.    63 entries - IDL
rank: 179.    62 entries - Dc
rank: 180.    62 entries - Vala
rank: 181.    62 entries - Wart
rank: 182.    61 entries - ColdFusion
rank: 183.    60 entries - SequenceL
rank: 184.    57 entries - Commodore BASIC
rank: 185.    57 entries - Locomotive Basic
rank: 186.    57 entries - SAS
rank: 187.    56 entries - Easyprog.online
rank: 188.    56 entries - FBSL
rank: 189.    55 entries - BASIC256
rank: 190.    55 entries - PowerBASIC
rank: 191.    53 entries - FALSE
rank: 192.    53 entries - OpenEdge/Progress
rank: 193.    51 entries - SPL
rank: 194.    50 entries - Fōrmulæ
rank: 195.    50 entries - Metafont
rank: 196.    49 entries - Lang5
rank: 197.    49 entries - Rascal
rank: 198.    48 entries - DCL
rank: 199.    48 entries - Microsoft Small Basic
rank: 200.    47 entries - Toka
rank: 201.    46 entries - ATS
rank: 202.    46 entries - Inform 7
rank: 203.    45 entries - Joy
rank: 204.    43 entries - Wortel
rank: 205.    43 entries - XSLT
rank: 206.    42 entries - HolyC
rank: 207.    42 entries - Sparkling
rank: 208.    42 entries - SQL PL
rank: 209.    41 entries - Aikido
rank: 210.    41 entries - TorqueScript
rank: 211.    41 entries - Yorick
rank: 212.    40 entries - RapidQ
rank: 213.    40 entries - S-lang
rank: 214.    40 entries - UnixPipes
rank: 215.    40 entries - V
rank: 216.    39 entries - Apex
rank: 217.    39 entries - GW-BASIC
rank: 218.    39 entries - Harbour
rank: 219.    39 entries - SETL
rank: 220.    38 entries - Falcon
rank: 221.    38 entries - Lisaac
rank: 222.    38 entries - Sed
rank: 223.    37 entries - Babel
rank: 224.    37 entries - Brainf***
rank: 225.    36 entries - Elm
rank: 226.    36 entries - Futhark
rank: 227.    35 entries - AmigaE
rank: 228.    35 entries - C Shell
rank: 229.    35 entries - Chapel
rank: 230.    34 entries - 6502 Assembly
rank: 231.    34 entries - Caché ObjectScript
rank: 232.    34 entries - GML
rank: 233.    34 entries - Nial
rank: 234.    34 entries - RLaB
rank: 235.    34 entries - Vim Script
rank: 236.    33 entries - SuperCollider
rank: 237.    32 entries - EGL
rank: 238.    32 entries - Gnuplot
rank: 239.    32 entries - I
rank: 240.    32 entries - PL/SQL
rank: 241.    32 entries - Processing
rank: 242.    32 entries - Q
rank: 243.    32 entries - Visual FoxPro
rank: 244.    31 entries - LOLCODE
rank: 245.    30 entries - Agena
rank: 246.    30 entries - GUISS
rank: 247.    30 entries - Qi
rank: 248.    30 entries - REALbasic
rank: 249.    30 entries - WDTE
rank: 250.    30 entries - Zonnon
rank: 251.    29 entries - MIRC Scripting Language
rank: 252.    29 entries - Smart BASIC
rank: 253.    29 entries - SNUSP
rank: 254.    28 entries - CMake
rank: 255.    28 entries - ECL
rank: 256.    28 entries - Hexiscript
rank: 257.    28 entries - Order
rank: 258.    28 entries - PlainTeX
rank: 259.    27 entries - Huginn
rank: 260.    27 entries - Hy
rank: 261.    27 entries - Limbo
rank: 262.    26 entries - ALGOL 60
rank: 263.    26 entries - Clean
rank: 264.    26 entries - Clipper
rank: 265.    26 entries - Haxe
rank: 266.    26 entries - MLite
rank: 267.    26 entries - Potion
rank: 268.    26 entries - Salmon
rank: 269.    24 entries - Idris
rank: 270.    24 entries - Mirah
rank: 271.    24 entries - SSEM
rank: 272.    24 entries - Trith
rank: 273.    23 entries - Astro
rank: 274.    23 entries - Ioke
rank: 275.    23 entries - ML/I
rank: 276.    23 entries - PHL
rank: 277.    23 entries - ProDOS
rank: 278.    22 entries - Beeswax
rank: 279.    22 entries - Golfscript
rank: 280.    22 entries - MIPS Assembly
rank: 281.    22 entries - ML
rank: 282.    22 entries - Suneido
rank: 283.    21 entries - Argile
rank: 284.    21 entries - Gosu
rank: 285.    21 entries - Klong
rank: 286.    21 entries - Peloton
rank: 287.    21 entries - Pure
rank: 288.    21 entries - Scratch
rank: 289.    20 entries - Assembly
rank: 290.    20 entries - Chef
rank: 291.    20 entries - Self
rank: 292.    19 entries - ChucK
rank: 293.    19 entries - Free Pascal
rank: 294.    19 entries - Verbexx
rank: 295.    18 entries - Fancy
rank: 296.    18 entries - Genie
rank: 297.    18 entries - Make
rank: 298.    17 entries - 0815
rank: 299.    17 entries - Dylan
rank: 300.    17 entries - Efene
rank: 301.    17 entries - GFA Basic
rank: 302.    17 entries - MMIX
rank: 303.    17 entries - MOO
rank: 304.    17 entries - Shen
rank: 305.    17 entries - TypeScript
rank: 306.    16 entries - Dragon
rank: 307.    16 entries - EDSAC order code
rank: 308.    16 entries - Fish
rank: 309.    16 entries - Friendly interactive shell
rank: 310.    16 entries - LSL
rank: 311.    16 entries - Spin
rank: 312.    16 entries - Wee Basic
rank: 313.    16 entries - Whitespace
rank: 314.    16 entries - Wren
rank: 315.    16 entries - Xojo
rank: 316.    15 entries - Gema
rank: 317.    15 entries - LSE64
rank: 318.    15 entries - Lucid
rank: 319.    15 entries - N/t/roff
rank: 320.    15 entries - Openscad
rank: 321.    15 entries - SystemVerilog
rank: 322.    15 entries - Transact-SQL
rank: 323.    14 entries - Arc
rank: 324.    14 entries - Axiom
rank: 325.    14 entries - Dao
rank: 326.    14 entries - Ezhil
rank: 327.    14 entries - Inform 6
rank: 328.    14 entries - Latitude
rank: 329.    14 entries - OOC
rank: 330.    14 entries - Pure Data
rank: 331.    14 entries - VAX Assembly
rank: 332.    14 entries - Z80 Assembly
rank: 333.    13 entries - ALGOL-M
rank: 334.    13 entries - Computer/zero Assembly
rank: 335.    13 entries - KonsolScript
rank: 336.    13 entries - Lambdatalk
rank: 337.    13 entries - LaTeX
rank: 338.    13 entries - Object Pascal
rank: 339.    13 entries - Pony
rank: 340.    13 entries - SmileBASIC
rank: 341.    13 entries - SPAD
rank: 342.    13 entries - VHDL
rank: 343.    12 entries - Agda
rank: 344.    12 entries - Brlcad
rank: 345.    12 entries - Clay
rank: 346.    12 entries - Egel
rank: 347.    12 entries - Es
rank: 348.    12 entries - Genyris
rank: 349.    12 entries - Halon
rank: 350.    12 entries - OASYS Assembler
rank: 351.    12 entries - Panda
rank: 352.    12 entries - Piet
rank: 353.    12 entries - RPG
rank: 354.    12 entries - Unlambda
rank: 355.    12 entries - Vorpal
rank: 356.    12 entries - XBasic
rank: 357.    12 entries - XQuery
rank: 358.    11 entries - Arendelle
rank: 359.    11 entries - BCPL
rank: 360.    11 entries - CLIPS
rank: 361.    11 entries - Coco
rank: 362.    11 entries - Curry
rank: 363.    11 entries - Frege
rank: 364.    11 entries - Gecho
rank: 365.    11 entries - Integer BASIC
rank: 366.    11 entries - Onyx
rank: 367.    11 entries - Shiny
rank: 368.    11 entries - SPARK
rank: 369.    11 entries - TSE SAL
rank: 370.    10 entries - App Inventor
rank: 371.    10 entries - Asymptote
rank: 372.    10 entries - Blz
rank: 373.    10 entries - Dyalect
rank: 374.    10 entries - EC
rank: 375.    10 entries - Elisa
rank: 376.    10 entries - LLVM
rank: 377.    10 entries - LotusScript
rank: 378.    10 entries - Mathprog
rank: 379.    10 entries - MontiLang
rank: 380.    10 entries - Niue
rank: 381.    10 entries - Robotic
rank: 382.    10 entries - Wrapl
rank: 383.     9 entries - 4DOS Batch
rank: 384.     9 entries - 8086 Assembly
rank: 385.     9 entries - Alore
rank: 386.     9 entries - Boo
rank: 387.     9 entries - Coq
rank: 388.     9 entries - Eero
rank: 389.     9 entries - Fortress
rank: 390.     9 entries - GlovePIE
rank: 391.     9 entries - IWBASIC
rank: 392.     9 entries - Lily
rank: 393.     9 entries - Luck
rank: 394.     9 entries - Monte
rank: 395.     9 entries - Morfa
rank: 396.     9 entries - MySQL
rank: 397.     9 entries - NSIS
rank: 398.     9 entries - POV-Ray
rank: 399.     9 entries - Ra
rank: 400.     9 entries - SIMPOL
rank: 401.     9 entries - Symsyn
rank: 402.     9 entries - UTFool
rank: 403.     9 entries - Zig
rank: 404.     8 entries - 4D
rank: 405.     8 entries - 6800 Assembly
rank: 406.     8 entries - 68000 Assembly
rank: 407.     8 entries - 8051 Assembly
rank: 408.     8 entries - AsciiDots
rank: 409.     8 entries - Clio
rank: 410.     8 entries - Comal
rank: 411.     8 entries - Dylan.NET
rank: 412.     8 entries - Egison
rank: 413.     8 entries - Fan
rank: 414.     8 entries - Glee
rank: 415.     8 entries - Hoon
rank: 416.     8 entries - HQ9+
rank: 417.     8 entries - LC3 Assembly
rank: 418.     8 entries - Lhogho
rank: 419.     8 entries - MBS
rank: 420.     8 entries - Nanoquery
rank: 421.     8 entries - NESL
rank: 422.     8 entries - NGS
rank: 423.     8 entries - Nit
rank: 424.     8 entries - Picat
rank: 425.     8 entries - PILOT
rank: 426.     8 entries - PIR
rank: 427.     8 entries - TIScript
rank: 428.     8 entries - Verilog
rank: 429.     7 entries - AmbientTalk
rank: 430.     7 entries - Arbre
rank: 431.     7 entries - Blast
rank: 432.     7 entries - Cobra
rank: 433.     7 entries - Crack
rank: 434.     7 entries - FOCAL
rank: 435.     7 entries - FUZE BASIC
rank: 436.     7 entries - Intercal
rank: 437.     7 entries - JCL
rank: 438.     7 entries - Kite
rank: 439.     7 entries - Purity
rank: 440.     7 entries - Rhope
rank: 441.     7 entries - SASL
rank: 442.     7 entries - Set lang
rank: 443.     7 entries - SkookumScript
rank: 444.     7 entries - Squirrel
rank: 445.     7 entries - Visual Objects
rank: 446.     7 entries - Visual Prolog
rank: 447.     7 entries - XEec
rank: 448.     7 entries - Yacas
rank: 449.     6 entries - ANTLR
rank: 450.     6 entries - BlitzMax
rank: 451.     6 entries - C++/CLI
rank: 452.     6 entries - C1R
rank: 453.     6 entries - Cat
rank: 454.     6 entries - Comefrom0x10
rank: 455.     6 entries - Dodo0
rank: 456.     6 entries - DUP
rank: 457.     6 entries - Fexl
rank: 458.     6 entries - Gastona
rank: 459.     6 entries - Gri
rank: 460.     6 entries - Hope
rank: 461.     6 entries - JavaFX Script
rank: 462.     6 entries - Lisp
rank: 463.     6 entries - Oxygene
rank: 464.     6 entries - PASM
rank: 465.     6 entries - PDP-11 Assembly
rank: 466.     6 entries - QBasic
rank: 467.     6 entries - Rockstar
rank: 468.     6 entries - Sage
rank: 469.     6 entries - Tern
rank: 470.     6 entries - True BASIC
rank: 471.     6 entries - Whenever
rank: 472.     5 entries - 8080 Assembly
rank: 473.     5 entries - Algae
rank: 474.     5 entries - Brace
rank: 475.     5 entries - Clipper/XBase++
rank: 476.     5 entries - Deluge
rank: 477.     5 entries - DMS
rank: 478.     5 entries - ELLA
rank: 479.     5 entries - Ferite
rank: 480.     5 entries - GEORGE
rank: 481.     5 entries - JAMES II/Rule-based Cellular Automata
rank: 482.     5 entries - L++
rank: 483.     5 entries - Lilypond
rank: 484.     5 entries - Metapost
rank: 485.     5 entries - MoonScript
rank: 486.     5 entries - Occam
rank: 487.     5 entries - OPL
rank: 488.     5 entries - Panoramic
rank: 489.     5 entries - PL/M
rank: 490.     5 entries - PSQL
rank: 491.     5 entries - Quill
rank: 492.     5 entries - RPL/2
rank: 493.     5 entries - Script Basic
rank: 494.     5 entries - Sisal
rank: 495.     5 entries - Snobol
rank: 496.     5 entries - Thyrd
rank: 497.     5 entries - TPP
rank: 498.     5 entries - XProc
rank: 499.     5 entries - XTalk
rank: 500.     5 entries - ZPL
rank: 501.     4 entries - 80386 Assembly
rank: 502.     4 entries - AMPL
rank: 503.     4 entries - AspectJ
rank: 504.     4 entries - B
rank: 505.     4 entries - Biferno
rank: 506.     4 entries - BlooP
rank: 507.     4 entries - Bori
rank: 508.     4 entries - Dafny
rank: 509.     4 entries - DM
rank: 510.     4 entries - ElastiC
rank: 511.     4 entries - ESQL
rank: 512.     4 entries - F
rank: 513.     4 entries - Felix
rank: 514.     4 entries - FP
rank: 515.     4 entries - Gentee
rank: 516.     4 entries - Go!
rank: 517.     4 entries - Heron
rank: 518.     4 entries - HLA
rank: 519.     4 entries - HPPPL
rank: 520.     4 entries - HyperTalk
rank: 521.     4 entries - Informix 4GL
rank: 522.     4 entries - Iptscrae
rank: 523.     4 entries - JoCaml
rank: 524.     4 entries - JScript.NET
rank: 525.     4 entries - JudoScript
rank: 526.     4 entries - Kabap
rank: 527.     4 entries - LDPL
rank: 528.     4 entries - Lobster
rank: 529.     4 entries - Lush
rank: 530.     4 entries - MUF
rank: 531.     4 entries - Mythryl
rank: 532.     4 entries - NetLogo
rank: 533.     4 entries - Omega
rank: 534.     4 entries - Quite BASIC
rank: 535.     4 entries - RTL/2
rank: 536.     4 entries - SheerPower 4GL
rank: 537.     4 entries - SMEQL
rank: 538.     4 entries - SPARC Assembly
rank: 539.     4 entries - StreamIt
rank: 540.     4 entries - Tbas
rank: 541.     4 entries - Teco
rank: 542.     4 entries - TI-83 Hex Assembly
rank: 543.     4 entries - TransFORTH
rank: 544.     4 entries - Twelf
rank: 545.     4 entries - Uniface
rank: 546.     4 entries - VB6
rank: 547.     4 entries - XSLT 2.0
rank: 548.     4 entries - ZED
rank: 549.     3 entries - .QL
rank: 550.     3 entries - 8 1/2
rank: 551.     3 entries - A+
rank: 552.     3 entries - Agda2
rank: 553.     3 entries - ALGOL
rank: 554.     3 entries - Alice ML
rank: 555.     3 entries - ANT
rank: 556.     3 entries - Application Master
rank: 557.     3 entries - ASP
rank: 558.     3 entries - ASP.Net
rank: 559.     3 entries - AspectC++
rank: 560.     3 entries - Axum
rank: 561.     3 entries - Basic Casio
rank: 562.     3 entries - Battlestar
rank: 563.     3 entries - Beta
rank: 564.     3 entries - BML
rank: 565.     3 entries - C0H
rank: 566.     3 entries - Caml
rank: 567.     3 entries - CB80
rank: 568.     3 entries - Cecil
rank: 569.     3 entries - Cilk
rank: 570.     3 entries - Cilk++
rank: 571.     3 entries - Cubescript
rank: 572.     3 entries - Datalog
rank: 573.     3 entries - Diesel
rank: 574.     3 entries - Elan
rank: 575.     3 entries - Euler
rank: 576.     3 entries - Extended BrainF***
rank: 577.     3 entries - FAUST
rank: 578.     3 entries - FeatureC++
rank: 579.     3 entries - FPI
rank: 580.     3 entries - FreeMat
rank: 581.     3 entries - Glagol
rank: 582.     3 entries - Global Script
rank: 583.     3 entries - Golo
rank: 584.     3 entries - Goo
rank: 585.     3 entries - Jabaco
rank: 586.     3 entries - Kaya
rank: 587.     3 entries - KeyList Databasing
rank: 588.     3 entries - Kitten
rank: 589.     3 entries - L.in.oleum
rank: 590.     3 entries - LiveScript
rank: 591.     3 entries - Lotus 123 Macro Scripting
rank: 592.     3 entries - Lout
rank: 593.     3 entries - M680x0
rank: 594.     3 entries - Maude
rank: 595.     3 entries - MDL
rank: 596.     3 entries - ME10 macro
rank: 597.     3 entries - MGS
rank: 598.     3 entries - Mirelle
rank: 599.     3 entries - Monicelli
rank: 600.     3 entries - Mython
rank: 601.     3 entries - Nice
rank: 602.     3 entries - NQP
rank: 603.     3 entries - OASYS
rank: 604.     3 entries - OpenC++
rank: 605.     3 entries - Pentium Assembly
rank: 606.     3 entries - PL/pgSQL
rank: 607.     3 entries - PLUS
rank: 608.     3 entries - PLZ/SYS
rank: 609.     3 entries - Powerbuilder
rank: 610.     3 entries - PPC Assembly
rank: 611.     3 entries - PPL
rank: 612.     3 entries - Pyret
rank: 613.     3 entries - QuakeC
rank: 614.     3 entries - Refal
rank: 615.     3 entries - RLSL
rank: 616.     3 entries - RPL
rank: 617.     3 entries - RTSL
rank: 618.     3 entries - Sass/SCSS
rank: 619.     3 entries - Script3D
rank: 620.     3 entries - Superbase BASIC
rank: 621.     3 entries - TAL
rank: 622.     3 entries - TeLa
rank: 623.     3 entries - Thistle
rank: 624.     3 entries - Turing
rank: 625.     3 entries - UC++
rank: 626.     3 entries - UScript
rank: 627.     3 entries - UserRPL
rank: 628.     3 entries - VRML
rank: 629.     3 entries - WML
rank: 630.     3 entries - XBase
rank: 631.     3 entries - XUL
rank: 632.     3 entries - ΜC++
rank: 633.     3 entries - உயிர்/Uyir
rank: 634.     2 entries - ArnoldC
rank: 635.     2 entries - Bird
rank: 636.     2 entries - Cduce
rank: 637.     2 entries - DeviousYarn
rank: 638.     2 entries - GLBasic
rank: 639.     2 entries - GLSL
rank: 640.     2 entries - Hack
rank: 641.     2 entries - Jack
rank: 642.     2 entries - JOVIAL
rank: 643.     2 entries - Luna
rank: 644.     2 entries - Malbolge
rank: 645.     2 entries - MathCortex
rank: 646.     2 entries - MINIL
rank: 647.     2 entries - MSX Basic
rank: 648.     2 entries - Myrddin
rank: 649.     2 entries - MyrtleScript
rank: 650.     2 entries - OOCalc
rank: 651.     2 entries - OpenLisp
rank: 652.     2 entries - PeopleCode
rank: 653.     2 entries - Perl5i
rank: 654.     2 entries - Pict
rank: 655.     2 entries - Reason
rank: 656.     2 entries - ScriptBasic
rank: 657.     2 entries - TechBASIC
rank: 658.     2 entries - ToffeeScript
rank: 659.     2 entries - Viua VM assembly
rank: 660.     2 entries - Vox
rank: 661.     2 entries - X86 64 Assembly
rank: 662.     2 entries - XL
rank: 663.     2 entries - XPath 2.0
rank: 664.     2 entries - XSLT 1.0
rank: 665.     1 entries - 1C
rank: 666.     1 entries - Action!
rank: 667.     1 entries - Anyways
rank: 668.     1 entries - Apricot
rank: 669.     1 entries - AutoLISP
rank: 670.     1 entries - B4J
rank: 671.     1 entries - CafeOBJ
rank: 672.     1 entries - CHR
rank: 673.     1 entries - Clarion
rank: 674.     1 entries - DDNC
rank: 675.     1 entries - DIV Games Studio
rank: 676.     1 entries - Emojicode
rank: 677.     1 entries - FormulaOne
rank: 678.     1 entries - FRISC Assembly
rank: 679.     1 entries - Jacquard Loom
rank: 680.     1 entries - Kamailio Script
rank: 681.     1 entries - Lambda Prolog
rank: 682.     1 entries - LibreOffice Basic
rank: 683.     1 entries - MAPPER
rank: 684.     1 entries - MEL
rank: 685.     1 entries - MiniZinc
rank: 686.     1 entries - Mond
rank: 687.     1 entries - Monkey
rank: 688.     1 entries - NASL
rank: 689.     1 entries - Neat
rank: 690.     1 entries - NewtonScript
rank: 691.     1 entries - Nickle
rank: 692.     1 entries - Nix
rank: 693.     1 entries - Opa
rank: 694.     1 entries - Pare
rank: 695.     1 entries - Qore
rank: 696.     1 entries - Rapira
rank: 697.     1 entries - RPGIV
rank: 698.     1 entries - Setl4
rank: 699.     1 entries - Soar
rank: 700.     1 entries - SoneKing Assembly
rank: 701.     1 entries - Supernova
rank: 702.     1 entries - SuperTalk
rank: 703.     1 entries - Terra
rank: 704.     1 entries - TestML
rank: 705.     1 entries - WebAssembly
rank: 706.     1 entries - Wollok
rank: 707.     1 entries - Xanadu
rank: 708.     1 entries - Ya
rank: 709.     1 entries - МiniZinc
rank: 710.     0 entries - AngelScript
rank: 711.     0 entries - Binary Lambda Calculus
rank: 712.     0 entries - EhBASIC
rank: 713.     0 entries - Epigram
rank: 714.     0 entries - FLORA-2
rank: 715.     0 entries - Florid
rank: 716.     0 entries - Gerbil
rank: 717.     0 entries - LC2200 Assembly
rank: 718.     0 entries - Leon
rank: 719.     0 entries - Livecode
rank: 720.     0 entries - LLP
rank: 721.     0 entries - Loglan82
rank: 722.     0 entries - Lolli
rank: 723.     0 entries - Lygon
rank: 724.     0 entries - ObjectIcon
rank: 725.     0 entries - PL/B
rank: 726.     0 entries - Plan
rank: 727.     0 entries - Reduce
rank: 728.     0 entries - Rubylog
rank: 729.     0 entries - S BASIC
rank: 730.     0 entries - SimpleLang
rank: 731.     0 entries - Star
rank: 732.     0 entries - X10
rank: 733.     0 entries - XS

Σάββατο 27 Απριλίου 2019

Dijkstra's algorithm

This is a rosettacode.org task
The graph stored in a jagged array. A tuple in m2000 is an array of one dimension. We can put tuple in a tuple too, so this is a jagged array. When we store an array in an array, we store only the pointer to array (which is an object, so we can read the type if we wish).

So Edges is a pointer to the graph (which we didn't change values). The task want only to find the path from a to e, and the weight. But here we search all the paths from every vertex to every vertex (and if not possible the a "no path" label printed).

I use an inventory list only with keys, because we can delete any of them without cost (this list need unique keys). Because we have the statement Inventory in a loop, the second time the inventory must be empty (or an exception produced), but algorithm end when inventory is empty. (to clear an inventory S we have to use Clear S.

There are two lambda functions inside loop. Because we use closures, and for d and pa we get new pointer in each iteration we have to redefine the lambdas to get new closures (with new pointers). Closures in lambda are copies, and this include pointers.

Also I use some subs, which have same scope as the module where we call them. Functions and Modules are namespaces (this include the lambda functions). There is special call to place the same namespace the Call Local but here not used.

I use this pdf for information about algorithm.


Module Dijkstra`s_algorithm {
        const max_number=1.E+306
        GetArr=lambda (n, val)->{
                dim d(n)=val
                =d()
        }
        term=("",0)
        Edges=(("a", ("b",7),("c",9),("f",14)),("b",("c",10),("d",15)),("c",("d",11),("f",2)),("d",("e",6)),("e",("f", 9)),("f",term))
        Document Doc$="Graph:"+{
        }
        ShowGraph()
        Doc$="Paths"+{
        }
        Print "Paths"
        For from_here=0 to 5
                pa=GetArr(len(Edges), -1)
                d=GetArr(len(Edges), max_number)
                Inventory S=1,2,3,4,5,6
                return d, from_here:=0
                RemoveMin=Lambda S, d, max_number-> {
                        ss=each(S)
                        min=max_number
                        p=0
                        while ss
                                val=d#val(eval(S,ss^)-1)
                                if min>val then let min=val : p=ss^ 
                        end while
                        =s(p!)  ' use p as index not key
                        Delete S, eval(s,p)
                }
                Show_Distance_and_Path$=lambda$ d, pa, from_here, max_number (n) -> {
                        ret1$=chr$(from_here+asc("a"))+" to "+chr$(n+asc("a"))
                        if d#val(n) =max_number then =ret1$+ "No Path" :exit
                        let ret$="", mm=n, m=n
                        repeat
                                n=m
                                ret$+=chr$(asc("a")+n)
                                m=pa#val(n)
                        until  from_here=n 
                        =ret1$+format$("{0::-4} {1}",d#val(mm),strrev$(ret$))
                }
                while len(s)>0 
                        u=RemoveMin()
                        rem Print u, chr$(u-1+asc("a"))
                        Relaxed()
                end while
                For i=0 to len(d)-1
                        line$=Show_Distance_and_Path$(i)
                        Print line$
                        doc$=line$+{
                        }
                next
        next
        Clipboard Doc$
        End
        Sub Relaxed()
                local vertex=Edges#val(u-1), i
                local e=Len(vertex)-1, edge=(,), val
                for i=1 to e
                        edge=vertex#val(i)
                        if edge#val$(0)<>"" then
                                val=Asc(edge#val$(0))-Asc("a")
                                if d#val(val)>edge#val(1)+d#val(u-1) then  return d, val:=edge#val(1)+d#val(u-1) : Return Pa, val:=u-1
                        end if
                next 
        end sub
        Sub ShowGraph()
                Print "Graph"
                local i
                for i=1 to len(Edges)
                        show_edges(i)
                next
        end sub
        Sub show_edges(n)
                n--
                local vertex=Edges#val(n), line$
                local e=each(vertex 2 to end), v2=(,)
                While e 
                        v2=array(e)
                        line$=vertex#val$(0)+if$(v2#val$(0)<>""->"->"+v2#val$(0)+format$(" {0::-2}",v2#val(1)),"")
                        Print line$
                        Doc$=line$+{
                        }
                end while
        end sub
}
Dijkstra`s_algorithm




Graph:
a->b  7
a->c  9
a->f 14
b->c 10
b->d 15
c->d 11
c->f  2
d->e  6
e->f  9
f
Paths
a to a   0 a
a to b   7 ab
a to c   9 ac
a to d  20 acd
a to e  26 acde
a to f  11 acf
b to a     No Path
b to b   0 b
b to c  10 bc
b to d  15 bd
b to e  21 bde
b to f  12 bcf
c to a     No Path
c to b     No Path
c to c   0 c
c to d  11 cd
c to e  17 cde
c to f   2 cf
d to a     No Path
d to b     No Path
d to c     No Path
d to d   0 d
d to e   6 de
d to f  15 def
e to a     No Path
e to b     No Path
e to c     No Path
e to d     No Path
e to e   0 e
e to f   9 ef
f to a     No Path
f to b     No Path
f to c     No Path
f to d     No Path
f to e     No Path
f to f   0 f

Τρίτη 23 Απριλίου 2019

Anonymous Functions

M2000 support anonymous functions with closures
If a closure is a reference type then saved as reference. So here s is a reference to a stack object. When we wish to use it, preserving items, we have to copy it, using stack() function ( stack(s,s) copy two times, in a new stack object)

Here f closure is a lambda function. A lambda function saved as closure as a value type, so each closure in a f is a new copy. So curry (a variable which hold the lambda function) get a function and all other arguments in a second closure, the stack object, and then return a lambda object. We make a new lambda named curried, which hold the anonymous function.

The disp variable hold another lambda, which we use it with a Call (without returning a result). By default if we use a numeric type lambda we get 0 if no return statement exist in function (we use = as statement to return value(s)).
We can store the lambda function (as a copy) to arrays and inventories (And stack objects, and lambda members of objects type of Group)

In M2000 a call to a function or module done without checking for proper arguments at the calling part. We can analyze the input before the use of arguments in code, but most times we use a Read statement, or the syntactic sugar the parameter list in parenthesis (which make a Read statement). Calling a function by Call we place current stack among the arguments, but using a function in an expression we use new stack with arguments only (can be expand, but at the exit from function the stack deleted).

Type checking are in two levels in M2000. First level, or basic level, is the two types, the numeric and the string type, for return type from expressions. So if we want a string type function we have to use $ in the name and for lambda functions we have to use lambda$ (and not lambda). A numeric type can return objects too. Also the string type may return objects too.

alfa$ =lambda$ ->{
        group k$ {
                k=1000
                value {
                        ="ok"
                }
        }
        =Group$(k)
}
Dim K$(10)
K$(3)=alfa$()
Print K$(3)
Link K$() to K()  ' so K() is a reference to K$()
Print K(3).k


Second level type checking is about the type of arguments. If we don;t provide type then type must be numeric/object or string/object depends of the name (like first level).
In sum function we have a loop while stack is not empty and we get  a number. If stack item isn't a number we get error.
change these lines to pass enum type arguments. We use the peek function, stackitem() which return numeric value even we have object, but we have to drop manual, using drop statement, to emulate a pop from stack.

sum=lambda -> {
        s=0   \\ number pop numbers from stack
        while not empty : s+=stackitem(): drop :end while
        =s
}
enum nums {five=5, seven=7, nine=9}
curried=curry(sum, five, seven, nine)


So in the example bellow we want numbers only (so we use Number which pop a number from stack)



\\ Anonymous Functions
curry=lambda (f)->{
        \\ get arguments as a stack object and store reference to s
        \\ f and s are closures to returned anonymous function
        =lambda f, s=[] -> {
                \\ pass arguments [] to f() if any
                \\ pass arguments using a copy of s
                \\ passing done using ! symbol before a stack object
                =f(![], !stack(s))
        }
}
sum=lambda -> {
        s=0   \\ number pop numbers from stack
        while not empty : s+=number:end while
        =s
}
curried=curry(sum, 5,7,9)
Print curried(1,2,3)=5+7+9+1+2+3  ' true
Print curried(10,20,30)=5+7+9+10+20+30 ' true
Print curried()=5+7+9  ' true
curried2=curry(sum)
Print curried2()=0
curried2=curry(sum, 10,20,30,40)
Print curried2(1,2,3,4)=110
\\ make a closure for a lambda function
disp=lambda title$="my title:" (that$) -> {
        Print title$;that$
}
Call disp("Anonymous Function")
Dim A(10)
A(3)=disp
ret=A(3)("Call from array")
Inventory Abc="100":=disp
ret=Abc("100")("Call from inventory")
ret=lambda title$="another tilte1:" (that$)->{Print title$;that$}("call anonymous function")
ret=lambda title$="another tilte2:" (that$)->{
        Print title$;that$
}("call anonymous function")