erg/doc/zh_TW/compiler/transpile.md
Cai Bingjun 37abfb36d3 trifle
2022-09-11 20:03:06 +08:00

2.3 KiB
Raw Blame History

Erg 代碼如何轉譯成 Python 代碼?

badge

準確地說Erg 代碼被轉譯為 Python 字節碼。 但是,由于 Python 字節碼幾乎可以重構為 Python 代碼,因此這里以等效的 Python 代碼為例。 順便說一句,這里展示的示例是低優化級別。 更高級的優化消除了不需要實例化的東西。

記錄,記錄類型

它將被轉譯為一個命名元組。 對于 namedtuple請參閱 此處。 有一個類似的函數dataclass但是由于 __eq____hash__ 的自動實現dataclass 的性能略有下降。

Employee = Class {.name = Str; .id = Int}

employee = Employee.new({.name = "John Smith"; .id = 100})

assert employee.name == "John Smith"
from typing import NamedTuple

class Employee(NamedTuple):
    __records__ = ['name', 'id']
    name: str
    id: int

employee = Employee('John Smith', 100)

assert employee.name == 'John Smith'

如果可以進一步優化,它也將轉換為簡單的元組。

多態類型

在制品

即時范圍

如果沒有發生命名空間沖突,它只會被破壞和擴展。 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 = _()

可見性

它對公共變量沒有任何作用,因為它是 Python 的默認值。 私有變量由 mangling 處理。

x=1
y =
    x = 2
    assert module::x == 2
module::x = 1
y::x = 2
assert module::x == 2
y = None