Python мета-круговой оценщик - PullRequest
6 голосов
/ 29 мая 2011

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

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

Ответы [ 2 ]

8 голосов
/ 30 мая 2011

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

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

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

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

0 голосов
/ 15 августа 2013

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

"""
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...