Kết xuấtvi

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ĩaHạ cấp Rust điển hình
(không có)Giá trị sở hữuT truyền theo giá trị
raMượn dùng chung (chỉ đọc)&T
vàoMượ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ápVai 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 itemLặp qua các giá trị
itera de tabula fixum keyLặp qua các khóa
ex source fixum x, ceteri restPhâ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-ifelse:

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 010 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ểuimplendum 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
}