```cls
sync on

rem Set up Fractal Variables
iterations=10
axiom\$="8" : rem (X)
rules=1

movelen#=20
angchange#=15

rem Set upper limit of Code Lenth
arraynums=65536

rem Initialise arrays
dim set(arraynums)   : rem Final code
dim set1(arraynums)  : rem Code creation array 1
dim set2(arraynums)  : rem Code creation array 1

rem Array for rules, this time there's only 1
dim rule\$(rules,1)
rem equivalent:
rem        (X)                 (F[+X][F-X])
rule\$(1,0)="8"    : rule\$(1,1)="1638761487"

rem Array to convert numbers of symbols
dim char\$(9)
char\$(1)="F"
char\$(2)="f"
char\$(3)="+"
char\$(4)="-"
char\$(5)="|"
char\$(6)="["
char\$(7)="]"
char\$(8)="X"
char\$(9)="Y"

gosub GenerateSet
gosub DrawFractal

rem Loop until any key is pressed
repeat : sync : until scancode()<>0 or mouseclick()<>0

end

GenerateSet:

rem Set the first array to the original axiom
for i=1 to len(axiom\$)
set1(i)=val(mid\$(axiom\$,i))
next i

rem Set the code lenths for each array
set1size=len(axiom\$)
set2size=0

rem Start on code generation array 1 (actually, this is array 2 but I'm going to switch it in a moment)
setno=1

rem Begin the FOR loop
for i=1 to iterations

rem Switch the array that we're using
setno=1-setno

rem If we're on the >first< array
if setno=0

rem Clear the >second< array (actually, it's not cleared, but becuase 'set2size' is 0 the data will be overwritten)
set2size=0
rem Go though the >first< array
for j=1 to set1size
rem Search though the rules to see if the current character should be changed
rulefound=0
for k=1 to rules
rem If it matches a rule...
if rule\$(k,0)=str\$(set1(j))
rem ...then copy the rule into array >2<
for l=1 to len(rule\$(k,1))
set2size=set2size+1
set2(set2size)=val(mid\$(rule\$(k,1),l))
next l
rulefound=1
endif
next k
rem If no rule matches...
if rulefound=0
rem ...then simply copy the symbol in array >1< to array >2<
set2size=set2size+1
set2(set2size)=set1(j)
endif
next j

rem If we're on the >second< array
else

rem Clear the >first< array (actually, it's not cleared, but becuase 'set1size' is 0 the data will be overwritten)
set1size=0
rem Go though the >second< array
for j=1 to set2size
rulefound=0
rem Search though the rules to see if the current character should be changed
for k=1 to rules
rem If it matches a rule...
if rule\$(k,0)=str\$(set2(j))
rem ...then copy the rule into array >1<
for l=1 to len(rule\$(k,1))
set1size=set1size+1
set1(set1size)=val(mid\$(rule\$(k,1),l))
next l
rulefound=1
endif
next k
rem If no rule matches...
if rulefound=0
rem ...then simply copy the symbol in array >2< to array >1<
set1size=set1size+1
set1(set1size)=set2(j)
endif
next j

endif

next i

rem Copy the current code from the current array into the final array
if setno=0
for i=1 to set2size
set(i)=set2(i)
next i
setsize=set2size
else
for i=1 to set1size
set(i)=set1(i)
next i
setsize=set1size
endif

rem Delete the unnecessary arrays
undim set1(arraynums)
undim set2(arraynums)

return

DrawFractal:

rem Display the first few hundred symbols for decoration
ink rgb(150,150,150),0
forto=setsize
if forto>4800 then forto=4800
for i=1 to forto
print char\$(set(i)); : rem Accessing the 'char\$()' array
next i

rem Set up initial state
x#=320
y#=470
angle#=270

rem Setup stack
dim stackx#(1000)
dim stacky#(1000)
dim stackang#(1000)
stackon=0

ink rgb(255,255,0),0

rem Cycle through the code
for i=1 to setsize

rem Move forward, drawing a line ("F","X" or "Y")
if set(i)=1  or set(i)=8 or set(i)=9
rem Draw the line
line x#,y#,x#+cos(angle#)*movelen#,y#+sin(angle#)*movelen#
rem Change the coordinates
x#=x#+cos(angle#)*movelen#
y#=y#+sin(angle#)*movelen#
endif

rem Move forward, without drawing ("f")
if set(i)=2
x#=x#+cos(angle#)*movelen#
y#=y#+sin(angle#)*movelen#
endif

rem Turn left ("+")
if set(i)=3
angle#=wrapvalue(angle#-angchange#)
endif

rem Turn right ("-")
if set(i)=4
angle#=wrapvalue(angle#+angchange#)
endif

rem Rotate 180
if set(i)=5
angle#=wrapvalue(angle#+180)
endif

rem Store state to stack
if set(i)=6
stackon=stackon+1          : rem Increase stack size
stackx#(stackon)=x#        : rem Save x
stacky#(stackon)=y#        : rem Save y
stackang#(stackon)=angle#  : rem Save angle
endif

rem Pop the state from the stack and set the drawer to it
if set(i)=7
x#=stackx#(stackon)        : rem Return to the x stacked at the top of the stack
y#=stacky#(stackon)        : rem Return to the y stacked at the top of the stack
angle#=stackang#(stackon)  : rem Return to the angle stacked at the top of the stack
stackon=stackon-1          : rem Delete the top stackv (actually just decreasing the stack size, but it will eventually be overwritten)
endif

next i

return```