mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 12:51:10 +00:00
3.8 KiB
3.8 KiB
特殊形式
特殊形式是不能在 Erg 類型系統中表達的運算符、子程序(等等)。它被`包圍,但實際上無法捕獲 此外,為方便起見,還出現了"Pattern"、"Body"和"Conv"等類型,但不存在此類類型。它的含義也取決于上下文
=
(pat: Pattern, body: Body) -> NoneType
將 body 分配給 pat 作為變量。如果變量已存在于同一范圍內或與 pat 不匹配,則引發錯誤 它還用于記錄屬性定義和默認參數
record = {i = 1; j = 2}
f(x: Int, y = 2) = ...
當主體是類型或函數時,=
具有特殊行為
左側的變量名嵌入到右側的對象中
print! Class() # <class <lambda>>
print! x: Int -> x + 1 # <function <lambda>>
C = Class()
print! c # <class C>
f = x: Int -> x + 1
print! f # <function f>
g x: Int = x + 1
print! g # <function g>
K X: Int = Class(...)
print! K # <kind K>
L = X: Int -> Class(...)
print! L # <kind L>
=
運算符的返回值為"未定義"
函數中的多個賦值和 =
會導致語法錯誤
i = j = 1 # SyntaxError: 不允許多次賦值
print!(x=1) # SyntaxError: cannot use `=` in function arguments
# 提示: 您的意思是關鍵字參數(`x: 1`)嗎?
if True, do:
i = 0 # SyntaxError: 塊不能被賦值表達式終止
->
(pat: Pattern, body: Body) -> Func
生成匿名函數,函數類型
=>
(pat: Pattern, body: Body) -> Proc
生成匿名過程,過程類型
:
(subject, T)
確定主題是否與 T 匹配。如果它們不匹配,則拋出編譯錯誤
a: Int
f x: Int, y: Int = x / y
也用于 :
應用樣式
f x:
y
z
像:
和=
一樣,運算的結果是不確定的
_ = x: Int # 語法錯誤:
print!(x: Int) # 語法錯誤:
.
(obj, attr)
讀取obj的屬性
x.[y, z]
將 x 的 y 和 z 屬性作為數組返回
|>
(obj, c: Callable)
執行c(obj)
。x + y |>.foo()
與 (x + y).foo()
相同
(x: Option T)?
-> T
后綴運算符。如果出現錯誤,請立即調用 x.unwrap()
和 return
match(obj, *lambdas: Lambda)
對于 obj,執行與模式匹配的 lambda
match [1, 2, 3]:
(l: Int) -> log "this is type of Int"
[[a], b] -> log a, b
[*a] -> log a
# (1, 2, 3)
Del(*x: T) -> NoneType
刪除變量"x"。但是,無法刪除內置對象
a = 1
Del a # OK
Del True # SyntaxError: cannot delete a built-in object
do(body: Body) -> Func
生成一個不帶參數的匿名函數。() ->
的語法糖
do!(body: Body) -> Proc
生成不帶參數的匿名過程。() =>
的語法糖
集合運算符
[]
(*objs)
從參數創建一個數組或從可選參數創建一個字典
{}
(*objs)
從參數創建一個集合
{}
(*fields: ((Field, Value); N))
生成記錄
{}
(layout, *names, *preds)
生成篩型
*
展開嵌套集合。它也可以用于模式匹配
[x, *y] = [1, 2, 3]
assert x == 1 and y == [2, 3]
assert [x, *y] == [1, 2, 3]
assert [*y, x] == [2, 3, 1]
{x; *yz} = {x = 1; y = 2; z = 3}
assert x == 1 and yz == {y = 2; z = 3}
assert {x; *yz} == {x = 1; y = 2; z = 3}
虛擬運算符
用戶不能直接使用的運算符
ref(x: T) -> Ref T
返回對對象的不可變引用
ref!(x: T!) -> Ref! T!
返回對可變對象的可變引用。