模塊
Erg允許您將文件本身視為單個記錄(Record)。這稱為模塊
# foo.er
.i = 1
# 定義 foo 模塊與定義這條記錄幾乎相同
foo = {.i = 1}
# bar.er
foo = import "foo"
print! foo # <module 'foo'>
assert foo.i == 1
由于模塊類型也是記錄類型,因此可以進行解構賦值
# 和 {sin; cos; ...} = import "math" 一樣
{sin; cos} = import "math"
模塊可見性
目錄和文件都可以是模塊
但是,在默認情況下,Erg不將目錄識別為Erg模塊。要讓它被識別,創建一個名為__init__.er
的文件
__init__.er
類似于Python中的__init__.py
└─┬ bar
└─ __init__.er
現在bar
目錄被識別為一個模塊。如果bar
中的唯一文件是__init__.er
,則目錄結構沒有多大意義,但如果您想將多個模塊捆綁到一個模塊中,它會很有用。例如:
└─┬ bar
├─ __init__.er
├─ baz.er
└─ qux.er
在bar
目錄之外,您可以像下面這樣使用
bar = import "bar"
bar.baz.p!()
bar.qux.p!()
__init__.er
不僅僅是一個將目錄作為模塊的標記,它還控制模塊的可見性
# __init__.er
# `. /` 指向當前目錄。可以省略
.baz = import ". /baz"
qux = import ". /qux"
.f x =
.baz.f ...
.g x =
qux.f ...
當你從外部導入 bar
模塊時,baz
模塊可以訪問,但 qux
模塊不能。
循環依賴
Erg 允許您定義模塊之間的循環依賴關系。
# foo.er
bar = import "bar"
print! bar.g 1
.f x = x
# bar.er
foo = import "foo"
print! foo.f 1
.g x = x
但是,由過程調用創建的變量不能在循環引用模塊中定義 這是因為 Erg 根據依賴關系重新排列定義的順序
# foo.er
bar = import "bar"
print! bar.x
.x = g!(1) # 模塊錯誤:由過程調用創建的變量不能在循環引用模塊中定義
# bar.er
foo = import "foo"
print! foo.x
.x = 0
此外,作為入口點的 Erg 模塊(即 __name__ == "__main__"
的模塊)不能成為循環引用的主題