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

print

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)