diff options
| -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 } | 
