コード例 #1
0
ファイル: microlisp.py プロジェクト: microamp/microlisp
def repl():
    # set up base environment
    env = Env(outer=None)
    for k, v in ns.items():
        env.set(k, v)

    env.set(SYMBOL_EVAL, lambda ast: EVAL(ast, env=env))  # `eval` added to ns

    s = """
    (def! load-file
      (fn* (f)
        (eval (read-string (str "(do " (slurp f) ")")))))
    """
    EVAL(READ(s), env=env)

    # read-eval-print loop
    while True:
        try:
            s = input("=> ")
            rep(s, env)
        except Exception as e:
            print("error: {0}".format(e))
コード例 #2
0
def PRINT(print_in):
    return printer.pr_str(print_in)


def rep(rep_in):
    read_out = READ(rep_in)
    eval_out = EVAL(read_out, repl_env)
    print_out = PRINT(eval_out)
    return print_out


repl_env = Env()

# Add namespace variables to repl environment
for key, value in ns.items():
    repl_env.set(key, value)

# Add the eval operator
repl_env.set('eval', lambda ast: EVAL(ast, repl_env))

rep("(def! not (fn* (a) (if a false true)))")
rep('(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))'
    )

while True:
    try:
        usr_input = input("user> ")
        rep_result = rep(usr_input)
        if rep_result is not None:
            print(rep_result)
コード例 #3
0
import reader
import printer
import mal_types
from env import Env
from core import ns

repl_env = Env()
repl_env.set('eval', lambda ast: EVAL(ast, repl_env))
for k, v in ns.items():
    repl_env.set(k, v)


def READ(string):
    return reader.read_str(string)


def EVAL(ast, env):
    while True:
        if not isinstance(ast, mal_types.list_types):
            return eval_ast(ast, env)
        elif not ast:
            return ast
        elif isinstance(ast, mal_types.list_types):
            if len(ast) == 0:
                return ast
            if isinstance(ast[0], mal_types.MalSymbol):
                if ast[0].data == 'def!':
                    value = EVAL(ast[2], env)
                    env.set(ast[1].data, value)
                    return value
コード例 #4
0
ファイル: step6_file.py プロジェクト: dancek/mal
#!/usr/bin/env python3

import readline
import sys

import reader, printer
from types import *
from env import Env
from core import ns

repl_env = Env(None)
repl_env.set('eval', lambda ast: EVAL(ast, repl_env))
for name, f in ns.items():
    repl_env.set(name, f)


def READ(s):
    return reader.read_str(s)


def EVAL(ast, env):
    while True:  # allow tail call optimization (TCO)
        if isinstance(ast, MalList):
            if len(ast) == 0:
                return ast

            call = ast[0]

            if call == 'def!':
                f_name, f_def, *others = ast[1:]
                if others: