mal: Step 2ΒΆ
- project:
mal-py
- filename:
step2_eval.py
read
mal-py
step2_eval.py
from reader import S, read_str
def read(ins):
return read_str(ins)
eval
mal-py
step2_eval.py
def evaluate(form, env):
match form:
case S(name):
return env[name]
case []:
return []
case [*fs]:
f, *args = [evaluate(f, env) for f in fs]
return f(*args)
case _:
return form
mal-py
step2_eval.py
from printer import print_form
def printit(form):
return print_form(form)
rep
mal-py
step2_eval.py
env = {
'+': lambda a,b: a+b,
'-': lambda a,b: a-b,
'*': lambda a,b: a*b,
'/': lambda a,b: int(a/b)
}
def rep(ins: str):
try:
return printit(evaluate(read(ins), env))
except EOFError:
return f"EOF"
except KeyError as e:
return f"undefined symbol {e.args[0]!r}"
repl
mal-py
step2_eval.py
def repl(ins: io.TextIO):
print("user> ", end='', flush=True)
while (line := ins.readline()) != "":
print(rep(line))
print("user> ", end='', flush=True)
if __name__ == "__main__":
import sys
repl(sys.stdin)