mirror of
https://github.com/erg-lang/erg.git
synced 2025-10-01 21:21:10 +00:00
2.2 KiB
2.2 KiB
Erg 代码如何转译成 Python 代码?
准确地说,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