mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 04:24:43 +00:00
2.8 KiB
2.8 KiB
ErgコードはPythonコードにどのようにトランスパイルされるか?
正確には、ErgコードはPythonバイトコードにトランスパイルされます。 しかしPythonバイトコードはほぼPythonコードに復元できるので、ここでは等価なPythonコードを例として上げています。 ちなみに、ここで紹介する例は最適化レベルの低いものです。 さらに高度な最適化が施されると、実体を生成する必要のないものは消去されます。
Record, Record type
namedtupleにトランスパイルされます。
namedtupleについては、こちらを参照してください。
似たような機能にdataclassがありますが、dataclassは__eq__
や__hash__
が自動実装されるなどの影響で少しパフォーマンスが落ちます。
employee = {.name = "John Smith"; .id = 100}
assert employee.name == "John Smith"
from typing import NamedTuple
employee = NamedTuple(['name', 'id'])('John Smith', 100)
assert employee.name == 'John Smith'
また、更に最適化できる場合は単なるタプルに変換されます。
Polymorphic Type
WIP
Instant Scope
名前空間内での衝突が起きない場合は、単にマングリングして展開されます。
x::y
などの名前はバイトコードで使用されるものでPythonコードと対応させる事はできませんが、無理やり表現すると以下のようになります。
x =
y = 1
y + 1
x::y = 1
x = x::y + 1
衝突する場合は、内部的にしか参照できない関数を定義して使用します。
x =
y = 1
y + 1
def _():
x = 1
y = x
return y + 1
x = _()
Visibility
公開変数に関してはPythonのデフォルトなので何もしません。 非公開変数はマングリングで対処しています。
x = 1
y =
x = 2
assert module::x == 2
module::x = 1
y::x = 2
assert module::x == 2
y = None
Patch
func b: Bool =
Invert = Patch Bool
Invert.
invert self = not self
b.invert()
def func(b):
def Invert::invert(self): return not self
return Invert::invert(b)