Τρίτη 30 Μαΐου 2017

Αναθεώρηση 7 (Έκδοση 8.8)

Σε αυτήν την αναθεώρηση διόρθωσα ένα ζήτημα με ορισμένες γραμματοσειρές που είχαν μια κακή επίδραση στην εντολή Αναφορά (η εντολή που εμφανιζει κείμενο με στοίχιση).  Για αυτές τις γραμματοσειρές δεν δούλευε σωστά η Φόρμα, πχ όταν ζητάγαμε 80Χ40 έδινε 81Χ36!!!!!
Το πρόβλημα έβγαινε με την Ubuntu γραμματοσειρά στο Linux, και με την Courier (την παλιά). Οπότε βρέθηκε η λύση με γενικό τρόπο (έλυσε και τα δυο προβλήματα), δηλαδή δουλεύει για οποιαδήποτε γραμματοσειρά, και η Αναφορά και η Φόρμα.

Ελέγχθηκε με το πρόγραμμα εδώ:
http://georgekarras.blogspot.gr/2015/12/116.html


A game with Functional Programming in M2000

This is a simple game, written in M2000 code. We can run it in M2000 Environment, using:
Edit A
Now open editor in Module A so we paste from clipboard (or use drag and drop from this page) and press Esc
Now just write A and press enter
You can save it
Save Blast
So next time you run M2000.exe just do this to auto run it
Load Blast, A

Explain of closure in lambda function
Each lambda function is a variable with two parts, a function and a list of closure variables (or arrays or objects). When we call a lambda function then interpreter use this list to make local variables to function. At the exit of the call, all closures values refreshed with last values (some of them maybe are pointers to objects so no copy happen for those). So closures provide state to lambda functions. Here we didn't use closures to save state. We use them to feed lambda functions. So when a lambda function need to use another function, it is there, as local function.
Game_Loop is a lambda with all logic inside. So if we pass to stack this function as variable then we pass a tree of closures. We didn't use Move_Up function, but a closure of that function inside MyKey which is a closure in New_Score which is a closure in Game_Loop.
I/O commands/ functions are Print and Keypress().

State for game kept in stack. Stack isn't process stack, but a special object with a collection inside for values (but also for objects too). Lambda Functions are objects in M2000. We can't change closures from outside of a lambda function. We can't delete or add closures if we define a lambda function. But we can change the object, when simply assign a new lambda. In M2000 we can put lambda functions to arrays or inventories (lists with a key/value pairs) and we can use them with no copies. So if A(2) hold a lambda function then A(2)() call that function (with no parameters here), and A(2) return a copy of lambda function. Lambda objects not expose pointers to them in M2000. We can pass a reference to lambda as we pass reference to variable, using & at call, so we push a weak reference to stack and from calee we use same & at reading from stack, and Read command make weak reference as real reference. Weak references are strings in M2000 which are full names for variables or and arrays. There are standard functions (not lambda), and a lambda object also have a standard function, but anonymous. We can get a reference from lambda's function only, but we loose closures, because standard functions have no closures.
From inside a lambda function we can see only stack, if called in expression this is private, but if we call using Call that is the callers stack, so is like public. Inside Game_Loop we use private stack for Game_Loop as public stack when we call New_Score, and here is the point of using stateless call, state is on stack, which we provide at the one call to Game_Loop.



\\stateless paradigm
Move_Up=lambda (x)-> {
      
if x<10 then x++
      =x
}
Move_Down=lambda (x)-> {
      
if x>1 then x--
      =x
}
Move_No= Lambda (x)->x
\\ we pass as closures three functions to MyKey
MyKey=Lambda Move_No, Move_Up, Move_Down (x)-> {
      
Select Case keypress(0x26)+keypress(0x28)*2
      
Case -1
            =Move_Up(x)
      
Case -2
            =Move_Down(x)
      
Else
            =Move_No(x)
      
End select
}
Key_Esc=Lambda ->Keypress(32)
DispEnemy$=lambda$ (x)->{
      
if x<0 then { ="<->" } else =str$(x," 00")
}
\\ Here function DispEnemy$ is a closure to function Display_frame (a copy insert in lambda environment)
Display_frame=lambda DispEnemy$ ->{
                  \\ Over with one parameter push a copy of Nth element of stack
                  \\ Second parameter is the repeat value, so Over 4,4 copies 4 elements of stack, at top of stack
                  
Over 4,4
                  \\ Print Over clear line, and make temporary changes: set proportional printing, and one tab whole width
                  \\ $(6), set center justification
                  
Print Over $(6), format$("Player Pos {0}  Enemy Pos {1} Score {2}  frame id {3}", str$(Number,"00"), DispEnemy$(Number), str$(Number,"000"), Number)
                  \\ so now stack is unchanged
                  \\ we need to use Call Disp_Frame(), so we get back the stack
                  \\ this call pass stack to function and get stack from it
}
\\ Here we insert 2 functions as closures to New_Score
New_Score=lambda Display_frame, MyKey (a,b, x, f_id, f_id_out) -> {
      \\ Here we use variables, but we make current stack again as new feed
      \\ We read from stack here but we didn't see the command, but the command exist
      \\ There is a command:
      
rem : Read a,b, x, f_id, f_id_out
      \\ which interpreter insert at definition time using parameter list (a,b, x, f_id, f_id_out)
  
      \\ So now we have to create the new stack "frame"
      \\ Push feed the stack to head so MyKey(a) value is at the top of the stack
      
Push MyKey(a)
      
if b<0 then {
            
b++
            
if b=0 then b=random(1,10) : f_id_out=abs(a-b)*5+2
       }
else.if f_id_out=0 then b=-random(5)-4: f_id_out=1000
   
      
if stackitem(1)=b then {
      \\ Data feed stack to bottom, so 0 is the bottom value
            
Data -random(20)-4, x+1,f_id +1, 0
      }
Else {
            
Data b, x, f_id+1, f_id_out-1
      }
      
Call Display_frame()
}
\\ Also here we insert 2 closures to Game_Loop lambda
Game_Loop=lambda New_Score, Key_Esc ->{
      \\ values in stack:  player_pos, enemy_pos, score_sum, frame_id, frame_id_out
      \\ frame_id is stackitem(4)
      \\  a Call pass stack to New_Score()
      \\ 1000/60   is 1/60 second
      
Every 1000/60 {
            
Call New_Score()
            \\ now stack has new values
            
if stackitem(4)>=1000 or Key_Esc() then exit
      }
      =true
      \\ flag for loop now checked and if is true the a loop happen, but flag is turned to false
}

\\ Here game start. There is one function that hold the game
\\ Setting 22pt letters
Mode 22
Cursor 0,height/2-3
\\ calling a function as right expression we have a new stack
\\ 5 parameters needed: player_pos, enemy_pos, score_sum, frame_id, frame_id_out
\\ If player_pos is enemy_pos we get a point
\\ Report 2 use center justification
Report 2, {Blast Enemy v1.1
      use arrow keys Up or Down
      game end if we press spacebar or at frame id 1000
      }
Profiler
Game=Game_Loop(Random(1,10),Random(1,10),0,1,0)
\\ stack from Game_loop erased, because that happen when we call function in an expression
\\ just a print command to change line
Print
Print Over $(6), format$("Play Time: {0:0} seconds",Timecount/1000)
Print
Print "Done"



Συντακτικό της Μ2000 σε μορφή Πίνακα


Υπάρχει νέα αναθεώρηση 6 η οποία απλά διορθώνει ή προσθέτει λίγα πράγματα.

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

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

Για παράδειγμα το παρακάτω, και ειδικά η πρώτη γραμμή:

Για ι=1 έως 20 {
    Τύπωσε ι
}

Έχουμε ένα Γνωστό Όνομα την Για μετά ακολουθούν ορίσματα τα οποία αναλύονται ως εξής: Όρισμα1 ι=1 που αναλύεται σε ι (εδώ είναι άγνωστο όνομα, θα μπορούσε να ήταν γνωστό όμως, απλά δεν βλέπουμε άλλο κώδικα για να κρίνουμε) και έχει τελεστή το = και ακολουθεί έκφραση, η τιμή 1, μετά έχουμε το έως που είναι γνωστό όνομα και εδώ έχει θέση αντί του κόμμα και μετά έχουμε το άλλο όρισμα2 η έκφραση με τιμή το 20 και τέλος ακολουθεί μπλοκ εντολών.



{
Μπορεί να περιέχει Παραγράφους
}

Μπλοκ κώδικα, που περιέχει παραγράφους. Στο διορθωτή δεν βλέπουμε το μπλοκ όλου του κειμένου, αλλά εννοείται και υπάρχει στο αρχείο που σώνουμε
Μπορεί να περιέχει και άλλα μπλοκ κώδικα.
Παράγραφος Κειμένου
Α$ = {
αυτή είναι μια παράγραφος κειμένου μόνο
}
Παράγραφος ως μέρος αλφαριθμητικού με πολλές παραγράφους. Δείτε ότι χρησιμοποιούνται άγκιστρα εδώ, ενώ δεν είναι Μπλοκ κώδικα.
Παράγραφος ως μέρος της ροής εκτέλεσης
Παράγραφος ως μέρος της ροής εκτέλεσης
Αριθμός, μέχρι 5 ψηφία μπορούν να υπάρχουν 0 στην αρχή, πχ 00001. Προαιρετική χρήση, έχει ρόλο ετικέτας και δεν έχει σχέση με τον σχετικό αριθμό γραμμής, στο διορθωτή.
Αριστερή Έκφραση
Κενό

Προαιρετικά Σημειώσεις



Σημειώσεις

Κενό

Σημειώσεις
\ ή '
Γράφουμε τις σημειώσεις μας σε μια γραμμή
Αριστερή Έκφραση
Γνωστό όνομα
( εδώ λέγεται ότι είναι σε πρώτη θέση)










Προαιρετικά το διαχωριστικό εντολών άνω και κάτω τελεία
:
εκτός ελαχίστων περιπτώσεων που δεν επιτρέπεται δεύτερη εντολή (πρέπει να μπει μπλοκ εντολών)
μπορούν να μπουν όσα θέλουμε
αν υπάρχει διαχωριστικό εντολών τότε προαιρετικά
Αριστερή Έκφραση

Τύπωσε
και η ? λειτουργεί ως τύπωσε σαν αριστερή έκφραση, αλλά δεν δέχεται τις λέξεις Πάνω, Μέρος, Υπό αλλά μόνο τις αγγλικές Over, Part, Under
κενό
#
Πάνω
Μέρος
Υπό
Λίστα Εκφράσεων2
σύμβολο @ προαιρετικό

Αριστερή Έκφραση
(εκτελεί την αρχική εντιλή, και όχι άλλη που έχει ίδιο όνομα και έχουμε φτιάξει)
Άγνωστο όνομα
μπορεί να έχει % στο τέλος
Δημιουργεί Γνωστό όνομα
=

Αριθμητική Παράσταση


Άγνωστο όνομα
που έχει $ στο τέλος
Δημιουργεί Γνωστό όνομα
=

Αλφαριθμητική Παράσταση


Άγνωστο όνομα με παρένθεση ( στο τέλος
Προαιρετικά μπορούν να υπάρχει
Όρισμα ή
ορίσματα

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

Γνωστό όνομα
(σε πρώτη θέση)


προαιρετικά σύμβολα λέγονται μεταλλάκτες όταν αλλάζουν κάτι στη λειτουργία της εντολής ή λέγονται τελεστές όταν αλλάζουν την τιμή της μεταβλητής, ανάλογα το τι είναι το Γνωστό όνομα.
Ορίσματα




Σύμβολο ; (σε ορισμένες μόνο περιπτώσεις αλλιώς βγαίνει λάθος).
Άγνωστο όνομα

Μπορεί να ακολουθεί μπλοκ εντολών


Μπορούν να
ακολουθούν εντολές σχετικές με το μπλοκ εντολών
Κενό
(να μην περιέχει τίποτα από τα δύο παραπάνω)
Γνωστό όνομα
(εκτός πρώτης θέσης)
σύμβολο & προαιρετικό μόνο για ειδικά ονόματα (μεταβλητές/συναρτήσεις)



αναγνωριστικό

Μπορεί να περιλαμβάνονται στο τέλος του αναγνωριστικού ένα από τα %,$, (, %(, $(

Ορίσματα
Όρισμα

προαιρετικό κόμμα

Αν υπάρχει κόμμα τότε
Ορίσματα
'Όρισμα
Έκφραση

σύμβολα
ή γνωστά ονόματα ή άγνωστα ονόματα που σχετίζονται με το Γνωστό Όνομα σε πρώτη θέση

σε περιπτώσεις που το σύμβολο πριν είναι το :=
ακολουθεί έκφραση

ομοίως σε μια εντολή υπάρχει και το σύμβολο = που ορίζει ότι ακολουθεί έκφραση.


? σημαίνει χωρίς όρισμα πάρε την εξ ορισμού τιμή


κενό
σημαίνει χωρίς όρισμα τώρα, πάρε ότι υπάρχει ήδη ορισμένο από πιο πριν.

Έκφραση
σύμβολα προαιρετικά
παράσταση
σύμβολα προαιρετικά
Λίστα Εκφράσεων
Έκφραση
κόμμα
Λίστα Εκφράσεων
Λίστα Εκφράσεων2
Έκφραση
ειδικές συναρτήσεις:
$()
@()
~()
κόμμα
ελληνικό ερωτηματικό
Λίστα Εκφράσεων2
ή
Κενό
Παράσταση
Αριθμητική Παράσταση
δίνει αριθμητικό αποτέλεσμα ή
μπορεί να δώσει αντικείμενο και το 0
Αλφαριθμητική Παράσταση
δίνει αλφαριθμητικό (ή το κενό αλφαριθμητικό) ή αντικείμενο.
Λογική Παράσταση (έχει αποτέλεσμα πάντα αριθμητικό, 0 ή -1)
Αριθμητική Παράσταση
προαιρετικά + ή -
όσα θέλουμε


Παρένθεση ( προαιρετικά
όσες θέλουμε
Αριθμητική ή Λογική παράσταση
ή
Αριθμητική Πράξη
ή
Απλή Αριθμητική Παράσταση

Παρένθεση ) αν έχει ανοιχτεί ήδη παρένθεση


Αριθμητική Πράξη
προαιρετικά + ή -
όσα θέλουμε
Αριθμητική Παράσταση
ή
Απλή Αριθμητική Παράσταση

προαιρετικά

Τελεστής
Πράξης
+ - * / ** ^
υπόλοιπο
υπόλοιπο#
υπολ, υπολ#
διά, δια#
<<
Αν υπάρχει τελεστής πράξης
Αριθμητική Παράσταση
ή
Απλή Αριθμητική Παράσταση
Απλή Αριθμητική Παράσταση
Γνωστό Όνομα
μπορεί να
έχει % στο τέλος του ονόματος
ή να έχει ( ή %(
ή
Αριθμός
ή
Αυτόματος Πίνακας
αν έχουμε το ( στο όνομα τότε μπορεί να ακολουθεί λίστα ορισμάτων
Παρένθεση ) αν έχει ανοιχτεί ήδη παρένθεση

Αλφαριθμητική Παράσταση

Απλή Αλφαριθμητική Παράσταση
ή
Αλφαριθμητική Παράσταση
προαιρετικά
+
αν υπάρχει +
θα πρέπει να υπάρχει
Αλφαριθμητικό
Απλή Αλφαριθμητική Παράσταση
Γνωστό Όνομα που έχει $ στο τέλος του ονόματος
ή έχει $(

αν έχουμε το $( τότε μπορεί να ακολουθεί λίστα ορισμάτων

Παρένθεση ) αν έχει ανοιχτεί ήδη παρένθεση


"Αλφαριθμητικό"
κενό αλφαριθμητικό ""
Μπλοκ Παραγράφου { }
Λογική Παράσταση
Παρένθεση ( προαιρετικά




Τελεστής
Όχι ή Δεν

Απλή Λογική Παράσταση
Ή
Λογική Παράσταση
Παρένθεση ) αν έχει ανοιχτεί ήδη παρένθεση

Απλή Λογική Παράσταση
Συνθήκη
ή
Αριθμητική Παράσταση
Τελεστές
Και Ή Από
(And Or Xor)

Συνθήκη
ή
Αριθμητική Παράσταση
Συνθήκη
Αριθμητική Παράσταση
Τελεστές
> < = <= >= <>
==
Αριθμητική Παράσταση
Αλφαριθμητική Παράσταση


Τελεστές
> < = <= >= <>
~
Αλφαριθμητική Παράσταση
Αυτόματος Πίνακας

παρένθεση (



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


Παρασκευή 26 Μαΐου 2017

Παράδειγμα με διαμόρφωση τμημάτων (decoration)

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

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

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

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

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

Ουσιαστικά σωρός τιμών είναι ένα ρεύμα εισόδου/εξόδου, ως μια στοίβα, από την οποία διαβάζουμε και στην οποία βάζουμε τιμές (με την Βάλε στην κορυφή της, ενώ με την Σειρά βάζουμε στο τέλος της, ή στο πυθμένα)
Το Βάλε 5, 3 θα βάλει τελικά το 3 στην κορυφή και το 5 ένα κάτω από την κορυφή.
Το Σειρά 4,2 θα βάλει το 2 στο τέλος και το 4 ένα από το τέλος (ή πυθμένα της στοίβας, ή σωρού τιμών όπως την λέμε στη Μ2000).

Ο σωρός τιμών έχει ενδιαφέροντα χαρακτηριστικά, μπορεί να πάρει αριθμούς, αλφαριθμητικά, αντικείμενα, και στα αντικείμενα μπορεί να είναι αντικείμενα σωροί επίσης. Μια απλούστευση της ιδέας του σωρού είναι ότι έχουμε μια γραμμική διάταξη στοιχείων με δυνατότητα μετακίνησης χωρίς κόστος. Βάζουμε και βγάζουμε με μεγάλη ευκολία! Εδώ δεν μας ενδιαφέρουν άλλα χαρακτηριστικά και δεν θα δούμε άλλα. Αυτό που μας ενδιαφέρει είναι ότι εντολές για το σωρό εκτελούνται σε αυτό που λέμε τρέχον σωρός τιμών. Η Μέγεθος.Σωρού μας λέει πόσα στοιχεία έχει ο σωρός (ένας πίνακας εγγράφεται στο σωρό ως ένα στοιχείο, ενώ μπορεί να έχει χιλιάδες), δηλαδή πόσα είναι διατεταγμένα σε αυτόν. Η εντολή Πέτα χωρίς όρισμα είναι ισοδύναμη με την Πέτα 1, και θα πετάξει την κορυφή και το αμέσως επόμενο θα γίνει η νέα κορυφή. Αν δεν υπάρχει όμως στοιχείο να πετάξει θα βγάλει λάθος. Η Πέτα 0 δεν βγάζει λάθος. Μπορεί να φαίνεται άχρηστο αλλά στη θέση του 0 μπορούμε να έχουμε αριθμητική παράσταση, και να προκύπτει πότε 0 ή πότε κάτι άλλο.

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

Όταν καλούμε ένα τμήμα έστω εδώ την Εμφάνιση με ορίσματα έστω το 5 και το 7 τότε ο διερμηνευτής βάζει αυτά σε ένα σωρό πρόσκαιρο, με την εντολή Σειρά, δηλαδή το 7 θα είναι τελευταίο και μετά κάνει ένωση σωρών, βάζοντας τον πρόσκαιρο στη κορυφή του τρέχοντος σωρού. Έτσι το 5 θα είναι στη κορυφή, μετά το 7 και μετά ότι ήδη υπήρχε στο σωρό.

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

Μετά φτιάχνουμε την ΝέαΕμφάνιση όπου εκεί βάζουμε και ένα στάδιο ακόμα, την προσαρμογή. Έχουμε μια Εμφάνισε εσωτερική που απευθείας δίνει τις παύλες όσο το μήκος στήλης εκτύπωσης στην οθόνη μας. Η Στήλη μας λέει πόσους χαρακτήρες έχει η στήλη. Αυτές καθορίζονται αυτόματα με την Φόρμα Χ, Υ αλλά μπορούμε να την αλλάξουμε, γιατί υπάρχει ως δεύτερη παράμετρος σε μια $(), μια εσωτερική συνάρτηση της Τύπωσε.

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

Οι εικόνες είναι από linux με Wine. Αναφέρει ο διερμηνευτής ότι είναι Windows 7 επειδή αυτό δείχνει το Wine, και ορθώς αναφέρει ότι είναι 64bit το λειτουργικό γιατί 64bit είναι το Linux  στον υπολογιστή δοκιμής!
(ο χρωματισμός στον διορθωτή διαφέρει ανάλογα με το αν έχουμε σκούρο ή φωτεινό φόντο. Στην εξαγωγή σε Html (με απλή αντιγραφή στο πρόχειρο το κάνει) χρησιμοποιεί τον χρωματισμό που έχει οριστεί στις Ρυθμίσεις - υπάρχει τέτοια εντολή). Σε Linux την εξαγωγή σε html την διαβάζει το Libreoffice και το χρησιμοποιούμε ως ενδιάμεσο για να το ξανά αντιγράψουμε και μετά να το επικολλήσουμε στο Blogger εδώ, ενώ σε Windows δεν θέλουμε ενδιάμεσο.

Ο διορθωτής φαίνεται περιορισμένος στο κάτω τμήμα (ολίσθησης). Αν δώσουμε Οθόνη , 0 τότε η ολίσθηση θα πιάσει όλη την οθόνη και θα ανοίξει το παράθυρο του διορθωτή σε όλη την οθόνη (δεν γράφει πάνω στην οθόνη, αλλά σε δικό του χώρο, οπότε με Esc γυρνάμε στη κονσόλα και βλέπουμε ότι είχε). Με Οθόνη , -10 δηλαδή με αρνητικό το δεύτερο νούμερο λέμε να έχουμε ολίσθηση στις δέκα τελευταίες γραμμές, άρα δίνουμε δέκα γραμμές στον διορθωτή μαζί με την επικεφαλίδα (το πρώτο δεν το δίνουμε εδώ και είναι το χρώμα φόντου)
Με Ctrl +C  καθαρίζουμε την κονσόλα (είναι ίδιο με το CLS ή Οθόνη)





Τμήμα Εμφάνιση {
      Γενική Κ=Αληθές
      Τμήμα τρόπος {
            Αν Μέγεθος.Σωρού>=2 Τότε Πέτα 2
            Κ<=Ψευδές
      }
      τρόπος
      \\ το $(4)  βάζει αναλογική γραφή. το $(0) επαναφέρει σε μη αναλογική
      Αν Κ Τότε {
            Τύπωσε $("0.00"), $(4), Αριθμός
            Τύπωσε $(""),$(0),
      } Αλλιώς {
            Τύπωσε Επαν$("-", Στήλη)
      }
}
Εμφάνιση 10,2
Τμήμα Διαίρεση (χ,υ) {
      αν υ==0 Τότε Βάλε 0 : έξοδος
      Βάλε χ/υ
}
Τμήμα Γινόμενο (χ,υ) {
      Βάλε χ*υ
}
Τμήμα Διαφορά (χ, υ) {
      Βάλε χ-υ
}
Τμήμα Σούμα (χ,υ) {
      Βάλε χ+υ
}
Εμφάνιση 5, 7 ; τρόπος ως διαίρεση
Εμφάνιση 5, 7 ; τρόπος ως γινόμενο
Εμφάνιση 5, 7 ; τρόπος ως διαφορά
Εμφάνιση 5, 7 ; τρόπος ως σούμα
Τμήμα ΑριθμοίΩςΧαρακτήρες {
      Διάβασε α$, β$
      Βάλε Τιμή(β$),Τιμή(α$)
}
Τμήμα ΝέαΕμφάνιση {
      Τμήμα Προσαρμογή {}
      Τμήμα Εμφάνιση {
            Τύπωσε Επαν$("-", Στήλη)
      }
      Προσαρμογή
      Εμφάνιση ; τρόπος
}
ΝέαΕμφάνιση "5", "7" ; Εμφάνιση, τρόπος ως σούμα, προσαρμογή ως ΑριθμοίΩςΧαρακτήρες
ΝέαΕμφάνιση 5, 7 ; Εμφάνιση, τρόπος ως γινόμενο
Τμήμα ΕμφάνισηΩςΧαρακτήρες {
      Γενική Κ=Αληθές
      Τμήμα τρόπος {
            Αν Μέγεθος.Σωρού>=2 Τότε Πέτα 2
            Κ<=Ψευδές
      }
      τρόπος
      Αν Κ Τότε {
            Τύπωσε $(4),Γραφη$(Αριθμός, "0.00")
            Τύπωσε $(0),
      } Αλλιώς {
            Τύπωσε Επαν$("-", Στήλη)
      }
}
ΝέαΕμφάνιση 5, 7 ; Εμφάνιση ως ΕμφάνισηΩςΧαρακτήρες, τρόπος ως διαίρεση
Τμήμα Ακέραιοι {
      Διάβασε χ, υ
      Βάλε Ακ(υ), Ακ(χ)
}
Τμήμα ΑκέραιοιΜεΣτρογγυλοποίηση {
      Διάβασε χ, υ
      Βάλε Στρογγ(υ,0), Στρογγ(χ,0)
}
ΝέαΕμφάνιση 5.5, 7.8 ; Εμφάνιση, τρόπος ως σούμα, προσαρμογή ως ακέραιοι
ΝέαΕμφάνιση 5.5, 7.8 ; Εμφάνιση, τρόπος ως σούμα, προσαρμογή ως ΑκέραιοιΜεΣτρογγυλοποίηση
ΝέαΕμφάνιση 5.5, 7.8 ; Εμφάνιση, τρόπος ως σούμα
Τμήμα ΕμφάνισηΜεΜονάδες {
      Γενική Κ=Αληθές
      Τμήμα τρόπος {
            Αν Μέγεθος.Σωρού>=2 Τότε Πέτα 2
            Κ<=Ψευδές
      }
      τρόπος
      Αν Κ Τότε {
            Τύπωσε $(7),Γραφη$(Αριθμός, "0.00 ")+Γράμμα$
            Τύπωσε $(0),
      } Αλλιώς {
            Τύπωσε Επαν$("-", Στήλη)
      }
}
ΝέαΕμφάνιση
ΝέαΕμφάνιση 5,7, "Km" ; Εμφάνιση ως ΕμφάνισηΜεΜονάδες, τρόπος ως γινόμενο
ΝέαΕμφάνιση 5,7, "Km" ; Εμφάνιση ως ΕμφάνισηΜεΜονάδες, τρόπος ως σούμα
ΝέαΕμφάνιση