2011-06-04 67 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