導入プログラミング クラスで Lisp メタサーキュラー エバリュエーターを作成することは珍しくありません。Pythonでこれを行う試みはありましたか?
はい、Lisp の構造と構文がメタサーキュラー エバリュエーターなどに適していることはわかっています。Python はおそらくもっと難しいでしょう。そのような試みが行われたかどうかについては、ただ興味があります。
導入プログラミング クラスで Lisp メタサーキュラー エバリュエーターを作成することは珍しくありません。Pythonでこれを行う試みはありましたか?
はい、Lisp の構造と構文がメタサーキュラー エバリュエーターなどに適していることはわかっています。Python はおそらくもっと難しいでしょう。そのような試みが行われたかどうかについては、ただ興味があります。
メタサーキュラー エバリュエーターが何かを知らない人のために説明すると、それは通訳対象の言語で書かれたインタープリターです。例: 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を参照してください。
私はここに書いたと思います:
"""
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)