Functions and control flow
Functions#
Các hàm trong Faber được khai báo bằng hàm, sử dụng cú pháp tham số đặt kiểu trước và kiểu trả về bằng glyph.
Cú pháp cơ bản#
hàm twice(số n) → số {
trả n
}Với kênh lỗi:
hàm parse(văn_bản input) → số ⇥ văn_bản {
trả 0
}Ví dụ#
# No parameters, no return
hàm saluta() → trống {
ghi_chú "Salve, Mundus!"
}
# Parameter, no explicit return
hàm dic(văn_bản verbum) → trống {
ghi_chú verbum
}
# Parameter and return type
hàm duplica(số n) → số {
trả n * 2
}
# Multiple parameters
hàm adde(số a, số b) → số {
trả a + b
}Giá trị trả về#
Sử dụng trả để trả về thông thường:
hàm porta(số x) → số {
nếu x ≺ 0 do_đó trả 0
trả x * 2
}Dùng trả không kèm giá trị cho kiểu trả về trống:
hàm tace() → trống {
trả
}Mượn và tính khả biến (de, in, ex)#
Faber đánh dấu cách truyền một giá trị bằng các giới từ ngắn đặt trên tham số:
| Dấu | Ý nghĩa | Hạ cấp Rust điển hình |
|---|---|---|
| (không có) | Giá trị sở hữu | T truyền theo giá trị |
ra | Mượn dùng chung (chỉ đọc) | &T |
vào | Mượn có thể thay đổi | &mut T |
từ | Tiêu thụ (move vào hàm gọi) | T move |
# Shared borrow
functio imprime(de textus label) → vacuum {
nota label
}
# Mutable borrow
functio duplica(in numerus value) → vacuum {
value ← value * 2
}
# Consume
functio consume(ex textus buffer) → textus {
redde buffer
}
# Owned
functio salve(textus nomen) → textus {
redde "Salve, §!"(nomen)
}Các từ tương tự (ra, từ) cũng được dùng lại trong những cấu trúc khác — không được hiểu mọi từ là “tiêu thụ”:
| Cú pháp | Vai trò |
|---|---|
de textus name trên tham số | Mượn dùng chung |
in numerus count trên tham số | Mượn có thể thay đổi |
ex textus buffer trên tham số | Move vào hàm gọi |
itera ex items fixum item | Lặp qua các giá trị |
itera de tabula fixum key | Lặp qua các khóa |
ex source fixum x, ceteri rest | Phân rã các trường |
importa ex "path" | Nhập từ mô-đun |
Điểm vào#
Điểm vào của chương trình là bắt_đầu:
bắt_đầu {
ghi_chú "ingressus"
}Điểm vào CLI#
Đối với các chương trình CLI, incipit argumenta nhận các đối số lệnh đã được phân tích:
@ cli "echo"
@ descriptio "Prints text"
@ operandus ceteri textus words
incipit argumenta args {
itera ex args.words fixum word {
nota word
}
}Chế độ truyền — sponte#
sponte đánh dấu một tham số có thể được lược bỏ bởi bên gọi:
hàm connect(văn_bản host, số port tự_nguyện) → trống {
ghi_chú host
}Control flow#
Rẽ nhánh điều kiện#
si / sin / secus#
bắt_đầu {
hằng logic condition ← đúng
nếu condition {
# truthy branch
ghi_chú "matched"
}
}Với else-if và else:
bắt_đầu {
hằng số score ← 85
nếu score ≥ 90 {
ghi_chú "A"
}
nếukhôngthì score ≥ 80 {
ghi_chú "B"
}
khác {
ghi_chú "C"
}
}Nhánh rút gọn với ergo#
Thân nhánh chỉ gồm một câu lệnh sử dụng ergo:
hàm classify(số b, logic ready, số value) → số ∪ rỗng {
nếu b ≡ 0 do_đó trả rỗng
nếu ready do_đó trả value
trả rỗng
}Lặp#
Giá trị — itera ex#
hàm inveni(danh_sách<số> items, số target) → số ∪ rỗng {
lặp từ items hằng item {
nếu item ≡ target do_đó trả item
}
trả rỗng
}Khóa — itera de#
bắt_đầu {
hằng json tabula ← { "unus": 1, "duo": 2 }
lặp ra tabula hằng key {
ghi_chú key
}
}Khoảng — itera ab#
bắt_đầu {
lặp khoảng 0‥10 hằng i {
ghi_chú i
}
}Vòng lặp while#
bắt_đầu {
hằng logic condition ← đúng
trong_khi condition {
# body
im_lặng
}
}Khối bảo vệ — custodi#
custodi nhóm các kiểm tra thoát sớm trước thân chính của một hàm.
Mỗi mệnh đề nếu là một điều kiện bảo vệ được kiểm tra tuần tự:
hàm divide(số a, số b) → số {
canh_gác {
nếu b ≡ 0 {
trả 0
}
}
trả a / b
}Trong v1, không thể dùng break trong custodi — đây là lan can bảo vệ, không phải vòng lặp.
Đối sánh mẫu — elige#
chọn chọn nhánh khớp đầu tiên:
hàm describe(số value) → văn_bản {
phân_tích value {
trường_hợp 1 {
trả "one"
}
trường_hợp 2 {
trả "two"
}
trường_hợp _ {
trả "many"
}
}
}Đối sánh union có thẻ — discerne#
phân_tích đối sánh đầy đủ các biến thể của discretio:
hợp_nhất Exitus {
Bonum {
văn_bản nuntius
},
Malum {
văn_bản causa
},
}
hàm refer(Exitus eventus) → văn_bản {
phân_tích eventus {
trường_hợp Bonum hằng nuntius {
trả nuntius
}
trường_hợp Malum hằng causa {
trả "Error: §"(causa)
}
}
}Khối try — fac / cape#
làm mở một khối có thể phát sinh lỗi, còn bắt khôi phục khi lỗi xảy ra:
hàm divide(số a, số b) → số {
trả a / b
}
hàm tutus(số a, số b) → số {
làm {
trả divide(a, b)
}
bắt err {
cảnh_báo err
trả 0
}
}Generics#
Các hàm, bí danh kiểu, kiểu và implendum chấp nhận tham số kiểu theo cú pháp <T>.
Hàm tổng quát#
hàm identitas<T>(T valor) → T {
trả valor
}
hàm primum<T>(danh_sách<T> res) → T ∪ rỗng {
trả res.primus()
}Đối số kiểu tường minh tại vị trí gọi#
hàm identitas<T>(T valor) → T {
trả valor
}
hàm primum<T>(danh_sách<T> res) → T ∪ rỗng {
trả rỗng
}
hằng số value ← identitas<số>(7)
hằng số ∪ rỗng maybe ← primum<số>([value])kiểu tổng quát#
kiểu Par<T> {
T primus
T secundus
}Tham số kích thước#
magnitudo khai báo một tham số kích thước/chỉ mục trong các danh sách tham số tổng quát:
hàm crea<T, kích_thước N>() → ten_xo<T, [N]> {
trả tập_rỗng
}