✨
This commit is contained in:
@ -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|
|
||||
|
@ -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
|
||||
|
@ -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')
|
||||
|
@ -1 +1,2 @@
|
||||
5
|
||||
5
|
||||
|
@ -1,6 +1,8 @@
|
||||
hello|
|
||||
set 1 -> x|
|
||||
[
|
||||
set 5 -> x|
|
||||
do print<variable x;>|
|
||||
]|
|
||||
do print<variable x;>|
|
||||
goodbye|
|
1
tests/24_function_scope.expected
Normal file
1
tests/24_function_scope.expected
Normal file
@ -0,0 +1 @@
|
||||
1
|
5
tests/24_function_scope.plthy
Normal file
5
tests/24_function_scope.plthy
Normal file
@ -0,0 +1,5 @@
|
||||
hello|
|
||||
set 1 -> x|
|
||||
define f<0> as set 2 -> x|
|
||||
do print<variable x;>|
|
||||
goodbye|
|
Reference in New Issue
Block a user