aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormryouse2022-05-21 02:39:43 +0000
committermryouse2022-05-21 02:39:43 +0000
commit09df18182dfae22bbc65b2c07c4f610c595aba19 (patch)
tree4ba15c6e0da2b58d4e2495fbbe2fd6f0d058e405
parent65d106d2eb6e1cac3cedd4a47a2106a235ce4152 (diff)
for-count implementation
-rw-r--r--interpreter.py15
-rw-r--r--lexer.py2
2 files changed, 17 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py
index f252bc9..6a88c57 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -263,6 +263,21 @@ def interpretToString(expr, env):
GLOBALS.register("->string", Builtin(interpretToString, 1))
+def interpretForCount(expr, env):
+ # for-count int exprs
+ num = evaluate(expr.args[0], env)
+ if type(num) is not int:
+ raise Exception("'for-count' count must be an integer")
+ new_env = Environment(env)
+ ret = None
+ for idx in range(0, num):
+ new_env.register("idx", Expr.Literal(idx + 1))
+ for arg in expr.args[1:]:
+ ret = evaluate(arg, new_env)
+ return ret
+
+GLOBALS.register("for-count", Builtin(interpretForCount))
+
def interpretEnv(expr, env_expr, env):
ev = evaluate(env_expr, env)
return ev # TODO more than this?
diff --git a/lexer.py b/lexer.py
index 5be76c6..e98972f 100644
--- a/lexer.py
+++ b/lexer.py
@@ -45,6 +45,7 @@ class TokenType(Enum):
# flow
IF = auto()
+ FOR_COUNT = auto()
# keywords
DEF = auto()
@@ -68,6 +69,7 @@ keywords = {
"and": TokenType.AND,
"or": TokenType.OR,
"if": TokenType.IF,
+ "for-count": TokenType.FOR_COUNT,
"def": TokenType.DEF,
"lambda": TokenType.LAMBDA }