2011-05-29 11 views
5

No es raro que una clase de programación de introducción escriba un evaluador metacircular Lisp. ¿Ha habido algún intento de hacer esto para Python?Python meta-circular evaluator

Sí, sé que la estructura y la sintaxis de Lisp se prestan muy bien a un evaluador metacircular, etc. etc. Es muy probable que Python sea más difícil. Solo tengo curiosidad por saber si se ha hecho ese intento.

+1

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

Respuesta

7

Para aquellos que no saben qué es meta-circular evaluator es, es un intérprete que está escrito en el idioma que se va a interpretar. Por ejemplo: un intérprete de Lisp escrito en Lisp, o en nuestro caso, un intérprete de Python escrito en Python. Para más información, read this chapter from SICP.

Como JBernardo said, PyPy es uno. Sin embargo, el intérprete Python de PyPy, el evaluador meta-circular que es, se implementa en un subconjunto estáticamente tipado de Python llamado RPython.

Le complacerá saber que, a partir de la versión 1.5, PyPy cumple totalmente con la especificación oficial de Python 2.7. Aún más: PyPy nearly always beats Python en puntos de referencia de rendimiento. Para obtener más información, consulte PyPy docs y PyPy extra docs.

0

Creo que me escribió uno 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 porque no es uno? Por qué no? –