【问题标题】:write lisp dialect写 lisp 方言
【发布时间】:2011-06-04 07:38:56
【问题描述】:

你对用 Python 编写 Lisp 方言/解释器有什么建议吗?我想从几个基本命令开始,例如setprintdefine 或其他。

【问题讨论】:

    标签: python lisp interpreter dialect


    【解决方案1】:

    在 Python here 中有一个功能齐全的 Scheme 解释器。它的主要“评估循环”就是这样:

    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 循环,但这是有效的实际代码。 Bob 的代码非常清晰,如果您还有其他问题,请随时问我。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 对不起,我把链接弄混了。现在再看看吧。
      • 我知道,我和彼得是好朋友。他实际上是我的邻居。建议?他最近很忙。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2014-12-18
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2010-11-03
      相关资源
      最近更新 更多