2011-06-04 5 views
1

Avez-vous des conseils pour écrire un dialecte/interprète Lisp en Python? Je voudrais commencer avec juste quelques commandes de base, comme set, print, et define ou quelque chose.écrire dialecte lisp

Répondre

4
+1

c'est un exercice de programmation. – tekknolagi

+0

Désolé, j'ai mélangé le lien. Vérifiez à nouveau maintenant. –

+0

Je sais, je suis de bons amis avec Peter. Il est mon voisin, en fait. Conseil? Il a été occupé ces derniers temps. – tekknolagi

6

Il existe un interpréteur Scheme entièrement fonctionnel en Python here. Sa principale « boucle eval » est juste ceci:

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) 

Quasiment votre manuel Scheme boucle eval, mais ce code est réel qui fonctionne. Le code de Bob est très clair, et si vous avez d'autres questions n'hésitez pas à me demander.

+0

merci! :) cela s'est avéré très utile – tekknolagi