aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormryouse2022-05-21 03:10:12 +0000
committermryouse2022-05-21 03:10:12 +0000
commit50f932837a763878b58d77703b274ff242ea38f8 (patch)
treebfa61a72e8bf8da3212ebbedfc34e6ea0ebb4717
parent09df18182dfae22bbc65b2c07c4f610c595aba19 (diff)
implement pipe
-rw-r--r--interpreter.py13
-rw-r--r--lexer.py2
2 files changed, 15 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py
index 6a88c57..ee7069c 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -278,6 +278,19 @@ def interpretForCount(expr, env):
GLOBALS.register("for-count", Builtin(interpretForCount))
+def interpretPipe(expr, env):
+ if len(expr.args) < 2:
+ raise Exception("'|' takes at least two expressions")
+ new_env = Environment(env)
+ pipe = None
+ for arg in expr.args:
+ if pipe is not None:
+ new_env.register("items", pipe)
+ pipe = Expr.Literal(evaluate(arg, new_env))
+ return pipe
+
+GLOBALS.register("|", Builtin(interpretPipe))
+
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 e98972f..aa2d107 100644
--- a/lexer.py
+++ b/lexer.py
@@ -46,6 +46,7 @@ class TokenType(Enum):
# flow
IF = auto()
FOR_COUNT = auto()
+ PIPE = auto()
# keywords
DEF = auto()
@@ -70,6 +71,7 @@ keywords = {
"or": TokenType.OR,
"if": TokenType.IF,
"for-count": TokenType.FOR_COUNT,
+ "|": TokenType.PIPE,
"def": TokenType.DEF,
"lambda": TokenType.LAMBDA }