2011-06-04 79 views
1

你有什么建议在Python中编写Lisp方言/解释器吗?我想从几个基本命令开始,比如set,printdefine什么的。写lisp方言

回答

4
+1

这是一个编程练习。 – tekknolagi 2011-06-04 07:42:22

+0

对不起,我混淆了链接。现在再检查一次。 – 2011-06-04 07:44:15

+0

我知道,我是彼得的好朋友。其实,他是我的邻居。建议吗?他最近很忙。 – tekknolagi 2011-06-04 07:46:40

6

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

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) 

你的教科书计划eval循环,但这是实际的代码,工作。 Bob的代码非常注重清晰度,如果您有其他问题,请随时问我。

+0

谢谢! :)这证明非常有帮助 – tekknolagi 2011-06-04 17:19:41