Типы

Определение типа

Тип описывает множество значений, которые имеют одинаковые операции и функции специально для этих значений. Тип определяется именем типа. Ассоциативный массив map - это группа элементов одного типа к которой можно обращаться по строковому индексу. Каждый элемент имеет соответствующий уникальный строковый ключ. По умолчанию, массивы arr и map состоят из строк, но вы можете указать любую вложенность типов, разделив их точкой. Следует заметить, что переменные типов arr, map, buf, set, obj и типов определенных с помощью struct, в отличии от прочих типов, передаются по ссылке, а не по значению. Это значит, что если внутри функции вы изменили значение такого параметра, то у вас изменится оригинальная переменная.
1
TypeName = identifier { "." identifier }
Copied!
Язык Gentee содержит следующие предопределенные типы.
arr bool buf char error finfo float handle int map obj range set str time trace thread
Имя
Описание
Значения
Начальное значение
int
64-bit целочисленный тип
-9223372036854775808 .. 9223372036854775807
0
float
64-bit тип с плавающей точкой
2.22 E–308 .. 1.79 E+308
0.0
bool
логический тип
true or false
false
str
строка
последовательность байт
пустая строка
char
Unicode символ
Unicode символ int32
пробел
arr
массив
массив элементов
пустой массив строк
map
ассоциативный массив
ассоциативный массив элементов
пустой ассоциативный массив строк
buf
массив байт
последовательность uint8
пустой массив
set
массив bool
последовательность uint64 по 1 биту на значение
пустоe множество
obj
объект
int, bool, float, str, arr.obj, map.obj
nil
handle
скрытый тип
любые типы на Go
nil
Тип handle используется для передачи значений между встроенными Golang функциями. Переменная данного типа может содержать значение любого Golang типа. Go функции должны следить за типами полученных значений, которые в Gentee описаны как handle.
1
arr.map.int a
2
map.arr.str b // the same as map.arr b
3
map.bool c
4
arr.int d
Copied!

Приведение типов

В языке Gentee отсутствует автоматическое приведение типов. Для основных типов имеются функции конвертирования из одного типа в другой, их имена совпадают с именем результирующего типа.
int
bool
str
char
float
int
int(false)
int("-23")
int('A')
int(3.24)
bool
bool(1)
bool("0")
bool(1.1)
str
str(20)
str(false)
str('z')
str(5.662)
char
float
float(10)
float("-2E-34")
1
int(false) // = 0
2
int(true) // = 1
3
bool(0) // = false
4
bool(0.) // = false
5
bool(integer except zero) // = true
6
bool("") bool("0") bool("false") //=false
7
bool("not empty, zero or false string") //=true
Copied!

Структурные типы

Вы можете определить структурный тип с помощью ключевого слова struct. Укажите имя типа после ключевого слова и перечислите типы и имена полей внутри фигурных скобок. Все поля в переменной структурного типа инициализируются автоматически. Все переменные таких типов при передаче в функции передаются по ссылке, а не по значению. Для присваивания или получения значения поля, укажите его имя после точки.
1
structDecl = "struct" identifier "{" FieldDecl { newline FieldDecl } "}"
2
FieldDecl = TypeName identifier
3
FieldExpr = PrimaryExpr "." identifier
Copied!
1
struct my : int ID; str name
2
struct myStruct {
3
int ID
4
my myval
5
arr st_arr
6
map.int st_map
7
}
8
run int {
9
myStruct ms
10
ms.ID = 20
11
return ms.ID * 2
12
}
Copied!

Тип функции

Язык Gentee позволяет работать с идентификаторами функций. Вы можете получить идентификатор функции, передать его в качестве параметра и вызвать соответствующую функцию. Для работы с идентификаторами функций вы должны определить тип функции с помощью ключевого слова fn и указать типы параметров и возвращаемого значения. Для получения идентификатора функции укажите &имяфункции.fnтип. Идентификатор функции может передаваться в параметрах или присваиваться переменной соответствующего типа. Для вызова функции по её идентификатору достаточно указать имя переменной и круглые скобки с параметрами, как при вызове функции по имени.
Получение идентификатора функций не применимо к следующим функциям:
  • Встроенные функции.
  • Функции с переменным количеством параметров.
  • Функции с опциональными переменными.
1
fnDecl = "fn" FnName [FnParameters] [ TypeName ]
2
FnName = identifier
3
FnParameters = "(" [ FnParameterList ] ")"
4
FnParameterList = TypeName { [","] TypeName }
5
FnIdent = "&" FuncName "." FnName
Copied!
1
fn bin( int int ) int
2
func add( int i, int j ) int : return i + j
3
func sub( int i, int j ) int : return i - j
4
func mybin(int i j, bin f ) int : return j + f(i, j)
5
6
run int {
7
bin isub = &sub.bin
8
return mybin(1, 2, &add.bin) + mybin(3, 7, isub)
9
}
Copied!
Last modified 1yr ago