пиши диалект

1

Есть ли у вас какие-либо советы по написанию диалекта/интерпретатора Lisp в Python? Я хотел бы начать с нескольких основных команд, таких как set, print и define или что-то в этом роде.

Теги:
lisp
interpreter
dialect

2 ответа

4
Лучший ответ

Зайдите Как написать интерпретатор Lisp в Python.

  • 1
    это упражнение по программированию.
  • 0
    Извините, я перепутал ссылку. Проверьте это снова сейчас.
Показать ещё 1 комментарий
6

Здесь есть полный функциональный интерпретатор схемы в Python здесь. Его основной "цикл eval" заключается в следующем:

def _eval(self, expr, env):
    if DEBUG: print('~~~~ Eval called on %s [%s]' % (expr_repr(expr), type(expr)))
    if DEBUG: print('Env:')
    if DEBUG: pprint.pprint(env.binding)

    # Standard Scheme eval (SICP 4.1.1)
    #
    if is_self_evaluating(expr):
        return expr
    elif is_variable(expr):
        return env.lookup_var(expr.value)
    elif is_quoted(expr):
        return text_of_quotation(expr)
    elif is_assignment(expr):
        env.set_var_value(
            var=assignment_variable(expr).value, 
            value=self._eval(assignment_value(expr), env))
        return None
    elif is_definition(expr):
        env.define_var(
            var=definition_variable(expr).value,
            value=self._eval(definition_value(expr), env))
        return None
    elif is_if(expr):
        predicate = self._eval(if_predicate(expr), env)
        if predicate == Boolean(False):
            return self._eval(if_alternative(expr), env)
        else:
            return self._eval(if_consequent(expr), env)
    elif is_cond(expr):
        return self._eval(convert_cond_to_ifs(expr), env)
    elif is_let(expr):
        return self._eval(convert_let_to_application(expr), env)
    elif is_lambda(expr):
        return Procedure(
                    args=lambda_parameters(expr),
                    body=lambda_body(expr),
                    env=env)
    elif is_begin(expr):
        return self._eval_sequence(begin_actions(expr), env)
    elif is_application(expr):
        return self._apply(
                        self._eval(application_operator(expr), env),
                        self._list_of_values(application_operands(expr), env))
    else:
        raise self.InterpretError("Unknown expression in EVAL: %s" % expr)

В значительной степени ваш учебник Scheme eval loop, но это фактический код, который работает. Боб код очень clarity- сосредоточен, и если у вас есть дополнительные вопросы, не стесняйтесь спрашивать меня.

  • 0
    благодарю вас! :) это оказалось очень полезным

Ещё вопросы

Сообщество Overcoder
Наверх
Меню