Renderingen-US

Generics

Generic functions#

Type parameters go in angle brackets after the name.

reader locale
faber format --locale en — English reader surface
fn identitas<T>(T datum)  T {
    return datum
}

main {
    print identitas("Marcus")
    print identitas(42)
}
faber format --locale la — canonical Faber
functio identitas<T>(T datum)  T {
    redde datum
}

incipit {
    nota identitas("Marcus")
    nota identitas(42)
}
faber format --locale th-TH — Thai
ฟังก์ชัน identitas<T>(T datum)  T {
    คืน datum
}

เริ่ม {
    บันทึก identitas("Marcus")
    บันทึก identitas(42)
}
faber format --locale zh-Hans — Simplified Chinese
函数 identitas<T>(T datum)  T {
    返回 datum
}

入口 {
    显示 identitas("Marcus")
    显示 identitas(42)
}
faber format --locale zh-Hant — Traditional Chinese
函式 identitas<T>(T datum)  T {
    傳回 datum
}

入口 {
    註記 identitas("Marcus")
    註記 identitas(42)
}
faber format --locale vi — Vietnamese
hàm identitas<T>(T datum)  T {
    trả datum
}

bắt_đầu {
    ghi_chú identitas("Marcus")
    ghi_chú identitas(42)
}
faber format --locale ar — Arabic
دالة identitas<T>(T datum)  T {
    أعد datum
}

بداية {
    اعرض identitas("Marcus")
    اعرض identitas(42)
}
faber format --locale hi — Hindi
फलन identitas<T>(T datum)  T {
    लौटाओ datum
}

आरंभ {
    दिखाओ identitas("Marcus")
    दिखाओ identitas(42)
}

The same function serves both calls. T is fixed per call site, not erased to a dynamic value.

Generic with a union return#

Type parameters compose with unions, which is how "maybe nothing" is expressed generically.

reader locale
faber format --locale en — English reader surface
fn primum<T>(list<T> res)  T  null {
    if res.longitudo()  0 then return null
    return res[0]
}

main {
    print primum([1, 2, 3])
}
faber format --locale la — canonical Faber
functio primum<T>(lista<T> res)  T  nihil {
    si res.longitudo()  0 ergo redde nihil
    redde res[0]
}

incipit {
    nota primum([1, 2, 3])
}
faber format --locale th-TH — Thai
ฟังก์ชัน primum<T>(รายการ<T> res)  T  ว่าง {
    ถ้า res.longitudo()  0 ดังนั้น คืน ว่าง
    คืน res[0]
}

เริ่ม {
    บันทึก primum([1, 2, 3])
}
faber format --locale zh-Hans — Simplified Chinese
函数 primum<T>(列表<T> res)  T   {
    如果 res.longitudo()  0  返回 
    返回 res[0]
}

入口 {
    显示 primum([1, 2, 3])
}
faber format --locale zh-Hant — Traditional Chinese
函式 primum<T>(列表<T> res)  T   {
     res.longitudo()  0  傳回 
    傳回 res[0]
}

入口 {
    註記 primum([1, 2, 3])
}
faber format --locale vi — Vietnamese
hàm primum<T>(danh_sách<T> res)  T  rỗng {
    nếu res.longitudo()  0 do_đó trả rỗng
    trả res[0]
}

bắt_đầu {
    ghi_chú primum([1, 2, 3])
}
faber format --locale ar — Arabic
دالة primum<T>(قائمة<T> res)  T  لاشيء {
    إذا res.longitudo()  0 إذن أعد لاشيء
    أعد res[0]
}

بداية {
    اعرض primum([1, 2, 3])
}
faber format --locale hi — Hindi
फलन primum<T>(सूची<T> res)  T  शून्य {
    यदि res.longitudo()  0 अतः लौटाओ शून्य
    लौटाओ res[0]
}

आरंभ {
    दिखाओ primum([1, 2, 3])
}

Generic containers#

The built-in collections are generic already.

reader locale
faber format --locale en — English reader surface
main {
    const list<string> nomina  ["Marcus", "Julia"]
    const map<string, int> aetates  { "Marcus": 30 }
    print nomina, aetates
}
faber format --locale la — canonical Faber
incipit {
    fixum lista<textus> nomina  ["Marcus", "Julia"]
    fixum tabula<textus, numerus> aetates  { "Marcus": 30 }
    nota nomina, aetates
}
faber format --locale th-TH — Thai
เริ่ม {
    คงที่ รายการ<ข้อความ> nomina  ["Marcus", "Julia"]
    คงที่ ตาราง<ข้อความ, จำนวน> aetates  { "Marcus": 30 }
    บันทึก nomina, aetates
}
faber format --locale zh-Hans — Simplified Chinese
入口 {
    常量 列表<文本> nomina  ["Marcus", "Julia"]
    常量 映射<文本, 整数> aetates  { "Marcus": 30 }
    显示 nomina, aetates
}
faber format --locale zh-Hant — Traditional Chinese
入口 {
    定值 列表<文字> nomina  ["Marcus", "Julia"]
    定值 表格<文字, 整數> aetates  { "Marcus": 30 }
    註記 nomina, aetates
}
faber format --locale vi — Vietnamese
bắt_đầu {
    hằng danh_sách<văn_bản> nomina  ["Marcus", "Julia"]
    hằng bảng<văn_bản, số> aetates  { "Marcus": 30 }
    ghi_chú nomina, aetates
}
faber format --locale ar — Arabic
بداية {
    ثابت قائمة<نص> nomina  ["Marcus", "Julia"]
    ثابت جدول<نص, عدد> aetates  { "Marcus": 30 }
    اعرض nomina, aetates
}
faber format --locale hi — Hindi
आरंभ {
    स्थिर सूची<पाठ> nomina  ["Marcus", "Julia"]
    स्थिर तालिका<पाठ, संख्या> aetates  { "Marcus": 30 }
    दिखाओ nomina, aetates
}

Records#

class declares a record type with type-first fields.

reader locale
faber format --locale en — English reader surface
class Persona {
    string nomen
    int aetas
}

fn descriptio(Persona p)  string {
    return p.nomen
}

main {
    const Persona p  Persona {nomen = "Marcus", aetas = 30}
    print descriptio(p)
}
faber format --locale la — canonical Faber
genus Persona {
    textus nomen
    numerus aetas
}

functio descriptio(Persona p)  textus {
    redde p.nomen
}

incipit {
    fixum Persona p  Persona {nomen = "Marcus", aetas = 30}
    nota descriptio(p)
}
faber format --locale th-TH — Thai
ชนิด Persona {
    ข้อความ nomen
    จำนวน aetas
}

ฟังก์ชัน descriptio(Persona p)  ข้อความ {
    คืน p.nomen
}

เริ่ม {
    คงที่ Persona p  Persona {nomen = "Marcus", aetas = 30}
    บันทึก descriptio(p)
}
faber format --locale zh-Hans — Simplified Chinese
 Persona {
    文本 nomen
    整数 aetas
}

函数 descriptio(Persona p)  文本 {
    返回 p.nomen
}

入口 {
    常量 Persona p  Persona {nomen = "Marcus", aetas = 30}
    显示 descriptio(p)
}
faber format --locale zh-Hant — Traditional Chinese
類型 Persona {
    文字 nomen
    整數 aetas
}

函式 descriptio(Persona p)  文字 {
    傳回 p.nomen
}

入口 {
    定值 Persona p  Persona {nomen = "Marcus", aetas = 30}
    註記 descriptio(p)
}
faber format --locale vi — Vietnamese
kiểu Persona {
    văn_bản nomen
    số aetas
}

hàm descriptio(Persona p)  văn_bản {
    trả p.nomen
}

bắt_đầu {
    hằng Persona p  Persona {nomen = "Marcus", aetas = 30}
    ghi_chú descriptio(p)
}
faber format --locale ar — Arabic
صنف Persona {
    نص nomen
    عدد aetas
}

دالة descriptio(Persona p)  نص {
    أعد p.nomen
}

بداية {
    ثابت Persona p  Persona {nomen = "Marcus", aetas = 30}
    اعرض descriptio(p)
}
faber format --locale hi — Hindi
वर्ग Persona {
    पाठ nomen
    संख्या aetas
}

फलन descriptio(Persona p)  पाठ {
    लौटाओ p.nomen
}

आरंभ {
    स्थिर Persona p  Persona {nomen = "Marcus", aetas = 30}
    दिखाओ descriptio(p)
}

Functions on a record#

A class can carry functions alongside its fields.

reader locale
faber format --locale en — English reader surface
class Punctum {
    int x
    int y

    fn summa()  int {
        return self.x + self.y
    }
}

main {
    const Punctum p  Punctum {x = 1, y = 2}
    print p.summa()
}
faber format --locale la — canonical Faber
genus Punctum {
    numerus x
    numerus y

    functio summa()  numerus {
        redde ego.x + ego.y
    }
}

incipit {
    fixum Punctum p  Punctum {x = 1, y = 2}
    nota p.summa()
}
faber format --locale th-TH — Thai
ชนิด Punctum {
    จำนวน x
    จำนวน y

    ฟังก์ชัน summa()  จำนวน {
        คืน ตัวฉัน.x + ตัวฉัน.y
    }
}

เริ่ม {
    คงที่ Punctum p  Punctum {x = 1, y = 2}
    บันทึก p.summa()
}
faber format --locale zh-Hans — Simplified Chinese
 Punctum {
    整数 x
    整数 y

    函数 summa()  整数 {
        返回 自身.x + 自身.y
    }
}

入口 {
    常量 Punctum p  Punctum {x = 1, y = 2}
    显示 p.summa()
}
faber format --locale zh-Hant — Traditional Chinese
類型 Punctum {
    整數 x
    整數 y

    函式 summa()  整數 {
        傳回 自身.x + 自身.y
    }
}

入口 {
    定值 Punctum p  Punctum {x = 1, y = 2}
    註記 p.summa()
}
faber format --locale vi — Vietnamese
kiểu Punctum {
    số x
    số y

    hàm summa()  số {
        trả tôi.x + tôi.y
    }
}

bắt_đầu {
    hằng Punctum p  Punctum {x = 1, y = 2}
    ghi_chú p.summa()
}
faber format --locale ar — Arabic
صنف Punctum {
    عدد x
    عدد y

    دالة summa()  عدد {
        أعد ذات.x + ذات.y
    }
}

بداية {
    ثابت Punctum p  Punctum {x = 1, y = 2}
    اعرض p.summa()
}
faber format --locale hi — Hindi
वर्ग Punctum {
    संख्या x
    संख्या y

    फलन summa()  संख्या {
        लौटाओ मैं.x + मैं.y
    }
}

आरंभ {
    स्थिर Punctum p  Punctum {x = 1, y = 2}
    दिखाओ p.summa()
}

ego — "I" — is the receiver, what other languages spell this or self.

Related: Types and widths · Functions and flow