TerranBASIC: installing sample BASIC codes on new run

This commit is contained in:
minjaesong
2023-04-15 12:24:53 +09:00
parent 9fa543af53
commit e2c0f13019
36 changed files with 618 additions and 12 deletions

View File

@@ -5,8 +5,7 @@ import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import net.torvald.tsvm.peripheral.*; import net.torvald.tsvm.peripheral.*;
import java.io.File; import java.io.*;
import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
public class TerranBASIC { public class TerranBASIC {
@@ -17,22 +16,77 @@ public class TerranBASIC {
public static int WIDTH = 640; public static int WIDTH = 640;
public static int HEIGHT = 480; public static int HEIGHT = 480;
public static String OSName = System.getProperty("os.name");
public static String OSVersion = System.getProperty("os.version");
public static String diskDir = "My_BASIC_Programs"; public static String operationSystem;
/** %appdata%/TerranBASIC, without trailing slash */
public static String defaultDir;
/** For Demo version only. defaultDir + "/Saves", without trailing slash */
public static String diskDir;
private static void createDirs() { private static void getDefaultDirectory() {
File[] dirs = { String OS = OSName.toUpperCase();
new File(diskDir) if (OS.contains("WIN")) {
}; operationSystem = "WINDOWS";
defaultDir = System.getenv("APPDATA") + "/TerranBASIC";
for (File it : dirs) {
if (!it.exists())
it.mkdirs();
} }
else if (OS.contains("OS X") || OS.contains("MACOS")) { // OpenJDK for mac will still report "Mac OS X" with version number "10.16", even on Big Sur and beyond
operationSystem = "OSX";
defaultDir = System.getProperty("user.home") + "/Library/Application Support/TerranBASIC";
}
else if (OS.contains("NUX") || OS.contains("NIX") || OS.contains("BSD")) {
operationSystem = "LINUX";
defaultDir = System.getProperty("user.home") + "/.TerranBASIC";
}
else if (OS.contains("SUNOS")) {
operationSystem = "SOLARIS";
defaultDir = System.getProperty("user.home") + "/.TerranBASIC";
}
else {
operationSystem = "UNKNOWN";
defaultDir = System.getProperty("user.home") + "/.TerranBASIC";
}
diskDir = defaultDir + "/My_Programs";
System.out.println(String.format("os.name = %s (with identifier %s)", OSName, operationSystem));
System.out.println(String.format("os.version = %s", OSVersion));
System.out.println(String.format("default directory: %s", defaultDir));
System.out.println(String.format("java version = %s", System.getProperty("java.version")));
}
private static void installSamplePrograms() {
System.out.println("Installing sample programs...");
String[] samplePrograms = {"99.bas","amazing.bas","array.bas","array0.bas","brb.bas","closure.bas","currying.bas","downkeys.bas","facclosure.bas","facmap.bas","factorial.bas","fib2.bas","fib3.bas","fibonacci.bas","funs.bas","hamurabi.bas","hangman.bas","highorder.bas","monadlaws.bas","monadlaws2.bas","myfirst.bas","plotter.bas","qsort.bas","recursion.bas","rmaze.bas","sqrt.bas","triangle1.bas","triangle2.bas","writermonad.bas","yourname.bas"};
for (String s : samplePrograms) {
try {
byte[] prg = TerranBASIC.class.getClassLoader().getResourceAsStream("net/torvald/tsvm/TerranBasicSamplePrograms/"+s).readAllBytes();
OutputStream prgOs = new BufferedOutputStream(new FileOutputStream(new File(diskDir, s)));
prgOs.write(prg);
prgOs.flush();prgOs.close();
System.out.println(s);
}
catch (IOException e) {
System.out.println(("Failed to install " + s));
e.printStackTrace();
}
}
} }
public static void main(String[] args) { public static void main(String[] args) {
createDirs(); getDefaultDirectory();
File myProgramsDir = new File(diskDir);
if (!myProgramsDir.exists()) {
if (myProgramsDir.mkdirs())
installSamplePrograms();
}
ShaderProgram.pedantic = false; ShaderProgram.pedantic = false;

View File

@@ -0,0 +1,13 @@
10 FOR I = 99 TO 1 STEP -1
20 MODE = 1
30 GOSUB 120
40 PRINT I;" bottle";BOTTLES;" of beer on the wall, ";i;" bottle";BOTTLES;" of beer."
50 MODE = 2
60 GOSUB 120
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

View File

@@ -0,0 +1,138 @@
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

View File

@@ -0,0 +1,7 @@
10 A={{"O","X","O"},{"X","O","X"},{"X","X","O"}}
20 FOR Y=0 TO LEN(A)-1
30 FOR X=0 TO LEN(A(Y))-1
40 PRINT(A(Y,X);" ";)
50 NEXT
60 PRINT
70 NEXT

View File

@@ -0,0 +1,7 @@
10 A={2,3,5,7,11,13,17}
100 FOR K=0 TO LEN(A)-1
110 PRINT A(K)
120 NEXT
200 FOREACH AK=A
210 PRINT AK
220 NEXT

View File

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

View File

@@ -0,0 +1,2 @@
10 F=[X]~>MAP([X]~>[X]<=5,X)
20 PRINT F(1 TO 10)

View File

@@ -0,0 +1,4 @@
10 DEFUN F(K,T)=ABS(T)==K
20 CF=F~<32
30 PRINT CF(24) : REM will print 'false'
40 PRINT CF(-32) : REM will print 'true'

View File

@@ -0,0 +1,2 @@
10 PRINT GETKEYSDOWN()
20 GOTO 10

View File

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

View File

@@ -0,0 +1,3 @@
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

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

View File

@@ -0,0 +1,5 @@
10 FIB_=[N,M]~>IF LEN(MJOIN(M))>=N THEN HEAD(MJOIN(M)) ELSE FIB_(N,M>>=([XS]~>MRET((XS(0)+XS(1))!XS)))
11 FIB=[N]~>FIB_(N,MRET({1,1}))
100 FOR K=1 TO 10
110 PRINT FIB(K);" ";
120 NEXT

View File

@@ -0,0 +1,4 @@
10 FIB = [N,M] ~> IF (M==UNDEFINED) THEN FIB(N, MRET({1, 1})) ELSE IF (LEN(MJOIN(M)) >= N) THEN HEAD(MJOIN(M)) ELSE FIB(N, M >>= ([XS] ~> MRET((XS(0) + XS(1)) ! XS)))
20 FOR K = 1 TO 10
30 PRINT FIB(K);" ";
40 NEXT

View File

@@ -0,0 +1,4 @@
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 10
30 PRINT FIB(K);" ";
40 NEXT

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}
80 PRINT A,DCOS(A)
90 NEXT

View File

@@ -0,0 +1,138 @@
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 EMIT 7;
993 NEXT
995 PRINT "SO LONG FOR NOW."
996 PRINT
999 END

View File

@@ -0,0 +1,83 @@
1 OPTIONBASE 1
10 PRINT SPC(32);"HANGMAN"
20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
21 PRINT:PRINT SPC(14);"EDITOR'S NOTE: ALWAYS TYPE IN CAPITAL LETTERS!"
25 PRINT:PRINT
30 PSTR=DIM(12,12):LSTR=DIM(20):DSTR=DIM(20):NSTR=DIM(26):U=DIM(50)
40 C=1: N=50
50 FOR I=1 TO 20: DSTR(I)="-": NEXT: M=0
60 FOR I=1 TO 26: NSTR(I)="": NEXT
70 FOR I=1 TO 12: FOR J=1 TO 12: PSTR(I,J)=" ": NEXT: NEXT
80 FOR I=1 TO 12: PSTR(I,1)="X": NEXT
90 FOR I=1 TO 7: PSTR(1,I)="X": NEXT: PSTR(2,7)="X"
95 IF C<N THEN GOTO 100
97 PRINT "YOU DID ALL THE WORDS!!": END
100 Q=INT(N*RND(1))+1
110 IF U(Q)==1 THEN GOTO 100
115 U(Q)=1: C=C+1: RESTORE: T1=0
150 FOR I=1 TO Q: READ ASTR: NEXT
160 L=LEN(ASTR): FOR I=1 TO LEN(ASTR): LSTR(I)=MID(ASTR,I,1): NEXT
170 PRINT "HERE ARE THE LETTERS YOU USED:"
180 FOR I=1 TO 26: PRINT NSTR(I);: IF NSTR(I+1)=="" THEN GOTO 200
190 PRINT ",";: NEXT
200 PRINT: PRINT: FOR I=1 TO L: PRINT DSTR(I);: NEXT: PRINT: PRINT
210 PRINT "WHAT IS YOUR GUESS";:INPUT GSTR: R=0
220 FOR I=1 TO 26: IF NSTR(I)=="" THEN GOTO 250
230 IF GSTR==NSTR(I) THEN DO(PRINT "YOU GUESSED THAT LETTER BEFORE!"; GOTO 170)
240 NEXT: PRINT "PROGRAM ERROR. RUN AGAIN.": END
250 NSTR(I)=GSTR: T1=T1+1
260 FOR I=1 TO L: IF LSTR(I)==GSTR THEN GOTO 280
270 NEXT: IF R==0 THEN GOTO 290
275 GOTO 300
280 DSTR(I)=GSTR: R=R+1: GOTO 270
290 M=M+1: GOTO 400
300 FOR I=1 TO L: IF DSTR(I)=="-" THEN GOTO 320
310 NEXT: GOTO 390
320 PRINT: FOR I=1 TO L: PRINT DSTR(I);: NEXT: PRINT: PRINT
330 PRINT "WHAT IS YOUR GUESS FOR THE WORD";:INPUT BSTR
340 IF ASTR==BSTR THEN GOTO 360
350 PRINT "WRONG. TRY ANOTHER LETTER.": PRINT: GOTO 170
360 PRINT "RIGHT!! IT TOOK YOU ";T1;" GUESSES!"
370 PRINT "WANT ANOTHER WORD";:INPUT WSTR: IF WSTR=="YES" THEN GOTO 50
380 PRINT: PRINT "IT'S BEEN FUN! BYE FOR NOW.": GOTO 999
390 PRINT "YOU FOUND THE WORD!": GOTO 370
400 PRINT: PRINT: PRINT"SORRY, THAT LETTER ISN'T IN THE WORD."
410 ON M GOTO 415,420,425,430,435,440,445,450,455,460
415 PRINT "FIRST, WE DRAW A HEAD": GOTO 470
420 PRINT "NOW WE DRAW A BODY.": GOTO 470
425 PRINT "NEXT WE DRAW AN ARM.": GOTO 470
430 PRINT "THIS TIME IT'S THE OTHER ARM.": GOTO 470
435 PRINT "NOW, LET'S DRAW THE RIGHT LEG.": GOTO 470
440 PRINT "THIS TIME WE DRAW THE LEFT LEG.": GOTO 470
445 PRINT "NOW WE PUT UP A HAND.": GOTO 470
450 PRINT "NEXT THE OTHER HAND.": GOTO 470
455 PRINT "NOW WE DRAW ONE FOOT": GOTO 470
460 PRINT "HERE'S THE OTHER FOOT -- YOU'RE HUNG!!"
470 ON M GOTO 480,490,500,510,520,530,540,550,560,570
480 PSTR(3,6)="-": PSTR(3,7)="-": PSTR(3,8)="-": PSTR(4,5)="(": PSTR(4,6)="."
481 PSTR(4,8)=".":PSTR(4,9)=")":PSTR(5,6)="-":PSTR(5,7)="-":PSTR(5,8)="-":GOTO 580
490 FOR I=6 TO 9: PSTR(I,7)="X": NEXT: GOTO 580
500 FOR I=4 TO 7: PSTR(I,I-1)="\": NEXT: GOTO 580
510 PSTR(4,11)="/": PSTR(5,10)="/": PSTR(6,9)="/": PSTR(7,8)="/": GOTO 580
520 PSTR(10,6)="/": PSTR(11,5)="/": GOTO 580
530 PSTR(10,8)="\": PSTR(11,9)="\": GOTO 580
540 PSTR(3,11)="\": GOTO 580
550 PSTR(3,3)="/": GOTO 580
560 PSTR(12,10)="\": PSTR(12,11)="-": GOTO 580
570 PSTR(12,3)="-": PSTR(12,4)="/"
580 FOR I=1 TO 12: FOR J=1 TO 12: PRINT PSTR(I,J);: NEXT
590 PRINT: NEXT: PRINT: PRINT: IF M<>10 THEN GOTO 170
600 PRINT "SORRY, YOU LOSE. THE WORD WAS ";ASTR
610 PRINT "YOU MISSED THAT ONE. DO YOU ";: GOTO 370
620 PRINT "TYPE YES OR NO";:INPUT YSTR: IF LEFT(YSTR,1)=="Y" THEN GOTO 50
700 DATA "GUM","SIN","FOR","CRY","LUG","BYE","FLY"
710 DATA "UGLY","EACH","FROM","WORK","TALK","WITH","SELF"
720 DATA "PIZZA","THING","FEIGN","FIEND","ELBOW","FAULT","DIRTY"
730 DATA "BUDGET","SPIRIT","QUAINT","MAIDEN","ESCORT","PICKAX"
740 DATA "EXAMPLE","TENSION","QUININE","KIDNEY","REPLICA","SLEEPER"
750 DATA "TRIANGLE","KANGAROO","MAHOGANY","SERGEANT","SEQUENCE"
760 DATA "MOUSTACHE","DANGEROUS","SCIENTIST","DIFFERENT","QUIESCENT"
770 DATA "MAGISTRATE","ERRONEOUSLY","LOUDSPEAKER","PHYTOTOXIC"
780 DATA "MATRIMONIAL","PARASYMPATHOMIMETIC","THIGMOTROPISM"
990 PRINT "BYE NOW"
999 END

View File

@@ -0,0 +1,4 @@
10 DEFUN APPLY(F,X)=F(X)
20 DEFUN FUN(X)=X^2
30 K=APPLY(FUN,42)
40 PRINT K

View File

@@ -0,0 +1,25 @@
10 F=[X]~>X*2 : G=[X]~>X^3 : RETN=[X]~>MRET(X)
100 PRINT:PRINT "First law: 'return a >>= k' equals to 'k a'"
110 K=[X]~>RETN(F(X)) : REM K is monad-returning function
120 A=42
130 KM=RETN(A)>>=K
140 KO=K(A)
150 PRINT("KM is ";TYPEOF(KM);", ";MJOIN(KM))
160 PRINT("KO is ";TYPEOF(KO);", ";MJOIN(KO))
200 PRINT:PRINT "Second law: 'm >>= return' equals to 'm'"
210 M=MRET(G(42))
220 MM=M>>=RETN
230 MO=M
240 PRINT("MM is ";TYPEOF(MM);", ";MJOIN(MM))
250 PRINT("MO is ";TYPEOF(MO);", ";MJOIN(MO))
300 PRINT:PRINT "Third law: 'm >>= (\x -> k x >>= h)' equals to '(m >>= k) >>= h'"
310 REM see line 110 for the definition of K
320 H=[X]~>RETN(G(X)) : REM H is monad-returning function
330 M=MRET(69)
340 M1=M>>=([X]~>K(X)>>=H)
350 M2=(M>>=K)>>=H
360 PRINT("M1 is ";TYPEOF(M1);", ";MJOIN(M1))
370 PRINT("M2 is ";TYPEOF(M2);", ";MJOIN(M2))

View File

@@ -0,0 +1,25 @@
10 F=[X]~>RETN(X~LAST(X)*2) : G=[X]~>RETN(X~LAST(X)^3) : RETN=[X]~>MRET(X)
100 PRINT:PRINT "First law: 'return a >>= k' equals to 'k a'"
110 K=[X]~>F(X) : REM K is monad-returning function
120 A=42!NIL
130 KM=RETN(A)>>=K
140 KO=K(A)
150 PRINT("KM is ";TYPEOF(KM);", ";MJOIN(KM))
160 PRINT("KO is ";TYPEOF(KO);", ";MJOIN(KO))
200 PRINT:PRINT "Second law: 'm >>= return' equals to 'm'"
210 M=G(42!NIL)
220 MM=M>>=RETN
230 MO=M
240 PRINT("MM is ";TYPEOF(MM);", ";MJOIN(MM))
250 PRINT("MO is ";TYPEOF(MO);", ";MJOIN(MO))
300 PRINT:PRINT "Third law: 'm >>= (\x -> k x >>= h)' equals to '(m >>= k) >>= h'"
310 REM see line 110 for the definition of K
320 H=[X]~>G(X) : REM H is monad-returning function
330 M=RETN(69!NIL)
340 M1=M>>=([X]~>K(X)>>=H)
350 M2=(M>>=K)>>=H
360 PRINT("M1 is ";TYPEOF(M1);", ";MJOIN(M1))
370 PRINT("M2 is ";TYPEOF(M2);", ";MJOIN(M2))

View File

@@ -0,0 +1 @@
10 PRINT(2+2)

View File

@@ -0,0 +1,9 @@
1 ZEROLINE=10
2 AMP=20
10 DEFUN SINC(P)=IF P==0 THEN 1.0 ELSE SIN(P)/P
20 DEFUN TOCHAR(P,X)=IF (X==ROUND(ZEROLINE+P*AMP)) THEN "@" ELSE IF (X==ZEROLINE) THEN "|" ELSE CHR(250)
30 DEFUN SCONCAT(ACC,S)=ACC+S
40 DEFUN PLOTLINE(F,X)=FOLD(SCONCAT,"",MAP(TOCHAR~<F(X),1 TO ZEROLINE+AMP))
100 FOR I=-40 TO 40
110 PRINT PLOTLINE(SINC,I)
120 NEXT

View File

@@ -0,0 +1,4 @@
10 QSORT = [XS] ~> IF (LEN(XS) < 1) THEN NIL ELSE QSORT(FILTER([X] ~> X < HEAD XS, TAIL XS)) # {HEAD XS} # QSORT(FILTER([X] ~> X >= HEAD XS, TAIL XS))
100 L={7,9,4,5,2,3,1,8,6}
110 PRINT L
120 PRINT QSORT(L)

View File

@@ -0,0 +1,3 @@
10 DEFUN F(STR,XS)=IF (XS==UNDEFINED) THEN F(STR,{}) ELSE IF (LEN(STR)==0) THEN XS ELSE F(RIGHT(STR,LEN(STR)-1),IF (LEN(XS)==0) THEN XS ~ {LEFT(STR,1),1} ELSE IF (XS(LEN(XS)-1,0)><LEFT(STR,1)) THEN XS ~ {LEFT(STR,1),1} ELSE INIT(XS) ~ {LEFT(STR,1),1+XS(LEN(XS)-1,1)})
100 PAIRS=F("aaaabbbccaxyzzy")
110 PRINT PAIRS

View File

@@ -0,0 +1,2 @@
10 PRINT(CHR(47+ROUND(RND(1))*45);)
20 GOTO 10

View File

@@ -0,0 +1,6 @@
10 X=1337
20 Y=0.5*X
30 Z=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'
100 PRINT "Square root of ";X;" is approximately ";Y

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

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

View File

@@ -0,0 +1,8 @@
10 WRITER=[VALUE]~>{VALUE,{}}
20 UNIT=[VALUE]~>{VALUE,{}}
30 SQUARED=[X]~>{X*X,{""+X+" WAS SQUARED. "}}
40 HALVED=[X]~>{X/2,{""+X+" WAS HALVED. "}}
50 BIND=[WRITER,TRANSFORM]~>(WRITER() >>= ([VALUELOG]~>(TRANSFORM(VALUELOG(0)) >>= ([RESULTUPDATES]~>(MRET({RESULTUPDATES(0), VALUELOG(1) # RESULTUPDATES(1)}))))))
60 PIPELOG=[WRITER,TRANSFORMS]~>FOLD(BIND,WRITER,TRANSFORMS)
100 LOGOBJ=PIPELOG(UNIT(4),{SQUARED,HALVED})
110 PRINT(LOGOBJ)

View File

@@ -0,0 +1,3 @@
10 PRINT "WHAT IS YOUR NAME";
20 INPUT NAME
30 PRINT "HELLO, ";NAME

View File

@@ -1,4 +1,6 @@
#!/bin/bash #!/bin/bash
if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi
cd "${0%/*}" cd "${0%/*}"
APPIMAGETOOL="appimagetool-x86_64.AppImage" APPIMAGETOOL="appimagetool-x86_64.AppImage"
SRCFILES="tbaslinux_arm" SRCFILES="tbaslinux_arm"

View File

@@ -1,4 +1,6 @@
#!/bin/bash #!/bin/bash
if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi
cd "${0%/*}" cd "${0%/*}"
APPIMAGETOOL="appimagetool-x86_64.AppImage" APPIMAGETOOL="appimagetool-x86_64.AppImage"
SRCFILES="tbaslinux_x86" SRCFILES="tbaslinux_x86"

View File

@@ -1,4 +1,6 @@
#!/bin/bash #!/bin/bash
if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi
cd "${0%/*}" cd "${0%/*}"
SRCFILES="tbasmac_arm" SRCFILES="tbasmac_arm"
DESTDIR="out/TerranBASIC_macOS.arm.app" DESTDIR="out/TerranBASIC_macOS.arm.app"

View File

@@ -1,4 +1,6 @@
#!/bin/bash #!/bin/bash
if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi
cd "${0%/*}" cd "${0%/*}"
SRCFILES="tbasmac_x86" SRCFILES="tbasmac_x86"
DESTDIR="out/TerranBASIC_macOS.x86.app" DESTDIR="out/TerranBASIC_macOS.x86.app"

View File

@@ -1,4 +1,6 @@
#!/bin/bash #!/bin/bash
if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi
cd "${0%/*}" cd "${0%/*}"
SRCFILES="tbaswindows_x86" SRCFILES="tbaswindows_x86"
DESTDIR="TerranBASIC_windows.x86.exe" DESTDIR="TerranBASIC_windows.x86.exe"