模塊

badge

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__" 的模塊)不能成為循環引用的主題