2011-05-29 2 views
5

Il n'est pas rare qu'une classe de programmation intro écrisse un évaluateur métacirculaire Lisp. Y a-t-il eu une tentative de faire cela pour Python?Evaluateur méta-circulaire Python

Oui, je sais que la structure et la syntaxe de Lisp se prêtent bien à un évaluateur métacirculaire, etc., etc. Python sera probablement plus difficile. Je suis juste curieux de savoir si une telle tentative a été faite.

+1

[PyPy] (http://pypy.org/) – JBernardo

Répondre

7

Pour ceux qui ne savent pas ce qu'est un évaluateur méta-circulaire , c'est un interpréteur qui est écrit dans la langue à interpréter. Par exemple: un interpréteur Lisp écrit en Lisp, ou dans notre cas, un interpréteur Python écrit en Python. Pour plus d'informations, read this chapter from SICP.

En tant que JBernardo said, PyPy est un. Cependant, l'interpréteur Python de PyPy, l'évaluateur méta-circulaire qui est, est implémenté dans un sous-ensemble de Python typé statiquement appelé RPython.

Vous serez heureux de savoir que, à partir de la version 1.5, PyPy est entièrement conforme à la spécification officielle de Python 2.7. Encore plus: PyPy nearly always beats Python dans les tests de performance. Pour plus d'informations, voir PyPy docs et PyPy extra docs.

0

Je pense que je l'ai écrit un here:

""" 
Metacircular Python interpreter with macro feature. 
By Cees Timmerman, 14aug13. 
""" 

import re 
re_macros = re.compile("^#define (\S+) ([^\r\n]+)", re.MULTILINE) 

def meta_python_exec(code): 
    # Optional meta feature. 
    macros = re_macros.findall(code) 
    code = re_macros.sub("", code) 
    for m in macros: 
     code = code.replace(m[0], m[1]) 

    # Run the code. 
    exec(code) 

if __name__ == "__main__": 
    #code = open("metacircular_overflow.py", "r").read() # Causes a stack overflow in Python 3.2.3, but simply raises "RuntimeError: maximum recursion depth exceeded while calling a Python object" in Python 2.7.3. 
    code = "#define 1 2\r\nprint(1 + 1)" 
    meta_python_exec(code) 
+0

downvoted parce qu'il est pas? Pourquoi pas? –