Hobby Basic, ένας μικρός διερμηνευτής για την κονσόλα των Windows

Ανακάλυψα και διόρθωσα ένα bug που αφορούσε τα standalone .exe αρχεία που εξάγει η HB. Νέα έκδοση η 1.1.3.

Ήθελα να δοκιμάσω την εντολή sound οπότε και ξεκίνησα να γράφω κάτι -αφηρημένο αρχικά- που εξελίχτηκε σε Breakout για την κονσόλα. Το παράτησα όμως όταν μου τελείωσε ο καφές. Το ποστάρω γιατί παίζει ωραία. Μπορεί άλλη στιγμή να το συνεχίσω με score, levels, κ.τ.λ.

Το BREAKOUT.zip περιέχει τo standalone για Windows.
Tο SNAKE.zip με το standalone Φιδάκι από προηγούμενο post.

Αν θελήσετε να μεταγλωττίσετε τo BREAKOUT.BAS θα χρειαστεί το FX.zip με τους ήχους του παιχνιδιού.

CONSOLE_BREAKOUT.png
 

Συνημμένα

  • FX.zip
    176,4 KB · Προβολές: 7
  • BREAKOUT.zip
    199,4 KB · Προβολές: 6
  • SNAKE.zip
    23,4 KB · Προβολές: 7
Τελευταία επεξεργασία:
Σήμερα ενώ διάβαζα κάποιες πληροφορίες για τον C64 στο C64 Wiki, είδα αυτήν την εικόνα.

300px-c64_16farben.png

Σκέφτηκα να την αναπαράγω χρωματικά στην κονσόλα των Windows 7 με την Hobby Basic. Μεγάλωσα λίγο την γραμματοσειρά, για να δούμε...

Κώδικας:
    title 'CBM 64'

    dim temp[16]

    dim msg$[4]=\
        'DIE 16 FARBEN DES COMMODORE 64',\
        '**** COMMODORE 64 BASIC V2 ****',\
        '64K RAM SYSTEM  38911 BASIC BYTES FREE',\
        'READY.'

    dim cbm[16]=\
        0x000000,0xFFFFFF,0x404A92,0xCCC584,0xB65193,0x4BB172,0xAA3A48,0x7CDFD5,\
        0x2D6999,0x005267,0x7881C1,0x606060,0x8A8A8A,0x91ECB3,0xDE7A86,0xB3B3B3

    color -1,-1
    push V0,V1

    for i=0 to 15
        rgbc i,-1
        temp[i]=V0
        rgbc i,cbm[i]
    next

    screen 48,31
    cursor 0,0
    cls

    color 14,14
    cls

    color 6,14
    paint 4,3,40,25,-1,1

    at 8,4,msg$[1]
    at 5,6,msg$[2]
    at 4,8,msg$[3]

    for i=0 to 15
        pen i
        erase 4,9+i,40,'█',1
    next

    pen 14

    at 9,26,msg$[0]

    inkey

    for i=0 to 15
        rgbc i,temp[i]
    next

    pop V1,V0
    color V0,V1

    cls : end

CBM.png

tada! :fafoutis:
 
Τελευταία επεξεργασία:
Hobby Basic 1.1.4

Μετά το update αυτό στον φάκελο EXAMPLES βρίσκονται (εκτός τα παραδείγματα) και οι υποφάκελοι ART, DATA, και FX. Όλα τα συνοδευτικά παραδείγματα ανανεώθηκαν.

Προηγούμενη μορφή

Τωρινή μορφή
EXAMPLES\DATA\
EXAMPLES\ART\
EXAMPLES\FX\

Παράδειγμα της εντολής SOUND.
Κώδικας:
    SFX1=700
    path$='EXAMPLES\FX\SFX1.WAV'
    sound path$,SFX1          ! load sound
    sound SFX1                ! play sound
    inkey


Προστέθηκε μια νέα εντολή η Select...Case. Ήταν κάτι που έλειπε από την Hobby Basic και ήθελα να την ενσωματώσω αλλά δεν έβρισκα χρόνο. Για την ώρα βρίσκεται σε δοκιμαστικό στάδιο. Παρακάτω μερικά παραδείγματα.

Στην απλούστερη της μορφή.
Κώδικας:
    x = 1
    select x
    case 1:
        ? "Choice is 1"
    case 2:
        ? "Choice is 2"
    case 3:
        ? "Choice is 3"
    case :
        ? "Choice is other than 1,2, or 3"
    endsel

Περισσότερες από μία επιλογές σε ένα case διαχωρίζονται με κόμμα.
Κώδικας:
    x = 5
    select x
    case 1,2,3:
        ? "Choice is 1 or 2 or 3"
    case 4,5,6:
        ? "Choice is 4 or 5 or 6"
    case :
        ? "Choice is other than 1,2,3,4,5 or 6"
    endsel

Συμβολοσειρές (strings) υποστηρίζονται όπως και nested select-case.
Κώδικας:
    input "Enter user id: ",user_id
    select user_id
    case 500:
        input "Enter password: ",user_pwd$
        select user_pwd$
        case "letmein":
            ? "Welcome user ",user_id
        case :
            ? "Unknown password"
        endsel
    case :
        ? "Unknown user id"
    endsel


Ένας εύκολος τρόπος για να τρέξετε τα παραδείγματα.
Αντί της γραμμής εντολών, κατεβάστε το LOADER.BAS και ρίξτε το (drag'n'drop) πάνω στο HB.EXE
Μου άρεσε σαν ιδέα και θα το βελτιώσω περισσότερο.

HOBBY_BASIC_LOADER.png
 
Hobby Basic 1.1.5

Η έκδοση αυτή περιλαμβάνει κάποιες διορθώσεις και βελτιώσεις στον διερμηνευτή. Όλα τα παραδείγματα έτρεξαν με επιτυχία από την γραμμή εντολών των Windows XP, 7, 8, και 10.

Το zip μεγάλωσε λίγο σε μέγεθος και τώρα είναι περίπου 64kb. Περιλαμβάνει προγράμματα που έχουν παρουσιαστεί σε προηγούμενα ποστ. Το αρχείο LOADER.BAS μετονομάστηκε σε TEST.BAS και πλέον περιλαμβάνεται στο zip.

Σημειώστε πως, στις νεώτερες εκδόσεις των Windows θα χρειαστεί να απενεργοποιήστε την προστασία σε πραγματικό χρόνο του Microsoft Defender. Γενικά τα Antivirus δεν συμπαθούν τόσο λιτά εκτελέσιμα και συχνά τα θεωρούν (λανθασμένα) ύποπτα.
 
Τελευταία επεξεργασία:
Κάποια μικρά προγράμματα που κάθονται στον σκληρό μου δίσκο.

Background scrolling 4 κατευθύνσεων με ANSI γραφικά και κίνηση με τα βελάκια του πληκτρολογίου στο παράθυρο της γραμμής εντολών των Windows.

Δανείζομαι την εικόνα goo-metamorphose, θα δουλέψω στην μισή.


Κατέβασμα του αρχείο από δικό μου host.
Κώδικας:
    url$ = 'https://sites.google.com/site/hobbybasicfiles/download/'
    goo$ = 'goo-metamorphose.ans'

    if SIZE(goo$) = -1
        ? 'Downloading...'
        url$ = url$ + goo$
        load url$,1
        if V0 = -1 then alert 0x10,'url error',url$ : end
    endif

Κρύψε το παράθυρο.
Κώδικας:
    view 0

Φόρτωμα του φόντου σε παράθυρο 80 x 30, με 1200 screen buffer.
Κώδικας:
    title '4-Way Background Scrolling'

    screen 80,30,1200
    cursor 0,0
    color 0,0
    cls

    ansi goo$

Υπάρχει ένας εσωτερικός περιορισμός στις Win32 συναρτήσεις κονσόλας όσο αφορά τον χειρισμό τμημάτων μεγαλύτερων από 64 kb, κάτι που ανακάλυψα στην πορεία. Προσπερνάω τον περιορισμό μεταφέροντας την οθόνη τμηματικά στην διάταξη map.
Κώδικας:
    dim map[80,500]
    dim tmp[80,125]

    for n = 0 to 499 step 125

        set tmp[],0
        grab 0,n,80,125,tmp[],0

        for x = 0 to 79
            for y = 0 to 124
                map[x,y+n] = tmp[x,y]
            next
        next

    next

Άλλαξε διάσταση σε 80 x 30.
Κώδικας:
    screen 80,30
    color 0,0
    cls

Εμφάνισε το παράθυρο.
Κώδικας:
    view 1

Ο βρόγχος του προγράμματος. Esc για έξοδο.
Κώδικας:
    x = 0
    y = 300

main#

    if KEY(37)
        x = x - 1
    elseif KEY(39)
        x = x + 1
    elseif KEY(38)
        if y > 8 then y = y - 1
    elseif KEY(40)
        if y < 450 then y = y + 1
    elseif KEY(27)
        end
    endif

    grab x,y,80,30,map[],0,0

    wait 12000
    goto main

4-way_background_scrolling_console_window-png.png

Η εικόνα μετακινείται σε 4 κατευθύνσεις με τα βελάκια πληκτρολογίου.

Ολόκληρος ο κώδικας.

4-WAY.BAS
 
Τελευταία επεξεργασία:
Τώρα θα ζορίσω λίγο παραπάνω την Hobby Basic.

Vertical background scrolling και πάνω του ένα διαστημόπλοιο. ANSI γραφικά και κίνηση με τα βελάκια του πληκτρολογίου στο παράθυρο της γραμμής εντολών των Windows.


Φορτώνω από δικό μου host τo φόντο που χρησιμοποίησα και πριν, συν το διαστημόπλοιο.
Κώδικας:
    url$ = 'https://sites.google.com/site/hobbybasicfiles/download/'

    goo$ = 'goo-metamorphose.ans'
    ship$ = 'ship.ans'

    url1$ = url$ + goo$
    url2$ = url$ + ship$

    if SIZE(goo$) = -1
        ? 'Downloading ',goo$
        load url1$,1
        if V0 = -1 then alert 0x10,'url error',url1$ : end
    endif

    if SIZE(ship$) = -1
        ? 'Downloading ',ship$
        load url2$,1
        if V0 = -1 then alert 0x10,'url error',url2$ : end
    endif

Μια επιπλέον διάταξη για το διαστημόπλοιο, ο υπόλοιπος κώδικας δεν αλλάζει.
Κώδικας:
    view 0

    title 'Vertical Scrolling Arcade'

    screen 80,30,1500
    cursor 0,0
    color 0,0
    cls

    dim ship[11,7]

    ansi ship$
    grab 0,0,11,7,ship[],0
    cls

    ansi goo$

    dim map[80,500]
    dim tmp[80,125]

    for n = 0 to 499 step 125

        set tmp[],0
        grab 0,n,80,125,tmp[],0

        for x = 0 to 79
            for y = 0 to 124
                map[x,y+n] = tmp[x,y]
            next
        next

    next

    screen 80,30
    color 0,0
    cls

    view 1

Η κάθετη κίνηση του φόντου χρονίζετε ξεχωριστά από την κίνηση του διαστημοπλοίου.
Κώδικας:
    x = 35
    y = 20
    n = 300
    delay = 120

    time fix TICK(1)
    prev = time


main#

    if KEY(37) and x > 0
        x = x - 1
    elseif KEY(39) and x < 70
        x = x + 1
    elseif KEY(38) and y > 0
        y = y - 1
    elseif KEY(40) and y < 24
        y = y + 1
    elseif KEY(27)
        end
    endif

    now = time

    if now > (prev + delay)
        prev = now
        n = n - 1 : if n < 0 then n = 450
    endif

    grab 0,n,80,40,map[],0,0
    grab x,y,11,7,ship[],2

    wait 12000
    goto main

vertical_scrolling_arcade_console_window-png.png

Το φόντο κινείται κάθετα ενώ το διαστημόπλοιο μετακινείται σε 4 κατευθύνσεις με τα βελάκια πληκτρολογίου.

Ολόκληρος ο κώδικας.

ARCADE.BAS
 
Τελευταία επεξεργασία:
Hobby-Basic.png

Hobby Basic 1.1.7

Εν τάχει, οι αλλαγές στην έκδοση έχουν ως εξής:
  • Περίπου 1 kb μικρότερο μέγεθος στο εκτελέσιμο.
  • Επαναφορά της εντολής wait σε milliseconds. Η μέτρηση χρόνου σε microseconds εγκαταλείφθηκε.
  • Η συνάρτηση SPC() αφαιρέθηκε εφόσον υπάρχει πλέον η πιο ευέλικτη συνάρτηση GEN().
  • Βελτιωμένα μηνύματα λάθους. Ένα σημείο που έχω αμελήσει και πάσχει η HB. θέλει ακόμα δουλειά.
  • Μικρές εσωτερικές αλλαγές έκαναν τον διερμηνευτή κάποια ms συνολικά ταχύτερο στις μετρήσεις μου.
  • Minor bug fixes. Ο διερμηνευτής δουλεύει σταθερά στα Windows XP, 7 και 10.
  • Περιλαμβάνει όλα τα προγράμματα που έχουν παρουσιαστεί σε προηγούμενα ποστ.
Η Hobby Basic παρόλο που αναπτύσσεται σε γλώσσα assembly είναι ένας σχετικά αργός διερμηνευτής. Πρόσφατα ξεκίνησα μια διαδικασία optimization που όμως απαιτεί χρόνο, ίσως να διαρκέσει αρκετούς μήνες. To optimization αφορά τόσο το μέγεθος, (γίνεται προσπάθεια να παραμείνει ο διερμηνευτής γύρω στα 50 kb) αλλά κυρίως την ταχύτητα εκτέλεσης των προγραμμάτων. O προγραμματισμός σε assembly είναι μια συνεχής διαδικασία βελτιστοποίησης του κώδικα ακόμα και στα μικρότερα μέρη του. Για να δώσω μια εικόνα, μπορείς να περάσεις ένα ΣΚ προσπαθώντας να βελτιστοποιήσεις (δοκιμάζοντας και χρονομετρώντας) μια διαδικασία λίγων δεκάδων asm γραμμών κώδικα, φανταστείτε ένα project χιλιάδων asm γραμμών.

Πιθανόν κάποια επερχόμενα updates να γίνουν σιωπηλά όπως έγινε και με την προηγούμενη έκδοση 1.1.6.
Stay tuned!
 
Θα μπορούσες να ενσωματώσεις έναν απλό editor;
 
Το έχω σκεφτεί και μου αρέσει σαν ιδέα. Είχα μάλιστα ξεκινήσει να προσαρμόζω έναν απλό third party editor για αυτή τη δουλειά. Το άφησα στην άκρη για να προχωρήσω και άλλο την HB, ίσως αργότερα να το ξαναδώ.
 
Προσωπικά, με αποθαρρύνει από το να ασχοληθώ η έλλειψη editor.
 
Tο καταλαβαίνω αυτό αλλά μην σε αποθαρρύνει. Μπορείς εναλλακτικά να ρυθμίσεις έναν σύγχρονο editor για να μεταγλωττίζεις ή να εκτελείς scirpts. Σκέψου πως, ένα πρόγραμμα που γράφω στην Hobby Basic το εκτελώ μέσα από το Notepad++ πατώντας ένα function key, χωρίς να εμπλέκεται η γραμμή εντολών.
 
Τελευταία επεξεργασία:
Χμμμ... Θα το ψάξω. Ευχαριστώ!
 
Hobby Basic Version 1.2.0

Η έκδοση αυτή περιλαμβάνει κάποιες διορθώσεις και βελτιώσεις στον διερμηνευτή αλλά και μικρές αλλαγές στο συντακτικό ορισμένων εντολών. Όλα τα παραδείγματα έτρεξαν με επιτυχία από την γραμμή εντολών των Windows XP, 7, 8, και 10.

Tα συνοδευτικά παραδείγματα ανανεώθηκαν και προσαρμόστηκαν στην έκδοση 1.2.0. Το ίδιο και το αρχείο βοήθειας README.txt

Η προηγούμενη μορφή της εντολή Trim(string) αφαιρούσε τους χαρακτήρες whitespace και νέας γραμμής (0x9,0x20,0xA,0xD) ταυτόχρονα αριστερά και δεξιά σε ένα string δίχως όμως την δυνατότητα επιλογής πλευράς. Η νέα σύνταξη της εντολής είναι Trim(n,string). Οι τιμές που παίρνει η μεταβλητή n είναι 0, 1 και 2, για TrimLR, TrimL και TrimR αντίστοιχα.

Η Enum είναι μια νέα εντολή της Hobby Basic. Χρησιμοποιείται για την ανάθεση ονομάτων σε σταθερές. Για παράδειγμα, μπορούμε να ορίσουμε τις μεταβλητές Working και Failed με τον συνηθισμένο τρόπο.
Κώδικας:
    Working =  0
    Failed = 1
    Freezed = 2
    currState = Working

Αλλά και με την enum όπως παρακάτω.
Κώδικας:
    enum 'State', Working, Failed, Freezed
    currState = State.Working

Οι τιμές των μεταβλητών ξεκινάνε από το 0 εκτός αν ορίσουμε διαφορετικά.
Κώδικας:
    enum 'week', Mon=1, Tue, Wed, Thur, Fri, Sat, Sun
    print week.Wed


Σημείωση για χρήστες των Windows 10.

Σε νεότερες εκδόσεις των Windows ίσως χρειαστεί να απενεργοποιήσετε προσωρινά την προστασία σε πραγματικό χρόνο του Microsoft Defender. Τα προγράμματα προστασίας από ιούς δεν συμπαθούν τα μικρά εκτελέσιμα αρχεία της assembly και τα θεωρούν (εσφαλμένα) ύποπτα. Επιπλέον, αν η Hobby Basic δεν λειτουργεί σωστά στην κονσόλα των Windows 10, δοκιμάστε να ενεργοποιήστε την επιλογή legacy για μέγιστη συμβατότητα. Η προτεινόμενη γραμματοσειρά είναι raster με μέγεθος 8x12.


Hobby Basic Video.

Ένα video που παρουσιάζει κάποια από τα παραδείγματα της Hobby Basic να τρέχουν στην κονσόλα των Windows 7. Μην ξεχνάτε πως πρόκειται για text interpreter και ότι βλέπετε είναι χαρακτήρες κειμένου στην κονσόλα και ANSI γραφικά.



Download Hobby Basic Version 1.2.0
 
Δεν είναι και πολύ καλή η ανάλυση του video, συγχωρέστε με πρώτη φορά έφτιαξα και ανέβασα video στο youtube.
 
@Blue Max , το επόμενο σε 4K HDR :) . Εντάξει είναι, τη δουλειά του την κάνει, το μήνυμα περνάει.
 
Η Hobby Basic έχει μεγαλώσει τόσο, ώστε τα προγράμματα που γράφω ή σκέφτομαι να γράψω με αυτήν, απαιτούν πλέον κάποιο πλάνο, λίγο-πολύ όπως θα έκανα με μια κανονική γλώσσα προγραμματισμού.

To update αφορά το πρόγραμμα Text Draw που αναβαθμίστηκε (έκδοση 0.5) μετά από καιρό.
Τώρα δουλεύει πιο σταθερά (ειδικά στα Windows 7) και προστέθηκαν ορισμένα νέα χαρακτηριστικά.

Το Text Draw είναι ένα μίνιμαλ σχεδιαστικό πρόγραμμα χαρακτήρων κειμένου για την κονσόλα των Windows, γραμμένο εξολοκλήρου στην Hobby Basic (HB). Μπορεί να φορτώσει ANSI γραφικά, να τα επεξεργαστεί και να τα σώσει σε μορφή .HB ώστε να χρησιμοποιηθούν αργότερα ως γραφικά. Το Text Draw συμπεριλαμβάνεται στα παραδείγματα.

Θα σας δείξω τι μπορεί να κάνει.
Φορτώνω ένα αρχείο κειμένου σε κωδικοποίηση ANSI.

1625178500772.png


Μπορούμε να βάψουμε με το σετ χαρακτήρων.
Να αλλάξουμε τα χρώματα της εικόνας, να την περιστρέψουμε, να την κόψουμε σε κομμάτια.
Να κάνουμε αντίγραφα των κομματιών, και να εισάγουμε μια νέα εικόνα.
Να ανοίξουμε μεγάλου μήκους στατικές ANSI εικόνες μεταφέροντας μέρη από το ένα frame στο άλλο.
To Text Draw μετατρέπει μια ANSI εικόνα σε μορφή .HB (πάντα την οθόνη που βλέπουμε) και σώνει 2 αρχεία. Ένα στην διάσταση 80x50 και ένα μικρότερο στην διάσταση 80x25 (το κλασικό μέγεθος των παλιών ANSI αρχείων).

1625179256140.png


Με την HB και το Text Draw θα φτιάξουμε ένα animation στην κονσόλα σε ελάχιστο χρόνο.
Πατάμε F10 και κάνουμε export ένα loader script που θα φορτώσει την .HB εικόνα.

1625179535198.png


Ανοίγω το αρχείο και προσθέτω λίγες γραμμές ανάμεσα grab και inkey, και το τρέχω.
Κώδικας:
    do
        copy 0,2,80,13
        move 1,2,79,13,0,2
        paste 79,2
        wait 30
    until KEY(27)

Δεν φαίνεται, όμως η πάνω σειρά με τα ρομποτάκια σκρολάρει συνεχώς αριστερά στο παράθυρο της κονσόλας.

1625179427748.png


Bugs και μικρά προβληματάκια υπάρχουν.

Download Hobby Basic Version 1.2.0

YouTube Video

Δείτε τις σημειώσεις για χρήστες των Windows 10.
 
Τελευταία επεξεργασία:
127105-d82881c1e1e34a57bcd4397668e1a7ad.png

Hobby Basic 1.2.3

Ένα νέο update στον διερμηνευτή.
Oι μικρές εσωτερικές αλλαγές αυξάνουν την σταθερότητα σε Windows 10. Η Hobby Basic τρέχει πλέον καλύτερα σε νεώτερες εκδόσεις των Windows, αλλά παραμένει το ίδιο λειτουργική στα XP.

Οι προσθήκες της έκδοσης αφορούν την εντολή SET και μια νέα συνάρτηση την MATCH(arg,arg_list,...)

Η εντολή SET εκτελεί μια σειρά από λειτουργίες πάνω σε διατάξεις.
Κώδικας:
    !    set a[],b[]                   ! copy array b to a
    !    set a[],0                     ! zero array
    !    set a[],1                     ! shuffle array
    !    set a[],2                     ! sort int array (ascending)
    !    set a[],3                     ! sort int array (descending)
    !    set a[],4                     ! reverse array
    !    set a[],5:x                   ! set array to consecutive,
                                       ! values starting from x

Παραδείγματα.
Κώδικας:
    dim a[10]=0,1,2,3,4,5,6,7,8,9

Κώδικας:
    set a[],1                        ! shuffle array
    for n=0 to 9
        ? a[n],' ',
    next
Output: 9 1 7 0 4 3 6 8 5 2

Κώδικας:
    set a[],3                        ! sort int array (descending)
    for n=0 to 9
        ? a[n],' ',
    next
Output: 9 8 7 6 5 4 3 2 1 0

Κώδικας:
    set a[],5 : -5                    ! set array to consecutive values
    for n=0 to 9
        ? a[n],' ',
    next
Output: -5 -4 -3 -2 -1 0 1 2 3 4


Προστέθηκε μία επιπλέον λειτουργία στην SET που αφορά μεταβλητές αλλά και συμβολοσειρές (strings). Ένας νέος τρόπος να δώσουμε σε πολλές μεταβλητές την ίδια τιμή ταυτόχρονα.
Κώδικας:
    ! sets a,b,c,d to 1024
    set 1024,a,b,c,d
Κώδικας:
    ! sets the string parameters to 'some text'
    set 'some text',a$,b$,c$,d$

Η συνάρτηση MATCH(arg,arg_list,...) συγκρίνει μια μεταβλητή ή συμβολοσειρά, με πολλές μεταβλητές ή συμβολοσειρές ταυτόχρονα. Συγκρίνει την πρώτη παράμετρο με όσες ακολουθούν.
Κώδικας:
    myvar=10
    x=11
    y=12

    if MATCH(myvar,13,x,y)=0 then ? 'not found'

Κώδικας:
    mytext$='abcde'
    b$='abc'
    c$='ab'

    if LEN(MATCH(mytext$,'abcd',b$,c$))=0 then ? 'not found'


Το πρόγραμμα TEST.BAS βελτιώθηκε. Είναι ο απλούστερος τρόπος να τρέξετε τα παραδείγματα της Hobby Basic κάνοντας drag and drop το αρχείο πάνω στο εκτελέσιμο του διερμηνευτή HB.EXE.

HOBBY_BASIC_TEST.png

Download Hobby Basic Version 1.2.3
 
Τελευταία επεξεργασία:
Hobby-Basic-Logo.png

Hobby Basic 1.2.4

Ένα νέο update στον διερμηνευτή.

Η Hobby Basic μπορεί πλέον να καλέσει μια υπορουτίνα (η συνάρτηση αν προτιμάτε) με κλήση δια αναφοράς (call by reference). Η προσθήκη αυτή δίνει την δυνατότητα συγγραφής πιο advanced αλγόριθμων και προγραμμάτων. Μέχρι τώρα η δυνατότητα που υπήρχε ήταν μόνο κλήση δια τιμής (call by value). Όσοι έχουν ασχοληθεί με προγραμματισμό γνωρίζουν την διαφορά αυτή. Εν συντομία, στο κάλεσμα δια τιμής περνάει ως όρισμα η τιμή της μεταβλητής, ενώ στο κάλεσμα δια αναφοράς περνάει η διεύθυνση. Αυτό έχει ως αποτέλεσμα οι αλλαγές που πραγματοποιούνται στην μεταβλητή μέσα στην συνάρτηση να μεταβάλλουν την μεταβλητή έξω από την συνάρτηση.

Για την κλήση με αναφορά χρησιμοποιούμε την οδηγία 'byref' πριν από το όρισμα στην κλήση μιας συνάρτησης.

Κλήση δια τιμής και δια αναφοράς.
Κώδικας:
    sub foo(var,string$,array[])

    ends

    foo(x,a$,a[])                       ! by value
    foo(byref x, byref a$, byref a[])   ! by reference

Παράδειγμα κλήσης δια αναφοράς.
Κώδικας:
    a = 100
    b = 200

    print "Before swap, value of a: ",a
    print "Before swap, value of b: ",b

    swap(byref a, byref b)

    print "After swap, value of a: ",a
    print "After swap, value of b: ",b
    end

    sub swap(x,y)

        local temp

        temp = x
        x = y
        y = temp

    ends
Output:
Before swap, value of a: 100
Before swap, value of b: 200
After swap, value of a: 200

After swap, value of b: 100


Όπως συνήθως μικρά ή μεγάλα bug-fix στον κώδικα, και κάποια νέα παραδείγματα προστέθηκαν.

Hobby-Basic-Duplicate-Sprite-Console.png

Download Hobby Basic Version 1.2.4
 
Πίσω
Μπλουζα