In my basic programs I often rely on SuperBASIC command interpreter, very useful feature whereby procedures become commands one can easily type in. However once the program gets compiled this feature seems unavailable and needs to be somehow coded in the program.
This inspired my next exercise writing simple command interpreter, I am looking for something not perfect but simple. I was thinking at first to use `ON GOSUB', but I did not figure out how to pass parameters to procedures.
This somehow does what I need, but can it be even more simplified?
`CLI' = starts the interpreter, `.' = ends it
Code: Select all
100 DEFine PROCedure CLI
110 REMark Simple Command Interpreter
120 REMark (c)tcat
130 LOCal usr$(30),cmd_no,cmd$(10),prm1,prm1$(20),prm2,prm2$(10)
140 :
150 REPeat usr_loop
160 RESTORE 430
170 INPUT#0,"> ";usr$
180 REPeat cmd_loop
190 IF EOF THEN EXIT cmd_loop
200 READ cmd_no,cmd$: IF cmd$ INSTR usr$ THEN EXIT cmd_loop
210 END REPeat cmd_loop
220 :
230 prm1$(0)=0: prm2$(0)=0
240 prm1=' ' INSTR usr$: IF prm1>0 THEN prm1$=usr$(prm1+1 TO LEN(usr$))
250 prm2=',' INSTR prm1$
260 IF prm2>0 THEN
270 prm2$=prm1$(prm2+1 TO LEN(prm1$)): prm1$=prm1$(1 TO prm2-1)
280 END IF
300 :
310 SELect ON cmd_no
320 = 1: Proc1
330 = 2: Proc2 prm1$
340 = 3: Proc3 prm1$, prm2$
350 = 4: EXIT usr_loop
360 =-1: PRINT#0,"unknown command"
370 END SELect
380 END REPeat usr_loop
390 END DEFine CLI
400 :
410 :
420 REMark Command List
430 DATA 1,"Proc1", 2,"Proc2", 3,"Proc3", 4,'.'
440 DATA -1,"END"
450 :
460 :
470 REMark Test Procedures
480 DEFine PROCedure Proc1
490 PRINT#0,"Proc1 called - no params"
500 END DEFine Proc1
510 :
520 DEFine PROCedure Proc2 (p1$)
530 PRINT#0,"Proc2 called - param1:"!;p1$
540 END DEFine Proc2
550 :
560 DEFine PROCedure Proc3 (p1$,p2$)
570 PRINT#0,"Proc3 called - param1:"!;p1$;!!;"param2:"!;p2$
580 END DEFine Proc3
590 :
600 REMark END