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):

Turbo Basic XL
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 číslamiBez čísel
poradie riadkovpodľa číseltak, ako sú v súbore
skokGOTO 100GO# MENO a návestie # MENO
podprogramGOSUB 1000 … RETURNEXEC MENO a PROC MENO … ENDPROC
skok v podmienkeIF X=1 THEN 100IF X=1 THEN GO# MENO
výberON X GOTO 10,20ON X GO# A,B alebo ON X EXEC A,B
pascaTRAP 200TRAP #MENO
dátaRESTORE 500RESTORE #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:

Turbo Basic XL
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,blue

Preklad a spustenie

Voľba je v programe, takže na príkazový riadok ju písať netreba:

Basic26 nolines.tbas --run

alebo 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 23

Ako to funguje

Čí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.tbas

Výpis má pred každým riadkom jeho číslo (prázdne riadky vynechá) a z hlavičky zmizne --no-line-numbers:

Turbo Basic XL
1 REM @COMPILE 
2 REM A program without line numbers
4 DIM NAME$(20)
5 INPUT "Your name";NAME$
6 EXEC GREET
8 COUNT=0

Je 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

Turbo Basic XL
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:

Turbo Basic XL
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:

Turbo Basic XL
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
ENDPROC

Prekladá 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 24
incltools.inc(10,5): error B26009: A(5) is past DIM A(3)
inclmain.tbas(15,9): note: included from here

Väčší 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ľbyerror B26044: line does not start with a number (--no-line-numbers is for a program written without them)
riadok sa začína číslomerror B26044: a line begins with a number, and this program has none (--no-line-numbers)
GOTO 100error B26044: … GOTO is GO# with a label (# NAME)
GOSUB 1000error B26044: … GOSUB is PROC and EXEC with a name
IF X=1 THEN 100error B26044: … THEN with a number is THEN GO# with a label
TRAP 200, RESTORE 500error 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 --modernerror B26057: INCLUDE needs --modern and a Turbo-BASIC XL program without line numbers (--no-line-numbers): …
vložený súbor sa nenašielerror B26057: INCLUDE file not found: …
súbor vkladá sám sebaerror B26057: recursive INCLUDE of …
návestie nie je prvé na riadkuná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

  1. Prepíš menu.tbas z kapitoly 30 bez čísel riadkov. Jediné GOTO v ňom nahraď návestím a GO#.
  2. Pridaj do nolines.tbas na ľubovoľné miesto prázdny riadok a pozri, ako sa zmení číslo v hlásení chyby.
  3. Vypíš si program cez --list a 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

Späť: 46. Kompresia · Ďalej: 48. Nečitateľný súbor