RosettaCodeData/Task/First-class-environments/BBC-BASIC/first-class-environments.basic

47 lines
1.1 KiB
Plaintext

DIM @environ$(12)
@% = 4 : REM Column width
REM Initialise:
FOR E% = 1 TO 12
PROCsetenvironment(@environ$(E%))
seq% = E%
cnt% = 0
@environ$(E%) = FNgetenvironment
NEXT
REM Run hailstone sequences:
REPEAT
T% = 0
FOR E% = 1 TO 12
PROCsetenvironment(@environ$(E%))
PRINT seq% ;
IF seq% <> 1 THEN
T% += 1
cnt% += 1
IF seq% AND 1 seq% = 3 * seq% + 1 ELSE seq% DIV= 2
ENDIF
@environ$(E%) = FNgetenvironment
NEXT
PRINT
UNTIL T% = 0
REM Print counts:
PRINT "Counts:"
FOR E% = 1 TO 12
PROCsetenvironment(@environ$(E%))
PRINT cnt% ;
@environ$(E%) = FNgetenvironment
NEXT
PRINT
END
DEF FNgetenvironment
LOCAL e$ : e$ = STRING$(216, CHR$0)
SYS "RtlMoveMemory", !^e$, ^@%+108, 216
= e$
DEF PROCsetenvironment(e$)
IF LEN(e$) < 216 e$ = STRING$(216, CHR$0)
SYS "RtlMoveMemory", ^@%+108, !^e$, 216
ENDPROC