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|
do [
set 0 -> j|
set false -> num|
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|
] until variable j = do len<variable numbers;>|
do skip else return false if variable num|
set variable i + 1 -> i|
] until variable i = do len<argument #1;>|
return true|
@ -48,13 +50,31 @@ define unfold<1> as [
set {} -> n1l|
set 1 -> n|
set 0 -> i|
set 0 -> k|
do [
set variable i+1 -> i|
set variable n1l + {argument #1{variable i};} -> n1l|
do skip else set variable n+2 -> n if do "is_number"<argument #1{variable i};>|
] until variable n = variable i|
do print<variable n1l;>|
set variable k+1 -> k|
set variable n1l + {argument #1{variable k};} -> n1l|
do skip else set variable n+2 -> n if do "is_number"<argument #1{variable k};>|
] until variable n = variable k|
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|

View File

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

View File

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

View File

@ -1 +1,2 @@
5
5

View File

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