import apple_io
import data_types
import element
+ import gc
+ import math
+ import random
+ import time
+
+ # globals
+ random.seed(time.time())
+ last_random = random.random()
%}
%%
@method(StatementDim)
def execute(self, context):
for i in self.children:
- dim = [
- data_types.cint(j.get_float(context)) + 1
- for j in i.children[1:]
- ]
+ dim = [j.get_int(context) + 1 for j in i.children[1:]]
# we don't check for an existing array until here, as it could be
# created with the default 11 elements while evaluating dimensions
assert False
@method(StatementCall)
def execute(self, context):
- value = self.children[0].get_float()
- apple_io.call(data_types.cint(value))
+ value = self.children[0].get_int(context)
+ apple_io.call(value)
@method(StatementPlot)
def execute(self, context):
- value0 = self.children[0].get_float()
- value1 = self.children[1].get_float()
- apple_io.plot(data_types.cint(value0), data_types.cint(value1))
+ value0 = self.children[0].get_int(context)
+ value1 = self.children[1].get_int(context)
+ apple_io.plot(value0, value1)
@method(StatementHLin)
def execute(self, context):
- value0 = self.children[0].get_float()
- value1 = self.children[1].get_float()
- value2 = self.children[2].get_float()
- apple_io.hlin(
- data_types.cint(value0),
- data_types.cint(value1),
- data_types.cint(value2)
- )
+ value0 = self.children[0].get_int(context)
+ value1 = self.children[1].get_int(context)
+ value2 = self.children[2].get_int(context)
+ apple_io.hlin(value0, value1, value2)
@method(StatementVLin)
def execute(self, context):
- value0 = self.children[0].get_float()
- value1 = self.children[1].get_float()
- value2 = self.children[2].get_float()
- apple_io.vlin(
- data_types.cint(value0),
- data_types.cint(value1),
- data_types.cint(value2)
- )
+ value0 = self.children[0].get_int(context)
+ value1 = self.children[1].get_int(context)
+ value2 = self.children[2].get_int(context)
+ apple_io.vlin(value0, value1, value2)
@method(StatementHGR2)
def execute(self, context):
assert False
assert False
@method(StatementHTab)
def execute(self, context):
- value = self.children[0].get_float(context)
- apple_io.htab(data_types.cint(value))
+ value = self.children[0].get_int(context)
+ apple_io.htab(value)
@method(StatementHome)
def execute(self, context):
apple_io.home()
apple_io.flash()
@method(StatementColorEqual)
def execute(self, context):
- value = self.children[0].get_float()
- apple_io.color(data_types.cint(value))
+ value = self.children[0].get_int(context)
+ apple_io.color(value)
@method(StatementPop)
def execute(self, context):
assert False
@method(StatementVTab)
def execute(self, context):
- value = self.children[0].get_float(context)
- apple_io.vtab(data_types.cint(value))
+ value = self.children[0].get_int(context)
+ apple_io.vtab(value)
@method(StatementHimemColon)
def execute(self, context):
assert False
assert False
@method(StatementPoke)
def execute(self, context):
- value0 = self.children[0].get_float()
- value1 = self.children[1].get_float()
- apple_io.poke(data_types.cint(value0), data_types.cint(value1))
+ value0 = self.children[0].get_int(context)
+ value1 = self.children[1].get_int(context)
+ apple_io.poke(value0, value1)
@method(StatementPrint)
def execute(self, context):
for i in self.children:
return float(self.children[0].int_value)
@method(RValueTabLParen)
def get(self, context):
- value = self.children[0].get_float(context)
- return apple_io.tab(data_types.cint(value))
+ value = self.children[0].get_int(context)
+ # strangely, pos() is 0-based whereas tab() is 1-based
+ value -= 1 + apple_io.pos()
+ return ' ' * value if value >= 1 else ''
@method(RValueSpcLParen)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_int(context)
+ if value < 0:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return ' ' * value
@method(RValueNot)
def get(self, context):
value = self.children[0].get_float(context)
return float(value0 != value1)
@method(RValueSgn)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return -1. if value < 0. else 1. if value > 0. else 0.
@method(RValueInt)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return float(math.floor(value))
@method(RValueAbs)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return abs(value)
@method(RValueUsr)
def get(self, context):
value = self.children[0].get(context)
- assert False
+ value = apple_io.usr(value)
+ if isinstance(value, int):
+ value = float(value)
+ return value
@method(RValueFre)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ gc.collect()
+ return -29188. # value I get from a freshly booted system
@method(RValueScrnLParen)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value0 = self.children[0].get_int(context)
+ value1 = self.children[1].get_int(context)
+ return float(apple_io.scrn(value0, value1))
@method(RValuePdl)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_int(context)
+ return float(apple_io.pdl(value))
@method(RValuePos)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ return float(apple_io.pos())
@method(RValueSqr)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ if value < 0.:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return math.sqrt(value)
@method(RValueRnd)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ if value:
+ if value < 0.:
+ random.seed(value)
+ last_random = random.random()
+ return last_random
@method(RValueLog)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ if value <= 0.:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return math.log(value)
@method(RValueExp)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return math.exp(value)
@method(RValueCos)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return math.cos(value)
@method(RValueSin)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return math.sin(value)
@method(RValueTan)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return math.tan(value)
@method(RValueAtn)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_float(context)
+ return math.atan(value)
@method(RValuePeek)
def get(self, context):
- value = self.children[0].get_str(context)
- return float(apple_io.peek(data_types.cint(value)))
+ value = self.children[0].get_int(context)
+ return float(apple_io.peek(value))
@method(RValueLen)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_str(context)
+ return float(len(value))
@method(RValueStrDollar)
def get(self, context):
value = self.children[0].get_float(context)
return data_types.val(value)
@method(RValueAsc)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_str(context)
+ if len(value) == 0:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return float(ord(value[0]))
@method(RValueChrDollar)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value = self.children[0].get_int(context)
+ if value < 0 or value >= 0x110000: # never seen a unicode apple 2 before!
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return chr(value)
@method(RValueLeftDollar)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value0 = self.children[0].get_str(context)
+ value1 = self.children[1].get_int(context)
+ if value1 < 0:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return value0[:value1]
@method(RValueRightDollar)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value0 = self.children[0].get_str(context)
+ value1 = self.children[1].get_int(context)
+ if value1 < 0:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return '' if value1 == 0 else value0[-value1:]
@method(RValueMidDollar)
def get(self, context):
- value = self.children[0].get(context)
- assert False
+ value0 = self.children[0].get_str(context)
+ value1 = self.children[1].get_int(context)
+ if value1 < 1:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ value1 -= 1
+ if len(self.children) < 3:
+ return value0[value1:]
+ value2 = self.children[2].get_int(context)
+ if value2 < 0:
+ raise Exception(
+ f'?ILLEGAL QUANTITY ERROR IN {context.line_number():d}'
+ )
+ return value0[value1:value1 + value2]
@method(LValue)
def get(self, context):
value = self.find_variable(context).value
del get
@method(RValue)
-def get_float(self, context):
+def get_str(self, context):
value = self.get(context)
- if not isinstance(value, float):
+ if not isinstance(value, str):
raise Exception(
f'?TYPE MISMATCH ERROR IN {context.line_number():d}'
)
return value
-del get_float
+del get_str
@method(RValue)
-def get_str(self, context):
+def get_float(self, context):
value = self.get(context)
- if not isinstance(value, str):
+ if not isinstance(value, float):
raise Exception(
f'?TYPE MISMATCH ERROR IN {context.line_number():d}'
)
return value
-del get_str
+del get_float
+
+@method(RValue)
+def get_int(self, context):
+ return data_types.cint(self.get_float(context))
+del get_int
@method(LValue)
def find_variable(self, context):