介绍编程类编写 Lisp 元循环评估器的情况并不少见。有没有尝试为 Python 做这件事?
是的,我知道 Lisp 的结构和语法非常适合元循环评估器等。Python 很可能会更困难。我只是好奇是否有过这样的尝试。
介绍编程类编写 Lisp 元循环评估器的情况并不少见。有没有尝试为 Python 做这件事?
是的,我知道 Lisp 的结构和语法非常适合元循环评估器等。Python 很可能会更困难。我只是好奇是否有过这样的尝试。
对于那些不知道什么是元循环评估器的人来说,它是一个用要解释的语言编写的解释器。例如:用 Lisp 编写的 Lisp 解释器,或者在我们的例子中,是用 Python 编写的 Python 解释器。有关更多信息,请阅读 SICP 中的这一章。
正如JBernardo 所说,PyPy就是其中之一。但是,PyPy 的 Python 解释器,即元循环评估器,是在称为RPython的 Python 的静态类型子集中实现的。
您会很高兴知道,从 1.5 版本开始,PyPy 完全符合官方 Python 2.7 规范。更重要的是:PyPy在性能基准测试中几乎总是胜过 Python 。
我想我在这里写了一篇:
"""
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)