This commit is contained in:
2024-04-12 16:17:58 +02:00
parent 4d4209656d
commit ad9435b12d
7 changed files with 51 additions and 10 deletions

View File

@ -21,10 +21,12 @@ define is_number<1> as [
set 0 -> i| set 0 -> i|
do [ do [
set 0 -> j| set 0 -> j|
set false -> num|
do [ do [
do skip else return false if argument #1{variable i} = variable numbers{variable j}| do set true -> num else skip if argument #1{variable i} = variable numbers{variable j}|
set variable j + 1 -> j| set variable j + 1 -> j|
] until variable j = do len<variable numbers;>| ] until variable j = do len<variable numbers;>|
do skip else return false if variable num|
set variable i + 1 -> i| set variable i + 1 -> i|
] until variable i = do len<argument #1;>| ] until variable i = do len<argument #1;>|
return true| return true|
@ -48,13 +50,31 @@ define unfold<1> as [
set {} -> n1l| set {} -> n1l|
set 1 -> n| set 1 -> n|
set 0 -> i| set 0 -> k|
do [ do [
set variable i+1 -> i| set variable k+1 -> k|
set variable n1l + {argument #1{variable i};} -> n1l| set variable n1l + {argument #1{variable k};} -> n1l|
do skip else set variable n+2 -> n if do "is_number"<argument #1{variable i};>| do skip else set variable n+2 -> n if do "is_number"<argument #1{variable k};>|
] until variable n = variable i| ] until variable n = variable k|
do print<variable n1l;>|
set {} -> n2l|
set variable n+1 -> n|
do [
set variable k+1 -> k|
set variable n2l + {argument #1{variable k};} -> n2l|
do skip else set variable n+2 -> n if do "is_number"<argument #1{variable k};>|
] until variable n = variable k|
do print<variable op;variable n1l;variable n2l;>|
set do "unfold"<variable n1l;> -> n1|
do return 'error' if do str<variable n1;>='error'|
set do "unfold"<variable n2l;> -> n2|
do return 'error' if do str<variable n1;>='error'|
do print<variable op;variable n1;variable n2;>|skip|
return do "calc"<variable op;variable n1;variable n2;>|
]| ]|
set do input<':';> -> x| set do input<':';> -> x|

View File

@ -226,6 +226,10 @@ class Builtin(Command):
vtable, ftable, result = self.args[0].eval(vtable,ftable) vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, int(result) return vtable, ftable, int(result)
elif self.builtin == "str":
vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, str(result)
else: else:
raise Exception(f"Unknown builtin {self.builtin}") raise Exception(f"Unknown builtin {self.builtin}")
@ -298,9 +302,14 @@ class Scope(Statement):
return f"scope([{rep_join(self.statements)}])" return f"scope([{rep_join(self.statements)}])"
def eval(self, vtable, ftable): def eval(self, vtable, ftable):
if "#return" in vtable:
del vtable["#return"]
result = None result = None
for statement in self.statements: for statement in self.statements:
# print(statement)
vtable, ftable, _ = statement.eval(vtable, ftable) vtable, ftable, _ = statement.eval(vtable, ftable)
# print(statement, vtable)
if "#return" in vtable: if "#return" in vtable:
result = vtable["#return"] result = vtable["#return"]
break break
@ -330,6 +339,7 @@ class Call(Statement):
vtable["#ARGS"] += len(args) vtable["#ARGS"] += len(args)
vtable_old, ftable_old = vtable, ftable
vtable, ftable, result = ftable[self.function_name][1].eval(vtable, ftable) vtable, ftable, result = ftable[self.function_name][1].eval(vtable, ftable)
if "#return" in vtable: if "#return" in vtable:
@ -337,7 +347,8 @@ class Call(Statement):
vtable["#ARGS"] -= len(args) vtable["#ARGS"] -= len(args)
return vtable, ftable, result print(vtable, vtable_old)
return vtable_old, ftable_old, result
class CommandIf(Command): class CommandIf(Command):
def __init__(self, statement: Statement, condition): def __init__(self, statement: Statement, condition):
@ -395,13 +406,15 @@ class CommandUntil(Command):
return f"until({self.statement}, {self.condition})" return f"until({self.statement}, {self.condition})"
def eval(self, vtable, ftable): def eval(self, vtable, ftable):
if "#return" in vtable:
del vtable["#return"]
while True: while True:
vtable, ftable, result = self.condition.eval(vtable, ftable) vtable, ftable, result = self.condition.eval(vtable, ftable)
if not result: if not result:
vtable, ftable, _ = self.statement.eval(vtable, ftable) vtable, ftable, _ = self.statement.eval(vtable, ftable)
if "#return" in vtable: if "#return" in vtable:
result = vtable["#return"] result = vtable["#return"]
del vtable["#return"]
return vtable, ftable, result return vtable, ftable, result
else: else:
return vtable, ftable, result return vtable, ftable, result

View File

@ -110,7 +110,6 @@ class Parser():
@self.pg.production('expression : DATA_BOOL') @self.pg.production('expression : DATA_BOOL')
def exp_bool(tokens): def exp_bool(tokens):
return ast_nodes.ExpBool(tokens[0].value == "true") return ast_nodes.ExpBool(tokens[0].value == "true")
@self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL') @self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL')

View File

@ -1 +1,2 @@
5 5
5

View File

@ -1,6 +1,8 @@
hello| hello|
set 1 -> x|
[ [
set 5 -> x| set 5 -> x|
do print<variable x;>| do print<variable x;>|
]| ]|
do print<variable x;>|
goodbye| goodbye|

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,5 @@
hello|
set 1 -> x|
define f<0> as set 2 -> x|
do print<variable x;>|
goodbye|