7

導入プログラミング クラスで Lisp メタサーキュラー エバリュエーターを作成することは珍しくありません。Pythonでこれを行う試みはありましたか?

はい、Lisp の構造と構文がメタサーキュラー エバリュエーターなどに適していることはわかっています。Python はおそらくもっと難しいでしょう。そのような試みが行われたかどうかについては、ただ興味があります。

4

2 に答える 2

8

メタサーキュラー エバリュエーターが何かを知らない人のために説明すると、それは通訳対象の言語で書かれたインタープリターです。例: Lisp で書かれた Lisp インタープリター、またはこの場合は Python で書かれた Python インタープリター。詳細については、SICP のこの章を参照してください。

JBernardo が言ったように、PyPyはその 1 つです。ただし、PyPy の Python インタープリター、つまりメタ循環エバリュエーターは、 RPythonと呼ばれる Pythonの静的に型指定されたサブセットに実装されています。

1.5 リリースの時点で、PyPy は公式の Python 2.7 仕様に完全に準拠しています。さらに言えば、PyPyはほぼ常にパフォーマンス ベンチマークでPythonを上回っています。

詳細については、 PyPy docsおよびPyPy extra docsを参照してください。

于 2011-05-30T00:04:17.317 に答える
0

私はここに書いたと思います:

"""
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)
于 2013-08-15T13:30:08.340 に答える