basicdoc: major doc update

This commit is contained in:
minjaesong
2020-12-25 21:21:33 +09:00
parent 5a894c497a
commit 46a6bf3a0e
17 changed files with 464 additions and 189 deletions

View File

@@ -1,26 +1,14 @@
1 OPTIONBASE 1 1 OPTIONBASE 1
10 PRINT SPC(28);"AMAZING PROGRAM" 10 PRINT SPC(28);"AMAZING PROGRAM"
20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
30 PRINT 30 PRINT:PRINT:PRINT
31 PRINT 100 PRINT "WHAT ARE YOUR WIDTH";:INPUT H
32 PRINT 102 PRINT "WHAT ARE YOUR LENGTH";:INPUT V
33 PRINT
100 PRINT "WHAT ARE YOUR WIDTH";
101 INPUT H
102 PRINT "WHAT ARE YOUR LENGTH";
103 INPUT V
105 IF H<>1 AND V<>1 THEN GOTO 110 105 IF H<>1 AND V<>1 THEN GOTO 110
106 PRINT "MEANINGLESS DIMENSIONS. TRY AGAIN." 106 PRINT "MEANINGLESS DIMENSIONS. TRY AGAIN.":GOTO 100
107 GOTO 100 110 WS=DIM(H,V):VS=DIM(H,V)
110 WS=DIM(H,V) 120 PRINT:PRINT:PRINT:PRINT
111 VS=DIM(H,V) 160 Q=0:Z=0:X=INT(RND(1)*H+1)
120 PRINT
130 PRINT
140 PRINT
150 PRINT
160 Q=0
161 Z=0
162 X=INT(RND(1)*H+1)
165 FOR I=1 TO H 165 FOR I=1 TO H
170 IF I==X THEN GOTO 173 170 IF I==X THEN GOTO 173
171 PRINT ".--"; 171 PRINT ".--";
@@ -28,20 +16,13 @@
173 PRINT ". "; 173 PRINT ". ";
180 NEXT 180 NEXT
190 PRINT "." 190 PRINT "."
195 C=1 195 C=1:WS(X,1)=C:C=C+1
196 WS(X,1)=C 200 R=X:S=1:GOTO 260
197 C=C+1
200 R=X
201 S=1
202 GOTO 260
210 IF R<>H THEN GOTO 240 210 IF R<>H THEN GOTO 240
215 IF S<>V THEN GOTO 230 215 IF S<>V THEN GOTO 230
220 R=1 220 R=1:S=1
221 S=1
222 GOTO 250 222 GOTO 250
230 R=1 230 R=1:S=S+1:GOTO 250
231 S=S+1
232 GOTO 250
240 R=R+1 240 R=R+1
250 IF WS(R,S)==0 THEN GOTO 210 250 IF WS(R,S)==0 THEN GOTO 210
260 IF R-1==0 THEN GOTO 530 260 IF R-1==0 THEN GOTO 530
@@ -51,45 +32,30 @@
290 IF R==H THEN GOTO 330 290 IF R==H THEN GOTO 330
300 IF WS(R+1,S)<>0 THEN GOTO 330 300 IF WS(R+1,S)<>0 THEN GOTO 330
310 X=INT(RND(1)*3+1) 310 X=INT(RND(1)*3+1)
320 REM ON X GOTO 790,820,860 320 ON X GOTO 790,820,860
321 IF X==1 THEN GOTO 790
322 IF X==2 THEN GOTO 820
323 IF X==3 THEN GOTO 860
330 IF S<>V THEN GOTO 340
334 IF Z==1 THEN GOTO 370 334 IF Z==1 THEN GOTO 370
338 Q=1 338 Q=1:GOTO 350
339 GOTO 350
340 IF WS(R,S+1)<>0 THEN GOTO 370 340 IF WS(R,S+1)<>0 THEN GOTO 370
350 X=INT(RND(1)*3+1) 350 X=INT(RND(1)*3+1)
360 REM ON X GOTO 790,820,910 360 ON X GOTO 790,820,910
361 IF X==1 THEN GOTO 790
362 IF X==2 THEN GOTO 820
363 IF X==3 THEN GOTO 910
370 X=INT(RND(1)*2+1) 370 X=INT(RND(1)*2+1)
380 REM ON X GOTO 790,820 380 ON X GOTO 790,820
390 IF R==H THEN GOTO 470 390 IF R==H THEN GOTO 470
400 IF WS(R+1,S)<>0 THEN GOTO 470 400 IF WS(R+1,S)<>0 THEN GOTO 470
405 IF S<>V THEN GOTO 420 405 IF S<>V THEN GOTO 420
410 IF Z==1 THEN GOTO 450 410 IF Z==1 THEN GOTO 450
415 Q=1 415 Q=1:GOTO 430
416 GOTO 430
420 IF WS(R,S+1)<>0 THEN GOTO 450 420 IF WS(R,S+1)<>0 THEN GOTO 450
430 X=INT(RND(1)*3+1) 430 X=INT(RND(1)*3+1)
440 REM ON X GOTO 790,860,910 440 ON X GOTO 790,860,910
441 IF X==1 THEN GOTO 790
442 IF X==2 THEN GOTO 860
443 IF X==3 THEN GOTO 910
450 X=INT(RND(1)*2+1) 450 X=INT(RND(1)*2+1)
460 REM ON X GOTO 790,860 460 ON X GOTO 790,860
470 IF S<>V THEN GOTO 490 470 IF S<>V THEN GOTO 490
480 IF Z==1 THEN GOTO 520 480 IF Z==1 THEN GOTO 520
485 Q=1 485 Q=1:GOTO 500
486 GOTO 500
490 IF WS(R,S+1)<>0 THEN GOTO 520 490 IF WS(R,S+1)<>0 THEN GOTO 520
500 X=INT(RND(1)*2+1) 500 X=INT(RND(1)*2+1)
510 REM ON X GOTO 790,910 510 ON X GOTO 790,910
511 IF X==1 THEN GOTO 790
512 IF X==2 THEN GOTO 910
520 GOTO 790 520 GOTO 790
530 IF S-1==0 THEN GOTO 670 530 IF S-1==0 THEN GOTO 670
540 IF WS(R,S-1)<>0 THEN GOTO 670 540 IF WS(R,S-1)<>0 THEN GOTO 670
@@ -97,98 +63,67 @@
547 IF WS(R+1,S)<>0 THEN GOTO 610 547 IF WS(R+1,S)<>0 THEN GOTO 610
550 IF S<>V THEN GOTO 560 550 IF S<>V THEN GOTO 560
552 IF Z==1 THEN GOTO 590 552 IF Z==1 THEN GOTO 590
554 Q=1 554 Q=1:GOTO 570
555 GOTO 570
560 IF WS(R,S+1)<>0 THEN GOTO 590 560 IF WS(R,S+1)<>0 THEN GOTO 590
570 X=INT(RND(1)*3+1) 570 X=INT(RND(1)*3+1)
580 REM ON X GOTO 820,860,910 580 ON X GOTO 820,860,910
581 IF X==0 THEN GOTO 820
582 IF X==1 THEN GOTO 860
583 IF X==2 THEN GOTO 910
590 X=INT(RND(1)*2+1) 590 X=INT(RND(1)*2+1)
600 REM ON X GOTO 820,860 600 ON X GOTO 820,860
601 IF X==1 THEN GOTO 820
602 IF X==2 THEN GOTO 860
610 IF S<>V THEN GOTO 630 610 IF S<>V THEN GOTO 630
620 IF Z==1 THEN GOTO 660 620 IF Z==1 THEN GOTO 660
625 Q=1 625 Q=1:GOTO 640
626 GOTO 640
630 IF WS(R,S+1)<>0 THEN GOTO 660 630 IF WS(R,S+1)<>0 THEN GOTO 660
640 X=INT(RND(1)*2+1) 640 X=INT(RND(1)*2+1)
650 REM ON X GOTO 820,910 650 ON X GOTO 820,910
651 IF X==0 THEN GOTO 820
652 IF X==1 THEN GOTO 910
660 GOTO 820 660 GOTO 820
670 IF R==H THEN GOTO 740 670 IF R==H THEN GOTO 740
680 IF WS(R+1,S)<>0 THEN GOTO 740 680 IF WS(R+1,S)<>0 THEN GOTO 740
685 IF S<>V THEN GOTO 700 685 IF S<>V THEN GOTO 700
690 IF Z==1 THEN GOTO 730 690 IF Z==1 THEN GOTO 730
695 Q=1 695 Q=1:GOTO 830
696 GOTO 830
700 IF WS(R,S+1)<>0 THEN GOTO 730 700 IF WS(R,S+1)<>0 THEN GOTO 730
710 X=INT(RND(1)*2+1) 710 X=INT(RND(1)*2+1)
720 REM ON X GOTO 860,910 720 ON X GOTO 860,910
721 IF X==0 THEN GOTO 860
722 IF X==1 THEN GOTO 910
730 GOTO 860 730 GOTO 860
740 IF S<>V THEN GOTO 760 740 IF S<>V THEN GOTO 760
750 IF Z==1 THEN GOTO 780 750 IF Z==1 THEN GOTO 780
755 Q=1 755 Q=1:GOTO 770
756 GOTO 770
760 IF WS(R,S+1)<>0 THEN GOTO 780 760 IF WS(R,S+1)<>0 THEN GOTO 780
770 GOTO 910 770 GOTO 910
780 GOTO 1000 780 GOTO 1000
790 WS(R-1,S)=C 790 WS(R-1,S)=C
800 C=C+1 800 C=C+1:VS(R-1,S)=2:R=R-1
801 VS(R-1,S)=2
802 R=R-1
810 IF C==H*V+1 THEN GOTO 1010 810 IF C==H*V+1 THEN GOTO 1010
815 Q=0 815 Q=0:GOTO 260
816 GOTO 260
820 WS(R,S-1)=C 820 WS(R,S-1)=C
830 C=C+1 830 C=C+1
840 VS(R,S-1)=1 840 VS(R,S-1)=1:S=S-1:IF C==H*V+1 THEN GOTO 1010
841 S=S-1 850 Q=0:GOTO 260
842 IF C==H*V+1 THEN GOTO 1010
850 Q=0
851 GOTO 260
860 WS(R+1,S)=C 860 WS(R+1,S)=C
870 C=C+1 870 C=C+1:IF VS(R,S)==0 THEN GOTO 880
871 IF VS(R,S)==0 THEN GOTO 880 875 VS(R,S)=3:GOTO 890
875 VS(R,S)=3
876 GOTO 890
880 VS(R,S)=2 880 VS(R,S)=2
890 R=R+1 890 R=R+1
900 IF C==H*V+1 THEN GOTO 1010 900 IF C==H*V+1 THEN GOTO 1010
905 GOTO 530 905 GOTO 530
910 IF Q==1 THEN GOTO 960 910 IF Q==1 THEN GOTO 960
920 WS(R,S+1)=C 920 WS(R,S+1)=C:C=C+1:IF VS(R,S)==0 THEN GOTO 940
921 C=C+1 930 VS(R,S)=3:GOTO 950
922 IF VS(R,S)==0 THEN GOTO 940
930 VS(R,S)=3
931 GOTO 950
940 VS(R,S)=1 940 VS(R,S)=1
950 S=S+1 950 S=S+1:IF C==H*V+1 THEN GOTO 1010
951 IF C==H*V+1 THEN GOTO 1010
955 GOTO 260 955 GOTO 260
960 Z=1 960 Z=1
970 IF VS(R,S)==0 THEN GOTO 980 970 IF VS(R,S)==0 THEN GOTO 980
975 VS(R,S)=3 975 VS(R,S)=3:Q=0:GOTO 1000
976 Q=0 980 VS(R,S)=1:Q=0:R=1:S=1:GOTO 250
977 GOTO 1000
980 VS(R,S)=1
981 Q=0
982 R=1
983 S=1
984 GOTO 250
1000 GOTO 210 1000 GOTO 210
1010 FOR J=1 TO V 1010 FOR J=1 TO V
1011 PRINT "I"; 1011 PRINT "|";
1012 FOR I=1 TO H 1012 FOR I=1 TO H
1013 IF VS(I,J)<2 THEN GOTO 1030 1013 IF VS(I,J)<2 THEN GOTO 1030
1020 PRINT " "; 1020 PRINT " ";
1021 GOTO 1040 1021 GOTO 1040
1030 PRINT " I"; 1030 PRINT " |";
1040 NEXT 1040 NEXT
1041 PRINT 1041 PRINT
1043 FOR I=1 TO H 1043 FOR I=1 TO H

View File

@@ -0,0 +1,9 @@
10 DEFUN POW2(N)=2^N
20 DEFUN DCOS(N)=COS(PI*N/180)
30 FOR X=0 TO 8
40 PRINT X,POW2(X)
50 NEXT
60 PRINT "----------------"
70 FOREACH A=0!45!90!135!180!NIL
80 PRINT A,DCOS(A)
90 NEXT

View File

@@ -1,28 +1,14 @@
10 PRINT SPC(32);"HAMURABI" 10 PRINT SPC(32);"HAMURABI"
20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
30 PRINT 30 PRINT:PRINT:PRINT
31 PRINT
32 PRINT
80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA" 80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"
90 PRINT "FOR A TEN-YEAR TERM OF OFFICE." 90 PRINT "FOR A TEN-YEAR TERM OF OFFICE.":PRINT
91 PRINT 95 D1=0:P1=0
95 D1=0 100 Z=0:P=95:S=2800:H=3000:E=H-S
96 P1=0 110 Y=3:A=H/Y:I=5:Q=1
100 Z=0
101 P=95
102 S=2800
103 H=3000
104 E=H-S
110 Y=3
111 A=H/Y
112 I=5
113 Q=1
210 D=0 210 D=0
215 PRINT 215 PRINT:PRINT:PRINT "HAMURABI: I BEG TO REPORT TO YOU,":Z=Z+1
216 PRINT 217 PRINT "IN YEAR ";Z;", ";D;" PEOPLE STARVED, ";I;" CAME TO THE CITY,"
217 PRINT "HAMURABI: I BEG TO REPORT TO YOU,"
218 Z=Z+1
219 PRINT "IN YEAR ";Z;", ";D;" PEOPLE STARVED, ";I;" CAME TO THE CITY,"
220 P=P+I 220 P=P+I
227 IF Q>0 THEN GOTO 230 227 IF Q>0 THEN GOTO 230
228 P=INT(P/2) 228 P=INT(P/2)
@@ -44,9 +30,7 @@
324 GOSUB 710 324 GOSUB 710
325 GOTO 320 325 GOTO 320
330 IF Q==0 THEN GOTO 340 330 IF Q==0 THEN GOTO 340
331 A=A+Q 331 A=A+Q:S=S-Y*Q:C=0
332 S=S-Y*Q
333 C=0
334 GOTO 400 334 GOTO 400
340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL"; 340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL";
341 INPUT Q 341 INPUT Q
@@ -54,9 +38,7 @@
343 IF Q<A THEN GOTO 350 343 IF Q<A THEN GOTO 350
344 GOSUB 720 344 GOSUB 720
345 GOTO 340 345 GOTO 340
350 A=A-Q 350 A=A-Q:S=S+Y*Q:C=0
351 S=S+Y*Q
352 C=0
400 PRINT 400 PRINT
410 PRINT "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE"; 410 PRINT "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE";
411 INPUT Q 411 INPUT Q
@@ -65,9 +47,7 @@
420 IF Q<=S THEN GOTO 430 420 IF Q<=S THEN GOTO 430
421 GOSUB 710 421 GOSUB 710
422 GOTO 410 422 GOTO 410
430 S=S-Q 430 S=S-Q:C=1:PRINT
431 C=1
432 PRINT
440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED"; 440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED";
441 INPUT D 441 INPUT D
442 IF D==0 THEN GOTO 511 442 IF D==0 THEN GOTO 511
@@ -87,9 +67,7 @@
510 S=S-INT(D/2) 510 S=S-INT(D/2)
511 GOSUB 800 511 GOSUB 800
512 REM *** A BOUNTIFUL HARVEST! 512 REM *** A BOUNTIFUL HARVEST!
515 Y=C 515 Y=C:H=D*Y:E=0
516 H=D*Y
517 E=0
521 GOSUB 800 521 GOSUB 800
522 IF INT(C/2)<>C/2 THEN GOTO 530 522 IF INT(C/2)<>C/2 THEN GOTO 530
523 REM *** RATS ARE RUNNING WILD!! 523 REM *** RATS ARE RUNNING WILD!!

View File

@@ -0,0 +1,4 @@
10 DEFUN SINC(X)=IF X==0 THEN 1 ELSE SIN(X)/X
20 DEFUN THREEDIGITS(X)=ROUND(X*1000)/1000
100 K=MAP(THREEDIGITS<~SINC,1 TO 10)
110 PRINT K

View File

@@ -1,10 +1,6 @@
1 REM Calculates a square root using newtonian method 10 X=1337
10 INPUT X 20 Y=0.5*X
11 IF TYPEOF(X)=="num" THEN GOTO 20 30 Z=Y
12 PRINT "Please type in a number, please"; 40 Y=Y-((Y^2)-X)/(2*Y)
13 GOTO 10 50 IF NOT(Z==Y) THEN GOTO 30 : REM 'NOT(Z==Y)' can be rewritten to 'Z<>Y'
20 Y = 0.5 * X
30 Z = Y
40 Y = Y-(((Y^2)-X)/(2*Y))
50 IF Z <> Y THEN GOTO 30
100 PRINT "Square root of ";X;" is approximately ";Y 100 PRINT "Square root of ";X;" is approximately ";Y

View File

@@ -1,6 +1,10 @@
10 FOR I = 1 TO 20 10 GOTO 1000
20 PRINT SPC(20-I); 100 REM subroutine to draw a segment. Size is stored to 'Q'
30 FOR J = 1 TO I*2-1 110 PRINT SPC(20-Q);
40 PRINT "*"; 120 FOR Q1=1 TO Q*2-1
50 NEXT:PRINT 130 PRINT "*";
60 NEXT 140 NEXT : PRINT
150 RETURN
1000 FOR Q=1 TO 20
1010 GOSUB 100
1020 NEXT

View File

@@ -0,0 +1,12 @@
10 GOTO 1000
100 REM subroutine to draw a segment. Size is stored to 'Q'
110 PRINT SPC(20-Q);
120 Q1=1 : REM loop counter for this subroutine
130 PRINT "*";
140 Q1=Q1+1
150 IF Q1<=Q*2-1 THEN GOTO 130
160 PRINT : RETURN : REM this line will take us back from the jump
1000 Q=1 : REM this is our loop counter
1010 GOSUB 100
1020 Q=Q+1
1030 IF Q<=20 THEN GOTO 1010

View File

@@ -1239,7 +1239,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
if (jmpTarget === undefined) if (jmpTarget === undefined)
return undefined; return undefined;
return bStatus.builtin[jmpFun](lnum, stmtnum, [jmpTarget]); return bStatus.builtin[jmpFun].f(lnum, stmtnum, [jmpTarget]);
}}, }},
"MIN" : {f:function(lnum, stmtnum, args) { "MIN" : {f:function(lnum, stmtnum, args) {
return twoArg(lnum, stmtnum, args, (lh,rh) => (lh > rh) ? rh : lh); return twoArg(lnum, stmtnum, args, (lh,rh) => (lh > rh) ? rh : lh);

View File

@@ -1,3 +0,0 @@
10 DEFUN FAC(N)=IF N==0 THEN 1 ELSE N*FAC(N-1)
20 K=MAP FAC, 1 TO 10
30 PRINT K

View File

@@ -1,4 +0,0 @@
10 DEFUN FAC(N)=IF N==0 THEN 1 ELSE N*FAC(N-1)
20 FOR K=1 TO 6
30 PRINT FAC(K)
40 NEXT

View File

@@ -1,4 +0,0 @@
10 DEFUN FIB(N)=IF N==0 THEN 0 ELSE IF N==1 THEN 1 ELSE FIB(N-1)+FIB(N-2)
20 FOR K=1 TO 12
30 PRINT FIB(K);" ";
40 NEXT

View File

@@ -19,36 +19,55 @@ Oh \emph{boy} we just did a computation! It printed out \code{4} which is a corr
Following program attempts to calculate a square root of the input value, showing how \code{GOTO} can be used in such manner. Following program attempts to calculate a square root of the input value, showing how \code{GOTO} can be used in such manner.
\begin{lstlisting} \begin{lstlisting}
10 X = 1337 10 X=1337
20 Y = 0.5 * X 20 Y=0.5*X
30 Z = Y 30 Z=Y
40 Y = Y-(((Y^2)-X)/(2*Y)) 40 Y=Y-((Y^2)-X)/(2*Y)
50 IF NOT(Z==Y) THEN GOTO 30 : REM 'NOT(Z==Y)' can be rewritten to 'Z<>Y' 50 IF NOT(Z==Y) THEN GOTO 30 : REM 'NOT(Z==Y)' can be rewritten to 'Z<>Y'
100 PRINT "Square root of ";X;" is approximately ";Y 100 PRINT "Square root of ";X;" is approximately ";Y
\end{lstlisting} \end{lstlisting}
Here, \code{GOTO} in line 50 is used to perform a loop, which keeps looping until \code{Z} and \code{Y} becomes equal. This is a newtonian method of approximating a square root. Here, \code{GOTO} in line 50 is used to perform a loop, which keeps looping until \code{Z} and \code{Y} becomes equal. This is a newtonian method of approximating a square root.
\section[When GOTO Is Bad]{Severe Acute Spaghettification Syndrome} \section[Subroutine with GOSUB]{What If We Wanted to Go Back?}
But \code{GOTO} only jumps, you can't jump \emph{back}. Well, not with that attitute; you \emph{can} go back with \code{GOSUB} and \code{RETURN} statement.
This program will draw a triangle, where the actual drawing part is on line 100--160, and only get jumped into it when needed.
\section[Subroutine with GOSUB]{GOSUB to the rescue!} \begin{lstlisting}
10 GOTO 1000
100 REM subroutine to draw a segment. Size is stored to 'Q'
110 PRINT SPC(20-Q);
120 Q1=1 : REM loop counter for this subroutine
130 PRINT "*";
140 Q1=Q1+1
150 IF Q1<=Q*2-1 THEN GOTO 130
160 PRINT : RETURN : REM this line will take us back from the jump
1000 Q=1 : REM this is our loop counter
1010 GOSUB 100
1020 Q=Q+1
1030 IF Q<=20 THEN GOTO 1010
\end{lstlisting}
\section[FOR--NEXT Loop]{FOR ever loop NEXT} \section[FOR--NEXT Loop]{FOR ever loop NEXT}
So you can make a loop using \code{GOTO}s here and there, but they \emph{totally suck}, too much spaphetti crashes your cerebral cortex faster than \emph{Crash Bandicoot 2}. Fortunately, there's better way to go about that: the FOR--NEXT loop! As we've just seen, you can make loops using \code{GOTO}s here and there, but they \emph{totally suck}, too much spaphetti crashes your cerebral cortex faster than \emph{Crash Bandicoot 2}. Fortunately, there's a better way to go about that: the FOR--NEXT loop!
\begin{lstlisting} \begin{lstlisting}
10 FOR I = 1 TO 20 10 GOTO 1000
20 PRINT SPC(20-I); 100 REM subroutine to draw a segment. Size is stored to 'Q'
30 FOR J = 1 TO I*2-1 110 PRINT SPC(20-Q);
40 PRINT "*"; 120 FOR Q1=1 TO Q*2-1
50 NEXT:PRINT 130 PRINT "*";
60 NEXT 140 NEXT : PRINT
150 RETURN
1000 FOR Q=1 TO 20
1010 GOSUB 100
1020 NEXT
\end{lstlisting} \end{lstlisting}
When executed, this program print out triangles of stars. Still not convinced? Try to write a same program with \code{GOTO}s. When executed, this program print out \emph{exactly the same} triangle, but code is much more straightforward thanks to the \code{FOR} statement.
\section[Get User INPUT]{Isn't It Nice To Have a Computer That Will Question You?} \section[Get User INPUT]{Isn't It Nice To Have a Computer That Will Question You?}
@@ -67,17 +86,22 @@ This short program will ask your name, and then it will greet you by the name yo
Consider the following code: Consider the following code:
\begin{lstlisting} \begin{lstlisting}
(code with many repeating phrases) 10 DEFUN POW2(N)=2^N
20 DEFUN DCOS(N)=COS(PI*N/180)
30 FOR X=0 TO 8
40 PRINT X,POW2(X)
50 NEXT
60 PRINT "----------------"
70 FOREACH A=0!45!90!135!180!NIL
80 PRINT A,DCOS(A)
90 NEXT
\end{lstlisting} \end{lstlisting}
As you can clearly see, it has way too many repeating phrase: \code{i'm redundant!} Would it be nice to tidy it up, but much cooler and in \emph{one-liner}? Here, we have defined two functions to use in the program: \code{POW2} and \code{DCOS2}. Also observe that functions are defined using variable \code{N}s, but we use them with \code{X} in line 40 and with \code{A} in line 80: yes, functions can have their local name so you don't have to carefully choose which variable name to use in your subroutine.
Lo and behold, the \code{DEFUN}! You can define a \emph{function} in a single line using it, and it even re-names the variable so you don't have to worry about unintended name collisions like when you were playing with \code{GOSUB}s! Except a function can't have statements that spans 2- or more BASIC lines; but there are ways to get around that, including \code{DO} statement and \emph{functional currying}.
\begin{lstlisting}
(same code but better)
\end{lstlisting}
This sample program also shows \code{FOREACH} statement, which is same as \code{FOR} but works with arrays.
\section[Recursion]{BRB: Bad Recursion BRB: Bad Recursion BRB: Bad Recursion BRB: Bad RecursionBRB: Bad Recursion BRBRangeError: Maximum call stack size exceeded} \section[Recursion]{BRB: Bad Recursion BRB: Bad Recursion BRB: Bad Recursion BRB: Bad RecursionBRB: Bad Recursion BRBRangeError: Maximum call stack size exceeded}
@@ -129,7 +153,7 @@ Here, \code{K} will contain the values of $1!$, $2!$ \ldots\ $10!$. We're just p
\section[Currying]{Haskell Curry Wants to Know Your Location} \section[Currying]{Haskell Curry Wants to Know Your Location}
\label{currying101} \label{currying101}
So what the fsck is currying? Consider the following code: Two pages ago there was a mentioning about something called \emph{functional currying}. So what the fsck is currying? Consider the following code:
\begin{lstlisting} \begin{lstlisting}
10 DEFUN F(K,T)=ABS(T)==K 10 DEFUN F(K,T)=ABS(T)==K

View File

@@ -251,6 +251,19 @@ Code & Operation & Result \\
\emph{Currying} is an operation that returns new function that has given value applied to the original function's first parameter. See \ref{currying101} for tutorials. \emph{Currying} is an operation that returns new function that has given value applied to the original function's first parameter. See \ref{currying101} for tutorials.
\section{Constants}
Some variables are pre-defined on the language itself and cannot be modified; such variables are called \emph{constants}.
\begin{tabulary}{\textwidth}{rlL}
Name & Type & Value \\
\hline
NIL & Array & Empty Array \\
PI & Number & $3.141592653589793$ \\
TAU & Number & $6.283185307179586$ \\
EULER & Number & $2.718281828459045$
\end{tabulary}
\section{Syntax In EBNF} \section{Syntax In EBNF}
If you're \emph{that} into the language theory of computer science, texts above are just waste of bytes/inks/pixel-spaces/whatever; this little section should be more than enough! If you're \emph{that} into the language theory of computer science, texts above are just waste of bytes/inks/pixel-spaces/whatever; this little section should be more than enough!

View File

@@ -0,0 +1,17 @@
This is a sample program that prints out the infamous \emph{99 Bottles of Beer}.
\begin{lstlisting}
10 FOR I = 99 TO 1 STEP -1
20 MODE = 1
30 GOSUB 12
40 PRINT I;" bottle";BOTTLES;" of beer on the wall, ";i;" bottle";BOTTLES;" of beer."
50 MODE = 2
60 GOSUB 12
70 PRINT "Take one down and pass it around, ";(I-1);" bottle";BOTTLES;" of beer on the wall."
80 NEXT
90 PRINT "No more bottles of beer on the wall, no more bottles of beer."
100 PRINT "Go to the store and buy some more. 99 bottles of beer on the wall."
110 END
120 IF I == MODE THEN BOTTLES = "" ELSE BOTTLES = "s"
130 RETURN
\end{lstlisting}

View File

@@ -0,0 +1,142 @@
This is a sample program that draw a randomised maze. The original program was on \emph{BASIC Computer Games: Microcomputer Edition} and was translated into \tbas.
\begin{lstlisting}
1 OPTIONBASE 1
10 PRINT SPC(28);"AMAZING PROGRAM"
20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
30 PRINT:PRINT:PRINT
100 PRINT "WHAT ARE YOUR WIDTH";:INPUT H
102 PRINT "WHAT ARE YOUR LENGTH";:INPUT V
105 IF H<>1 AND V<>1 THEN GOTO 110
106 PRINT "MEANINGLESS DIMENSIONS. TRY AGAIN.":GOTO 100
110 WS=DIM(H,V):VS=DIM(H,V)
120 PRINT:PRINT:PRINT:PRINT
160 Q=0:Z=0:X=INT(RND(1)*H+1)
165 FOR I=1 TO H
170 IF I==X THEN GOTO 173
171 PRINT ".--";
172 GOTO 175
173 PRINT ". ";
180 NEXT
190 PRINT "."
195 C=1:WS(X,1)=C:C=C+1
200 R=X:S=1:GOTO 260
210 IF R<>H THEN GOTO 240
215 IF S<>V THEN GOTO 230
220 R=1:S=1
222 GOTO 250
230 R=1:S=S+1:GOTO 250
240 R=R+1
250 IF WS(R,S)==0 THEN GOTO 210
260 IF R-1==0 THEN GOTO 530
265 IF WS(R-1,S)<>0 THEN GOTO 530
270 IF S-1==0 THEN GOTO 390
280 IF WS(R,S-1)<>0 THEN GOTO 390
290 IF R==H THEN GOTO 330
300 IF WS(R+1,S)<>0 THEN GOTO 330
310 X=INT(RND(1)*3+1)
320 ON X GOTO 790,820,860
334 IF Z==1 THEN GOTO 370
338 Q=1:GOTO 350
340 IF WS(R,S+1)<>0 THEN GOTO 370
350 X=INT(RND(1)*3+1)
360 ON X GOTO 790,820,910
370 X=INT(RND(1)*2+1)
380 ON X GOTO 790,820
390 IF R==H THEN GOTO 470
400 IF WS(R+1,S)<>0 THEN GOTO 470
405 IF S<>V THEN GOTO 420
410 IF Z==1 THEN GOTO 450
415 Q=1:GOTO 430
420 IF WS(R,S+1)<>0 THEN GOTO 450
430 X=INT(RND(1)*3+1)
440 ON X GOTO 790,860,910
450 X=INT(RND(1)*2+1)
460 ON X GOTO 790,860
470 IF S<>V THEN GOTO 490
480 IF Z==1 THEN GOTO 520
485 Q=1:GOTO 500
490 IF WS(R,S+1)<>0 THEN GOTO 520
500 X=INT(RND(1)*2+1)
510 ON X GOTO 790,910
520 GOTO 790
530 IF S-1==0 THEN GOTO 670
540 IF WS(R,S-1)<>0 THEN GOTO 670
545 IF R==H THEN GOTO 610
547 IF WS(R+1,S)<>0 THEN GOTO 610
550 IF S<>V THEN GOTO 560
552 IF Z==1 THEN GOTO 590
554 Q=1:GOTO 570
560 IF WS(R,S+1)<>0 THEN GOTO 590
570 X=INT(RND(1)*3+1)
580 ON X GOTO 820,860,910
590 X=INT(RND(1)*2+1)
600 ON X GOTO 820,860
610 IF S<>V THEN GOTO 630
620 IF Z==1 THEN GOTO 660
625 Q=1:GOTO 640
630 IF WS(R,S+1)<>0 THEN GOTO 660
640 X=INT(RND(1)*2+1)
650 ON X GOTO 820,910
660 GOTO 820
670 IF R==H THEN GOTO 740
680 IF WS(R+1,S)<>0 THEN GOTO 740
685 IF S<>V THEN GOTO 700
690 IF Z==1 THEN GOTO 730
695 Q=1:GOTO 830
700 IF WS(R,S+1)<>0 THEN GOTO 730
710 X=INT(RND(1)*2+1)
720 ON X GOTO 860,910
730 GOTO 860
740 IF S<>V THEN GOTO 760
750 IF Z==1 THEN GOTO 780
755 Q=1:GOTO 770
760 IF WS(R,S+1)<>0 THEN GOTO 780
770 GOTO 910
780 GOTO 1000
790 WS(R-1,S)=C
800 C=C+1:VS(R-1,S)=2:R=R-1
810 IF C==H*V+1 THEN GOTO 1010
815 Q=0:GOTO 260
820 WS(R,S-1)=C
830 C=C+1
840 VS(R,S-1)=1:S=S-1:IF C==H*V+1 THEN GOTO 1010
850 Q=0:GOTO 260
860 WS(R+1,S)=C
870 C=C+1:IF VS(R,S)==0 THEN GOTO 880
875 VS(R,S)=3:GOTO 890
880 VS(R,S)=2
890 R=R+1
900 IF C==H*V+1 THEN GOTO 1010
905 GOTO 530
910 IF Q==1 THEN GOTO 960
920 WS(R,S+1)=C:C=C+1:IF VS(R,S)==0 THEN GOTO 940
930 VS(R,S)=3:GOTO 950
940 VS(R,S)=1
950 S=S+1:IF C==H*V+1 THEN GOTO 1010
955 GOTO 260
960 Z=1
970 IF VS(R,S)==0 THEN GOTO 980
975 VS(R,S)=3:Q=0:GOTO 1000
980 VS(R,S)=1:Q=0:R=1:S=1:GOTO 250
1000 GOTO 210
1010 FOR J=1 TO V
1011 PRINT "|";
1012 FOR I=1 TO H
1013 IF VS(I,J)<2 THEN GOTO 1030
1020 PRINT " ";
1021 GOTO 1040
1030 PRINT " |";
1040 NEXT
1041 PRINT
1043 FOR I=1 TO H
1045 IF VS(I,J)==0 THEN GOTO 1060
1050 IF VS(I,J)==2 THEN GOTO 1060
1051 PRINT ": ";
1052 GOTO 1070
1060 PRINT ":--";
1070 NEXT
1071 PRINT "."
1072 NEXT
1073 END
\end{lstlisting}

View File

@@ -0,0 +1,142 @@
This is a sample program that is the \emph{Hamurabi} game. The original program was on \emph{BASIC Computer Games: Microcomputer Edition} and was translated into \tbas. This game is considered as the great ancestor of the strategy, simulation and city-building games; in fact it's so great it has got its own Wikipedia article.
\begin{lstlisting}
10 PRINT SPC(32);"HAMURABI"
20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
30 PRINT:PRINT:PRINT
80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"
90 PRINT "FOR A TEN-YEAR TERM OF OFFICE.":PRINT
95 D1=0:P1=0
100 Z=0:P=95:S=2800:H=3000:E=H-S
110 Y=3:A=H/Y:I=5:Q=1
210 D=0
215 PRINT:PRINT:PRINT "HAMURABI: I BEG TO REPORT TO YOU,":Z=Z+1
217 PRINT "IN YEAR ";Z;", ";D;" PEOPLE STARVED, ";I;" CAME TO THE CITY,"
220 P=P+I
227 IF Q>0 THEN GOTO 230
228 P=INT(P/2)
229 PRINT "A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED."
230 PRINT "POPULATION IS NOW ";P
232 PRINT "THE CITY NOW OWNS ";A;" ACRES."
235 PRINT "YOU HARVESTED ";Y;" BUSHELS PER ACRE."
250 PRINT "THE RATS ATE ";E;" BUSHELS."
260 PRINT "YOU NOW HAVE ";S;" BUSHELS IN STORE."
261 PRINT
270 IF Z==11 THEN GOTO 860
310 C=INT(10*RND(1))
311 Y=C+17
312 PRINT "LAND IS TRADING AT ";Y;" BUSHELS PER ACRE."
320 PRINT "HOW MANY ACRES DO YOU WISH TO BUY";
321 INPUT Q
322 IF Q<0 THEN GOTO 850
323 IF Y*Q<=S THEN GOTO 330
324 GOSUB 710
325 GOTO 320
330 IF Q==0 THEN GOTO 340
331 A=A+Q:S=S-Y*Q:C=0
334 GOTO 400
340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL";
341 INPUT Q
342 IF Q<0 THEN GOTO 850
343 IF Q<A THEN GOTO 350
344 GOSUB 720
345 GOTO 340
350 A=A-Q:S=S+Y*Q:C=0
400 PRINT
410 PRINT "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE";
411 INPUT Q
412 IF Q<0 THEN GOTO 850
418 REM *** TRYING TO USE MORE GRAIN THAN IS IN SILOS?
420 IF Q<=S THEN GOTO 430
421 GOSUB 710
422 GOTO 410
430 S=S-Q:C=1:PRINT
440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED";
441 INPUT D
442 IF D==0 THEN GOTO 511
443 IF D<0 THEN GOTO 850
444 REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN?
445 IF D<=A THEN GOTO 450
446 GOSUB 720
447 GOTO 440
449 REM *** ENOUGH GRAIN FOR SEED?
450 IF INT(D/2)<=S THEN GOTO 455
452 GOSUB 710
453 GOTO 440
454 REM *** ENOUGH PEOPLE TO TEND THE CROPS?
455 IF D<10*P THEN GOTO 510
460 PRINT "BUT YOU HAVE ONLY ";P;" PEOPLE TO TEND THE FIELDS! NOW THEN,"
470 GOTO 440
510 S=S-INT(D/2)
511 GOSUB 800
512 REM *** A BOUNTIFUL HARVEST!
515 Y=C:H=D*Y:E=0
521 GOSUB 800
522 IF INT(C/2)<>C/2 THEN GOTO 530
523 REM *** RATS ARE RUNNING WILD!!
525 E=INT(S/C)
530 S=S-E+H
531 GOSUB 800
532 REM *** LET'S HAVE SOME BABIES
533 I=INT(C*(20*A+S)/P/100+1)
539 REM *** HOW MANY PEOPLE HAD FULL TUMMIES?
540 C=INT(Q/20)
541 REM *** HORROS, A 15% CHANCE OF PLAGUE
542 Q=INT(10*(2*RND(1)-0.3))
550 IF P<C THEN GOTO 210
551 REM *** STARVE ENOUGH FOR IMPEACHMENT?
552 D=P-C
553 IF D>0.45*P THEN GOTO 560
554 P1=((Z-1)*P1+D*100/P)/Z
555 P=C
556 D1=D1+D
557 GOTO 215
560 PRINT
561 PRINT "YOU STARVED ";D;" PEOPLE IN ONE YEAR!!!"
565 PRINT "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY"
566 PRINT "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE"
567 PRINT "ALSO BEEN DECLARED NATIONAL FINK!!!!"
568 GOTO 990
710 PRINT "HAMURABI: THINK AGAIN. YOU HAVE ONLY"
711 PRINT S;" BUSHELS OF GRAIN. NOW THEN,"
712 RETURN
720 PRINT "HAMURABI: THINK AGAIN. YOU OWN ONLY ";A;" ACRES. NOW THEN,"
730 RETURN
800 C=INT(RND(1)*5)+1
801 RETURN
850 PRINT
851 PRINT "HAMURABI: I CANNOT DO WHAT YOU WISH."
855 PRINT "GET YOURSELF ANOTHER STEWARD!!!!!"
857 GOTO 990
860 PRINT "IN YOUR 10-YEAR TERM OF OFFICE, ";P1;" PERCENT OF THE"
862 PRINT "POPULATION STARVED PER YEAR ON THE AVERAGE, I.E. A TOTAL OF"
865 PRINT D1;"PEOPLE DIED!!"
866 L=A/P
870 PRINT "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH"
875 PRINT L;"ACRES PER PERSON."
876 PRINT
880 IF P1>33 THEN GOTO 565
885 IF L<7 THEN GOTO 565
890 IF P1>10 THEN GOTO 940
892 IF L<9 THEN GOTO 940
895 IF P1>3 THEN GOTO 960
896 IF L<10 THEN GOTO 960
900 PRINT "A FANTASTIC PERFORMANCE!!! CHARLEMANGE, DISRAELI, AND"
905 PRINT "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!"
906 GOTO 990
940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV."
945 PRINT "THE PEOPLE (REMIANING) FIND YOU AN UNPLEASANT RULER, AND,"
950 PRINT "FRANKLY, HATE YOUR GUTS!!"
951 GOTO 990
960 PRINT "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT"
965 PRINT "REALLY WASN'T TOO BAD AT ALL. ";INT(P*0.8*RND(1));" PEOPLE"
970 PRINT "WOULD DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR"
975 PRINT "TRIVIAL PROBLEMS."
990 PRINT
991 FOR N=1 TO 10
992 PRINT EMIT(7;)
993 NEXT
995 PRINT "SO LONG FOR NOW."
996 PRINT
999 END
\end{lstlisting}

View File

@@ -203,8 +203,18 @@
\chapter{Bibliography} \chapter{Bibliography}
\input{bibliography} \input{bibliography}
\part{More Goodies}
\chapter*{Disclaimers} \chapter{99 Bottles of Beer}
\input{sample_99}
\chapter{Amazing}
\input{sample_amazing}
\chapter{Hamurabi}
\input{sample_hamurabi}
\chapter{Disclaimers}
\oreallypress{} is entirely fictional publishing entity; \oreallypress{} has no affiliation whatsoever with any of the real-world publishers. \oreallypress{} is entirely fictional publishing entity; \oreallypress{} has no affiliation whatsoever with any of the real-world publishers.