47. Program bez čísel riadkov: --no-line-numbers
Na čo to je
Čísla riadkov sú dedičstvo editora na Atari: určovali poradie riadkov a boli jediným spôsobom, ako niekam skočiť. V textovom editore na PC poradie určuje súbor, a Turbo-BASIC XL má na skoky mená – návestia a procedúry (kapitola 30). Čísla sú potom len na obtiaž: treba ich vymýšľať a pri vkladaní riadkov prečíslovať.
Basic26 preto vie preložiť program v Turbo-BASICu XL napísaný úplne bez čísel riadkov. Je to rozšírenie prekladača – pôvodný interpreter taký súbor neprijme.
Ako sa to zapne
Voľbou --no-line-numbers. Najlepšie rovno v programe, na jeho prvom riadku (kapitola 40):
REM @COMPILE --no-line-numbers
Platí len pre Turbo-BASIC XL (súbor .tbas) a pre celý program naraz: buď má čísla každý riadok, alebo žiadny.
Čo sa mení
| S číslami | Bez čísel | |
|---|---|---|
| poradie riadkov | podľa čísel | tak, ako sú v súbore |
| skok | GOTO 100 | GO# MENO a návestie # MENO |
| podprogram | GOSUB 1000 … RETURN | EXEC MENO a PROC MENO … ENDPROC |
| skok v podmienke | IF X=1 THEN 100 | IF X=1 THEN GO# MENO |
| výber | ON X GOTO 10,20 | ON X GO# A,B alebo ON X EXEC A,B |
| pasca | TRAP 200 | TRAP #MENO |
| dáta | RESTORE 500 | RESTORE #MENO |
Všetko ostatné ostáva: príkazy, slučky, bloky IF … ENDIF, dvojbodka medzi príkazmi. Prázdne riadky a odsadenie sú dovolené a nič neznamenajú.
TRAP 40000 (zrušenie pasce) funguje ďalej – to číslo nie je riadok.
Celý program
Súbor examples/nolines.tbas:
REM @COMPILE --no-line-numbers
REM A program without line numbers
DIM NAME$(20)
INPUT "Your name";NAME$
EXEC GREET
COUNT=0
DO
COUNT=COUNT+1
IF COUNT>3 THEN EXIT
PRINT "Round ";COUNT
LOOP
RESTORE #COLOURS
FOR I=1 TO 3
READ NAME$
PRINT NAME$;" ";
NEXT I
PRINT
TRAP #OOPS
PRINT 10/(COUNT-4)
END
# OOPS
PRINT "Error ";ERR;" at line ";ERL
END
PROC GREET
PRINT "Hello, ";NAME$;"!"
ENDPROC
# COLOURS
DATA red,green,bluePreklad a spustenie
Voľba je v programe, takže na príkazový riadok ju písať netreba:
Basic26 nolines.tbas --runalebo v simulátore s odpoveďou zo súboru examples/nolines.in:
Basic26 nolines.tbas --sim --sim-input nolines.inČo uvidíš
Your name?Peter
Hello, Peter!
Round 1
Round 2
Round 3
red green blue
Error 11 at line 23Ako to funguje
- Prvý riadok zapína mód. Pre prekladač je to nastavenie, inak obyčajný komentár.
- Program sa číta zhora nadol, tak ako je napísaný. Prázdne riadky ho len rozdeľujú na časti.
EXEC GREETvolá procedúru na konci súboru,RESTORE #COLOURSnastaví čítanie dát na návestie,TRAP #OOPSpošle chybu na návestie. Nikde nie je číslo, na ktoré by sa dalo odvolať – a ani ho netreba.- Posledný riadok výstupu:
COUNTje po slučke 4, takže10/(COUNT-4)je delenie nulou.ERLhovorí 23 – a to je presne dvadsiaty tretí riadok súborunolines.tbas. Stačí v editore skočiť na riadok 23.
Číslo riadka je riadok v súbore
Program čísla riadkov nemá, ale chyba ich potrebuje: ERROR- 11 OVERFLOW AT LINE 23, funkcia ERL, stopa TRACE. Prekladač preto každému riadku pridelí číslo, ktoré má v súbore – počítajú sa aj prázdne riadky a komentáre. Hlásenie za behu aj hlásenie prekladača (nolines.tbas(23,7): error …) tak ukazujú na to isté miesto.
Program môže mať najviac 32 767 riadkov.
Výpis s číslami
Keď chceš ten istý program dať pôvodnému Turbo-BASICu XL – alebo niekomu, kto Basic26 nemá –, nechaj si ho vypísať:
Basic26 nolines.tbas --list nolines-numbered.tbasVýpis má pred každým riadkom jeho číslo (prázdne riadky vynechá) a z hlavičky zmizne --no-line-numbers:
1 REM @COMPILE
2 REM A program without line numbers
4 DIM NAME$(20)
5 INPUT "Your name";NAME$
6 EXEC GREET
8 COUNT=0Je to obyčajný Turbo-BASIC XL: interpreter ho načíta príkazom ENTER a Basic26 z neho preloží bajt po bajte ten istý program.
Program z viacerých súborov: INCLUDE
Keď program narastie, oplatí sa ho rozdeliť: hlavný program hovorí, čo sa robí, a procedúry, ktoré to robia, ležia v inom súbore. Riadok
INCLUDE "incltools.inc"vloží na svoje miesto všetky riadky súboru incltools.inc, akoby tam boli napísané. Funguje to len v programe bez čísel riadkov – s číslami by dva súbory priniesli tie isté čísla a nevedelo by sa, ktorý riadok platí. Je to rozšírenie Basic26, pôvodný interpreter INCLUDE nepozná, a preto ho treba zapnúť voľbou --modern (ako hráčov a strely v kapitole 49).
Hlavný program, súbor examples/inclmain.tbas:
REM @COMPILE --no-line-numbers --modern
REM The main program; its procedures are in incltools.inc
EXEC FRAME
PRINT " Hello from two files!"
EXEC FRAME
TRAP #OOPS
EXEC CHECK
END
# OOPS
PRINT "Error ";ERR;" at line ";ERL
END
INCLUDE "incltools.inc"A súbor, ktorý vkladá, examples/incltools.inc:
REM incltools.inc - procedures for inclmain.tbas
PROC FRAME
FOR I=1 TO 27:PRINT "-";:NEXT I
PRINT
ENDPROC
PROC CHECK
DIM A(3)
K=5:A(K)=1
ENDPROCPrekladá sa len hlavný súbor – vložený si prekladač nájde sám:
Basic26 inclmain.tbas --run---------------------------
Hello from two files!
---------------------------
Error 9 at line 24INCLUDEstojí na riadku sám, za ním len meno v úvodzovkách. Meno sa hľadá v adresári súboru, ktorý ho napísal;D:pred menom sa zahodí a bez prípony sa skúsi.TBAS,.BASa.LST.- Vložený súbor môže vkladať ďalší, najviac do hĺbky 16. Sám seba vložiť nemôže – ani cez iný súbor.
- Vložené súbory nemajú
REM @COMPILEa samy sa nepreložia, preto im je dobré dať inú príponu (tu.inc). Voľby platia z hlavného programu pre celý. - Číslo riadka je poradie v celom zloženom programe.
INCLUDEje pätnásty riadokinclmain.tbas, takže vložený súbor začína riadkom 15 a jeho desiaty riadokK=5:A(K)=1je riadok 24 – ten hlásiERL. Kde to je, ukáže--list: vypíše celý program v jednom súbore s číslami. Prekladač pri chybe v preklade hlási súbor a riadok v ňom, aj s riadkom, ktorý ho vložil – keby bol vCHECKriadokA(5)=1, ktorý je zlý už pri preklade:
incltools.inc(10,5): error B26009: A(5) is past DIM A(3)
inclmain.tbas(15,9): note: included from hereVäčší program z troch súborov je medzi príkladmi: examples/turbobasic/include/.
Časté chyby
| Čo sa stalo | Čo povie prekladač |
|---|---|
| program bez čísel a bez voľby | error B26044: line does not start with a number (--no-line-numbers is for a program written without them) |
| riadok sa začína číslom | error B26044: a line begins with a number, and this program has none (--no-line-numbers) |
GOTO 100 | error B26044: … GOTO is GO# with a label (# NAME) |
GOSUB 1000 | error B26044: … GOSUB is PROC and EXEC with a name |
IF X=1 THEN 100 | error B26044: … THEN with a number is THEN GO# with a label |
TRAP 200, RESTORE 500 | error B26044: … TRAP takes a label (TRAP #NAME), … RESTORE takes a label (RESTORE #NAME) |
voľba pri programe v Atari BASICu (.abas) | error B26200: --no-line-numbers is for Turbo-BASIC XL: Atari BASIC has only line numbers to jump to |
INCLUDE v programe s číslami riadkov alebo bez --modern | error B26057: INCLUDE needs --modern and a Turbo-BASIC XL program without line numbers (--no-line-numbers): … |
| vložený súbor sa nenašiel | error B26057: INCLUDE file not found: … |
| súbor vkladá sám seba | error B26057: recursive INCLUDE of … |
| návestie nie je prvé na riadku | návestie # MENO aj PROC MENO musia stáť na začiatku riadka, ako vždy |
Príkaz musí celý ostať na jednom riadku – dlhý riadok sa nedá rozdeliť na dva.
Vyskúšaj si
- Prepíš
menu.tbasz kapitoly 30 bez čísel riadkov. JedinéGOTOv ňom nahraď návestím aGO#. - Pridaj do
nolines.tbasna ľubovoľné miesto prázdny riadok a pozri, ako sa zmení číslo v hlásení chyby. - Vypíš si program cez
--lista prelož výpis. Porovnaj veľkosť oboch súborov.xex.
Ďalší program bez čísel riadkov je medzi príkladmi pri prekladači: examples/turbobasic/nonumbers.tbas.
Zhrnutie
REM @COMPILE --no-line-numbersna začiatku programu: Turbo-BASIC XL bez čísel riadkov.- Skáče sa len na mená:
GO#,EXEC,TRAP #,RESTORE #,ON … GO#,ON … EXEC. - Číslo riadka v chybe, v
ERLa vTRACEje riadok v súbore. --listvypíše ten istý program s číslami – pre pôvodný interpreter.INCLUDE "SÚBOR"vloží riadky iného súboru; číslo riadka je potom poradie v celom zloženom programe.
Späť: 46. Kompresia · Ďalej: 48. Nečitateľný súbor