Python мета-круговой оценщик

Для вводного класса программирования весьма обычно писать метациркулярный оценщик Lisp. Была ли попытка сделать это для Python?

Да, я знаю, что структура и синтаксис Lisp прекрасно подходят для мета-круговой оценки и т. Д. И т. Д. С Python, скорее всего, будет сложнее. Мне просто любопытно, была ли сделана такая попытка.

2 ответа

Для тех, кто не знает, что такое мета-циклический оценщик, это переводчик, который написан на языке, который нужно интерпретировать. Например: интерпретатор Lisp, написанный на Lisp, или, в нашем случае, интерпретатор Python, написанный на Python. Для получения дополнительной информации прочитайте эту главу из SICP.

Как сказал Дж. Бернардо, PyPy - один из них. Однако интерпретатор PyPy для Python, мета-циклический оценщик, реализован в статически типизированном подмножестве Python под названием RPython.

Вам будет приятно узнать, что начиная с версии 1.5 PyPy полностью соответствует официальной спецификации Python 2.7. Тем более, что PyPy почти всегда опережает Python в тестах производительности.

Для получения дополнительной информации см. Документы PyPy и дополнительные документы PyPy.

Я думаю, что я написал один здесь:

"""
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)
Другие вопросы по тегам