▸ PEBASIC — manuál jazyka

← Editor ⛶ Spustit

0. Prostředí (editor a fullscreen)

1. Úvod

PEBASIC je textový interpret jazyka BASIC v dialektu Chipmunk Basic (s kompatibilitou pro běžné GW-BASIC programy), napsaný v JavaScriptu. Při kolizi syntaxe má přednost Chipmunk. Běží v prohlížeči, bez grafiky, multimédií a hardwarově závislých věcí. Na velikosti písmen v příkazech nezáleží.

10 REM hádání čísla
20 RANDOMIZE TIMER
30 X = INT(RND(100)) + 1
40 INPUT "Tip"; T
50 IF T < X THEN PRINT "Větší" : GOTO 40
60 IF T > X THEN PRINT "Menší" : GOTO 40
70 PRINT "Uhodl jsi! Bylo to"; X
80 END

2. Struktura programu

3. Datové typy

3.1 Čísla (bez přípony, #, !, &)

3.2 Celá čísla (%)

3.3 Řetězce ($)

3.4 Jména proměnných

3.5 Přiřazení

[LET] proměnná = výraz  |  pole(index…) = výraz  |  MID$(v$, od [, délka]) = výraz  |  FIELD$(v$, n [, oddělovač]) = výraz

LET je nepovinné. Pravá strana se vždy vyhodnotí a převede na typ cíle.

LET a = 5
b$ = "x" + "y"
pocet% = 3.9      : REM uloží 3
t(2) = a * 10
MID$(veta$, 7, 5) = "světe"   : REM přepíše podřetězec na místě
FIELD$(radek$, 2) = "Q"       : REM nahradí 2. pole

4. Pole

DIM jméno(rozměr [, rozměr…]) [, …]  |  ERASE jméno [, …]
40 DIM jmena$(100), ceny(50, 4)
50 jmena$(1) = "Alena"
60 ceny(2, 3) = 199.5
70 PRINT jmena$(1); ceny(2, 3)
80 ERASE ceny          : REM zruší pole

5. Výrazy a operátory

5.1 Aritmetika

OperátorVýznamPříklad → výsledek
+ - * /sčítání, odčítání, násobení, dělení7 / 2 → 3.5
\celočíselné dělení (ořez k nule)7 \ 2 → 3, -7 \ 2 → -3
MODzbytek po dělení (znaménko dělence)7 MOD 3 → 1
^mocnina (pravostranně asociativní)2 ^ 3 ^ 2 → 512
unární + -znaménko- -5 → 5
Dělení nulou vyhodí chybu: 1/0, 1\0 i 1 MOD 0 → ?Division by zero. Výraz musí být platný celý: zbytek za výrazem (PRINT 1 2, PRINT A1 print a), chybějící operand (X = 5 +) i neznámý znak → ?Syntax error.

5.2 Porovnání

OperátorVýznam
=rovná se
<> (i ><)nerovná se
< > <= >= (i =< =>)menší / větší / …

5.3 Logické a bitové operátory

5.4 Priorita (od nejvyšší)

závorky → funkce → ^ → unární minus → * / \ MOD → + - (a spojování řetězců) → porovnání → NOT → AND → OR XOR.

6. Příkazy

CALL / SUB / END SUB / STATIC

SUB jméno [(parametr [, …])] … [STATIC proměnná [, …]] … (RETURN | END SUB)
CALL jméno [(argument [, …])]  |  jméno(argument [, …])
10 CALL pozdrav("Petr")
20 CALL soucet(3, 4) : PRINT vysledek
30 END
1000 SUB pozdrav(jmeno$)
1010   PRINT "Ahoj " + jmeno$
1020 END SUB
1030 SUB soucet(a, b)
1040   vysledek = a + b
1050 END SUB

CLOSE

CLOSE [#číslo [, …]]

Zavře soubory a zapíše rozpracovaný obsah (režimy O/A) do paměti. Bez parametrů zavře vše. Neexistující číslo → ?File not open.

CLS / HOME

CLS  |  HOME

Smaže obrazovku terminálu, kurzor do levého horního rohu.

DATA / READ / RESTORE

DATA položka [, …]
READ proměnná [, …]
RESTORE [číslo_řádku]
10 DATA 1, 2, "tři"
20 READ a, b, c$
30 RESTORE
40 RESTORE 10

DEF FN

DEF FNjméno(parametr [, …]) = výraz
10 DEF FNdvoj(x) = x * 2
20 DEF FNobsah(r) = PI * r ^ 2
30 PRINT FNdvoj(21), FNobsah(1)

DIM / ERASE

DIM jméno(rozměr [, …]) [, …]  |  ERASE jméno [, …]

Viz kapitola 4. Příklad: DIM m(3, 3), seznam$(200).

ELSE / ENDIF (blokový IF)

Součást blokového IF, viz níže.

END / STOP / SYSTEM, EXIT()

END  |  STOP  |  SYSTEM  |  EXIT(výraz)

Ukončí program (STOP stejně jako END). V okně běhu poté následuje přímý režim.

ERASE — viz DIM. EXEC

EXEC(řetězec)
10 prikaz$ = "PRINT " + "x"
20 x = 7
30 EXEC("PRINT x * 2")   : REM vypíše 14

Provede řetězec jako příkaz(y) se sdílenými proměnnými, poli i soubory.

EXIT

EXIT FOR  |  EXIT WHILE  |  EXIT

Předčasně opustí cyklus (skočí za NEXT/WEND). Holé EXIT ukončí celý program (používá se např. ve CASE).

FILES / KILL / NAME

FILES
KILL "jméno"
NAME "staré" AS "nové"

FILES vypíše soubory v paměti (prázdné → No files). KILL smaže, NAME přejmenuje (neexistující → ?File not found). Jména se ukládají velkými písmeny.

FOR / NEXT

FOR v = start TO konec [STEP krok] … NEXT [v]
FOR i = 1 TO 10 STEP 2 : PRINT i : NEXT i
FOR i = 10 TO 1 STEP -1 : PRINT i : NEXT

GET, FPUTBYTE, FSEEK, INPUT$

GET proměnná$
FPUTBYTE hodnota, #číslo
FSEEK #číslo, pozice
INPUT$(počet [, #číslo]) — funkce

GOSUB / RETURN, GOTO

GOSUB číslo_řádku … RETURN
GOTO číslo_řádku

Podprogram s návratem na příkaz za GOSUB; hloubka vnoření je omezena jen pamětí. Neexistující řádek → ?Undefined line number. RETURN bez GOSUB → ?RETURN without GOSUB. Uvnitř SUB se RETURN vrací ze subrutiny, pokud není rozpracovaný GOSUB.

IF (jednořádkový)

IF podmínka THEN příkazy [ : … ] [ELSE příkazy]  |  IF … THEN číslo_řádku
IF a = 5 THEN PRINT "ano" ELSE PRINT "ne"
IF hotovo = 1 THEN f = 0 : GOTO 10
IF x > 9 THEN 200

IF (blokový)

IF podmínka THEN
  příkazy…
[ELSE
  příkazy…]
ENDIF (i END IF, i IF (podmínka) bez THEN)
IF LEN(volba$) = 1 THEN
  IF volba$ = "x" THEN END
  IF volba$ = "r" THEN GOSUB 500 : GOTO 100
ELSE
  dotaz$ = volba$
ENDIF

Blokové IF poznáte tak, že za THEN nic není (nebo chybí THEN u závorkové podmínky). Bloky lze vnořovat.

INPUT / LINE INPUT

INPUT ["text";] proměnná [, …]
LINE INPUT ["text";] proměnná$
INPUT "Jméno"; j$
INPUT "A,B"; a, b
LINE INPUT "Celý řádek: "; r$

LET (přiřazení) — viz 3.5. MAT

MAT pole = výraz  |  MAT pole = IDN  |  MAT A = B  |  MAT A = B +|* C|výraz  |  MAT A = (výraz) +|-|* B
MAT A = TRANSPOSE|TRN B  |  MAT A = INVERT|INV B [ELSE řádek]
MAT PRINT [#n,] pole [;]  |  MAT PRINT USING formát; pole
MAT ORIGIN 0|1  |  OPTION BASE 0|1
10 DIM A(3,3), B(3,3), C(3,3)
20 MAT A = 1          : REM všechno = 1
30 MAT B = IDN        : REM jednotková
40 MAT C = A + B      : REM součet (rozměry musí sedět)
50 MAT C = A * B      : REM součin (vnitřní rozměry musí sedět)
60 MAT C = (2) * A    : REM násobení skalárem
70 MAT B = TRN A      : REM transpozice
80 MAT B = INV A ELSE 200 : REM inverze, singulární → skok
90 MAT PRINT C
100 MAT PRINT USING "###.##"; C

NEXT — viz FOR. ON GOTO / ON GOSUB / ON ERROR

ON výraz GOTO ř1 [, ř2…]  |  ON výraz GOSUB ř1 [, …]
ON ERROR GOTO řádek  |  ON ERROR GOTO 0  |  RESUME [0|NEXT|řádek]
ON volba GOTO 100, 200, 300
ON ERROR GOTO 900
...
900 PRINT "Chyba na "; ERL; ": "; ERRORSTATUS$
910 RESUME NEXT

OPEN / PRINT# / INPUT# / LINE INPUT#

OPEN "O"|"I"|"A", číslo, "jméno" [ELSE GOTO řádek]
OPEN "jméno" FOR INPUT|OUTPUT|APPEND AS #číslo [ELSE GOTO řádek]
PRINT #číslo, …  |  INPUT #číslo, …  |  LINE INPUT #číslo, …
OPEN "O", 1, "VYSTUP.TXT"
PRINT #1, jmeno$; ","; vek
CLOSE 1
OPEN "VYSTUP.TXT" FOR INPUT AS #1
LINE INPUT #1, radek$
CLOSE 1

Podrobnosti viz kapitola 8.

OPTION

OPTION BASE 0|1  |  OPTION DEGREES  |  OPTION RADIANS

PRINT / ? (vč. PRINT USING)

PRINT [výraz [{;|,} …]]  |  ? …
PRINT [#n,] USING formát; hodnota [, …]
PRINT "Ahoj "; jmeno$; "!"
PRINT a, b          : REM čárka = další 14znaková zóna
PRINT x;            : REM středník na konci = bez odřádkování
PRINT TAB(10); "x"
PRINT SPC(5); "*"
PRINT               : REM prázdný řádek
PRINT USING "###.##"; 2.12345     : REM "  2.12"
PRINT USING "**$###.##"; 1.23     : REM "****$1.23"
PRINT USING "#.##E+##"; 2345.6    : REM "2.35E+03"

PUSH / POP

PUSH výraz|proměnná [, …]
POP  |  POP počet  |  POP proměnná [, …]  |  POP() — funkce
PUSH x, "text", 1+2
POP x            : REM obnoví x
PRINT POP()      : REM vrátí hodnotu bez obnovy

RANDOMIZE

RANDOMIZE [výraz]

Nastaví semínko generátoru (RND(záporné) ho nastaví také). Stejné semínko = stejná posloupnost. Bez parametru náhodné semínko.

READ — viz DATA. REM

REM text  |  ' text  |  ` text

Komentář do konce řádku.

RESTORE — viz DATA. RETURN — viz GOSUB. SELECT CASE

SELECT CASE výraz
[CASE hodnota [, …]
  příkazy…]
[CASE ELSE
  příkazy…]
END SELECT
SELECT CASE volba$
CASE ""
CASE "k"
  PRINT "konec"
CASE "1", "2"
  PRINT "volba 1 nebo 2"
CASE ELSE
  PRINT "neznámá volba"
END SELECT

STATIC — viz SUB. STOP / SYSTEM — viz END. WHILE / WEND

WHILE podmínka … WEND [výraz]
WHILE NOT EOF(1)
  LINE INPUT #1, r$
  PRINT r$
WEND

Nepodporováno: grafika/zvuk (SCREEN PSET LINE CIRCLE PLAY SOUND BEEP MORSE SAY), náhodný přístup (GET # PUT # → chyba), databáze DBM$, objektový systém (TYPE CLASS), MAT FFT, PEEK POKE VARPTR FRE, sockety/roury (OPEN "pipe:…"/"socket:…"), kurzorové HTAB VTAB GOTOXY POS.

7. Funkce

Volání: JMÉNO(parametry). Parametry jsou výrazy; číselné se převádějí Number(), textové String(). Neznámá funkce s prázdnými závorkami u pole vrací prvek, jinak 0. Funkce bez parametrů lze psát i bez závorek (TIMER, TIME$, PI…).

Matematika

FunkceParametryVracíPříklad
ABS(x)číslo|x|ABS(-3) → 3
SGN(x)číslo1 / 0 / -1SGN(-5) → -1
INT(x)číslodolní celá část (k −∞)INT(3.9) → 3, INT(-3.1) → -4
INT(x, 0)číslo, cokoliořez k nuleINT(-3.9, 0) → -3
FLOOR(x)číslodolní celá část (k −∞)FLOOR(-3.1) → -4
FIX(x)čísloořez k nuleFIX(-3.9) → -3
SQR(x) (i SQRT)x ≥ 0odmocninaSQR(16) → 4
LOG(x) / LOG10(x)x > 0přirozený / desítkový logaritmusLOG10(1000) → 3
EXP(x)čísloexEXP(0) → 1
SIN(x) COS(x) TAN(x)radiány (nebo stupně po OPTION DEGREES)funkceSIN(0) → 0
ATN(x) / ATN(x, y)číslo / bod (x,y)arcustangens / úhel vektoru (x,y); po DEGREES ve stupníchATN(1,1) → 0.785…
PI—3,1415926535897932 * PI
RND / RND(1)— / 1desetinné 0 (včetně) – 1 (bez)RND
RND(n), n > 1horní mez (celá část)celé 0 – n-1RND(6)+1 → kostka 1–6
RND(0) / RND(záporné)— / semínkoposlední hodnota / nastaví semínko a vrátí novou hodnotu

Řetězce

FunkceParametryVracíPříklad
LEN(s$)textpočet znaků (0 u "")LEN("abc") → 3
LEFT$(s$, n)text, počet (záporný → 0)prvních n znakůLEFT$("ahoj",2) → "ah"
RIGHT$(s$, n)text, početposledních n znakůRIGHT$("ahoj",2) → "oj"
MID$(s$, od [, délka])text, pozice od 1, nepovinná délkapodřetězec (bez délky až do konce)MID$("ahoj",2,2) → "ho"
INSTR(s$, hled)text, hledaný textpozice od 1, 0 = nenalezenoINSTR("ahoj","o") → 3
INSTR(start, s$, hled) / INSTR(s$, hled, start)obě pořadí povolenahledá od pozice startINSTR("ahoj o","o",4) → 6
STRING$(n, x)počet, znak nebo jeho kódznak zopakovaný n-krátSTRING$(5,"*") → "*****"
SPACE$(n)početn mezer"a"+SPACE$(2)+"b"
CHR$(n) (i CHR)kód (maska & 255)znakCHR$(65) → "A", CHR$(27) = ESC
ASC(s$)text (prázdný → 0)kód prvního znakuASC("A") → 65
VAL(s$)text (i výraz v textu)hodnota: celý výraz, jinak úvodní číslo, jinak 0VAL("1+2*3") → 7, VAL("12abc") → 12
STR$(n) / STR$(n, délka)číslo, nepovinná šířkatext (nezáporná s mezerou vpředu), s délkou doplněno mezerami zlevaSTR$(5,4) → " 5"
FORMAT$(hodnota, formát)číslo, formátovací řetězecformátováno jako PRINT USINGFORMAT$(2.12345,"###.##") → " 2.12"
LTRIM$(s$) RTRIM$(s$)textořez mezer zleva / zprava
UCASE$(s$) LCASE$(s$) (i UPPER$ LOWER$ UCASE)textvelká / malá písmenaLCASE$("Ahoj") → "ahoj"
OCT$(n)číslo (ořez dolů)osmičkový zápisOCT$(8) → "10"
HEX$(n [, délka])číslo, nepovinná šířkaVELKÝ šestnáctkový zápis, s délkou doplněn nulami zlevaHEX$(15,4) → "000F"
BIN$(n [, délka]) (i BIN)číslo, nepovinná šířkadvojkový zápis, s délkou doplněn nulamiBIN$(5,8) → "00000101"
FIELD$(text, n [, oddělovač])text, číslo pole od 1, znak (výchozí mezery jako awk)n-té pole, jinak ""; n = -1 → počet oddělovačůFIELD$("1 22 333",3) → "333"
BSWAP16(n) BSWAP32(n)čísloprohozené bajty 16/32bitové hodnotyBSWAP16(1) → 256

Pole a matice

FunkceParametryVrací
ISARRAY(pole)jménopočet rozměrů, jinak 0
UBOUND(pole [, rozměr])jméno, číslo rozměru od 1 (výchozí 1)maximální index (= rozměr z DIM), jinak 0
DET(pole)jméno čtvercové 2D maticedeterminant
DOT(p1, p2)jména 1D polískalární součin (po kratší délku)

Soubory, čas, systém

FunkceParametryVrací
EOF(n) (i EOF(#n))číslo souboru-1 = konec (až po pokusu číst za koncem), 0 = lze číst; neotevřený → -1; # se ve výrazech ignoruje, takže EOF(#1) = EOF(1)
LOF(n) (i LOF(#n))číslo souborudélka obsahu v znacích, neotevřený → 0
FGETBYTE(n)číslo souborubajt 0–255 na znakové pozici (posun), za koncem -1
INPUT$(n [, #f])počet, číslo souborun znaků ze souboru; bez souboru ""
INKEY$—vždy "" (prohlížeč neumí neblokující klávesu; použijte GET/INPUT)
EOL(n)číslo souboruznak konce řádku (CHR$(10))
TIMER (i TIMER())—celé sekundy od půlnoci 0–86399
TIME$ (i TIME, i s ())—aktuální čas HH:MM:SS
DATE$ (i DATE, i s ())—aktuální datum a čas v Chipmunk formátu Www Mmm dd hh:mm:ss yyyy, např. Wed Sep 16 12:52:12 2026; čas se získá mid$(date$,instr(date$,":")-2,8)
ERL—číslo řádku poslední zachycené chyby (ON ERROR), jinak 0; lze i zapisovat
ERRORSTATUS$—text poslední zachycené chyby
SPC(n) TAB(n)počet / sloupecmezery (i mimo PRINT)
VERSION$ (i VERSION$())—verze interpretru, např. PEBASIC 1.0 (JS, LE)
BIGENDIAN—vždy 0 (little-endian)
SYSTEM$(…) GETENV$(…) ARGV$—vždy "" (prostředí prohlížeče)
POP()—hodnota ze zásobníku (PUSH); prázdný → ?Stack empty

8. Soubory podrobně

9. SYS — emulace shellu

Volání systému se v prohlížeči emulují prací se soubory v paměti. Cíl přesměrování (> soubor) se bere z příkazu:

PříkazEmulace
SYS("date +%z > soubor")zapíše časové pásmo prohlížeče, např. +0100 (výchozí TZ.TMP)
SYS("date +%u > soubor")zapíše den v týdnu 1–7 (Po–Ne, výchozí DAY.TMP)
SYS("ls soubor > ven")zapíše jméno, pokud soubor existuje, jinak prázdné (výchozí CHECK.TMP)
SYS("wget URL -O soubor")pokus o stažení adresy (typicky selže na CORS — cíl se nezmění a vypíše se důvod)
SYS("tr -d '\r' < vstup > výstup")odstraní CR ze vstupního souboru; prázdný vstup = cíl se nezmění

10. Přímý režim

Po skončení programu je ve fullscreen okně (run.html) aktivní přímý režim — klasická výzva BASICu. S prázdným programem startuje fullscreen rovnou v něm. V hlavním okně (editor) přímý režim není, tam je jen výstup programu. Nápověda: help (i ?).

Ready - primy rezim: help pro napovedu
print 1+2
 3
list
10 PRINT "Ahoj"
...
RUN
RUN [řádek]spustí program (volitelně od řádku)
LIST [n[-m]]vypíše program (celek / řádek / rozsah; LIST 2-, LIST -5)
NEW / CLEARsmaže proměnné a pole (program zůstává)
LOAD "soubor" / SAVE "soubor"načte / uloží program ze souboru v paměti
MERGE "soubor"přimíchá řádky ze souboru (stejná čísla přepíše)
DEL n[-m]smaže řádek / rozsah
RENUM [nový[,krok[,od[,do]]]]přečísluje (výchozí 10,10,vše) včetně odkazů GOTO GOSUB THEN ELSE ON RESTORE RESUME; kolize → chyba
FILES, CLS, EXIT/QUIT/BYEsoubory / smazání / konec přímého režimu
help / ?nápověda přímého režimu
10 PRINT 1řádek s číslem se přidá do programu (stejné číslo = nahrazení; jde to i z prázdného režimu — první řádek program založí)
10holé číslo smaže řádek 10
PRINT 1+2 apod.příkaz bez čísla se provede hned (proměnné se sdílí s programem)

11. Chybové hlášky

Formát: ?zpráva, u běžícího programu s řádkem: ?zpráva at line N. Přehled:

HláškaKdy
Syntax error[: …]nerozpoznaný příkaz, špatný FOR/OPEN/INPUT#…, chybějící THEN, špatný CALL/RESUME/OPTION…; ve výrazu i zbytek za výrazem (PRINT 1 2), chybějící operand (X = 5 +) a neznámý znak
Division by zero/, \ i MOD nulou
Undefined line number nGOTO/GOSUB/ON/IF/RESUME… na neexistující řádek
Undefined SUB: jméno / SUB without END SUBvolání / definice subrutiny
Out of DATAREAD za koncem dat
File already open ndruhé OPEN stejného čísla bez CLOSE
Bad file mode …neznámý režim OPEN / zápis do souboru otevřeného pro čtení
File not open n / File not foundoperace se zavřeným číslem / NAME/LOAD neexistujícího
Input past endčtení za koncem souboru
NEXT without FOR / WEND without WHILE / RETURN without GOSUB / CASE without SELECT / END SUB without SUBukončovač bez zahájení
WHILE without WEND / IF without ENDIF / ELSE without ENDIF / CASE without END SELECTneuzavřený blok
RESUME without errorRESUME mimo obsluhu chyby
Stack empty / POP: variable not on stackzásobník PUSH/POP
Array not dimensioned: X / Matrix dimensions mismatch / Singular matrix / MAT supports only 1D/2D arraysmaticové operace
GET/PUT random access not supported / Random access files not supportednáhodný přístup k souborům
MID$/FIELD$ needs string variablepřiřazení do ne-řetězcové proměnné
Redo from startnení chyba, ale opakovaný dotaz po špatném čísle v INPUT
Too many steps (infinite loop?)bezpečnostní limit 5 000 000 kroků — typicky nekonečná smyčka
No programspuštění prázdného programu
Breakpřerušení tlačítkem STOP / Ctrl+C

12. Limity a rozdíly proti Chipmunk / GW-BASIC