Типы и данные
Как данные моделируются в текущем bootstrap-subset gof.
Встроенные scalar values
Сейчас базовые scalar types такие:
int,string,bool,json
Есть также unit, который означает "нет осмысленного значения", и runtime-level
values вроде tasks, channels и cancellation tokens.
Parameterized annotations: list[int], dict[int], channel[int], task[int], Result[int, RuntimeError].
Списки
values: list[int] = [10, 20, 30]
return values[0] + len(values)Текущие правила:
- список должен быть однородным, когда type layer может это вывести
append(list, value)возвращает новый списокfirst(list)иlast(list)возвращаютResult[element, RuntimeError]slice(list, start, end)возвращаетResult[list[element], RuntimeError]reverse(list)иsort(list)возвращают новые спискиmin(list)иmax(list)возвращаютResult[element, RuntimeError]
List helpers в gof — это явное построение нового значения, а не скрытая мутация.
Словари
store: dict[int] = {"ok": 7, "warn": 2}
return store["ok"] + len(store)base: dict[int] = {"ok": 7}
next = insert(base, "warn", 2)
return next["warn"]Текущие правила: строковые ключи, dict(), insert(dict, key, value), keys(dict), values(dict), contains(dict, "key"), len(dict).
Числовые выражения
value = -(8 + 2) / 5
rest = value % 2Сравнения
- equality через
==и!=дляint,string,bool,json,unit,list[T],dict[T],struct,enum,Result[T, E] - ordering через
<,<=,>,>=только дляintиstring
Struct
struct Point:
x: int
y: int
fn total(point: Point) -> int:
return point.x + point.yEnum
enum JobState:
Ready
Running(pid: int)
Failed(message: string)Unit-вариант: EnumName.Variant. Payload-вариант: EnumName.Variant(value, ...).
Result
fn halve(value: int) -> Result[int, string]:
if value % 2 != 0:
return Result.Err("odd")
return Result.Ok(value / 2)Result.Ok(value)иResult.Err(error)— конструкторы- postfix
expr?распаковываетOkи делает раннийreturnнаErr - operational helpers тоже возвращают
Result
RuntimeError
Встроенный operational error enum: EnvMissing, Io, ChannelClosed, Cancelled, TaskFailed, TaskPanicked, ParseInt, EmptySequence, Slice, Json, Csv, Toml, HttpRequest, HttpStatus.
Методы
fn Point.with_bonus(self: Point, extra: int) -> int:
return self.x + self.y + extraReceiver type объявляется в имени метода, первый параметр должен совпадать.
Как правильно думать о данных в gof
- scalar — для простых значений
- list — для упорядоченных однородных данных
- dict — для string-keyed lookup
- struct — для shaped data
- enum — для закрытого набора состояний
- Result — для явного recoverable success/error flow