diff options
| author | mryouse | 2022-05-21 02:39:43 +0000 |
|---|---|---|
| committer | mryouse | 2022-05-21 02:39:43 +0000 |
| commit | 09df18182dfae22bbc65b2c07c4f610c595aba19 (patch) | |
| tree | 4ba15c6e0da2b58d4e2495fbbe2fd6f0d058e405 | |
| parent | 65d106d2eb6e1cac3cedd4a47a2106a235ce4152 (diff) | |
for-count implementation
| -rw-r--r-- | interpreter.py | 15 | ||||
| -rw-r--r-- | lexer.py | 2 |
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? @@ -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 } |
