✨
This commit is contained in:
@ -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|
|
||||||
|
@ -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
|
||||||
|
@ -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')
|
||||||
|
@ -1 +1,2 @@
|
|||||||
5
|
5
|
||||||
|
5
|
||||||
|
@ -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|
|
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