Дополнительные возможности

Как добавить свои функции в стандартную библиотеку

При использовании Gentee в других проектах может возникнуть потребность в расширении стандартной библиотеки. Функция Customize позволяет добавить любое количество go-функций в стандартную библиотеку и использовать их в скриптах. Следует заметить, что в этом случае скрипты не будут компилироваться оригинальным компилятором, так как там будут отсутствовать добавленные функции. Функцию Customize необходимо вызвать до вызова прочих функций из пакета gentee.
Для расширения стандартной библиотеки необходимо указать массив функций в параметрe типа Custom. Каждая функция описывается структурой EmbedItem, в которой указывается прототип на языке Gentee и сама функция. Функция может возвращать значение типа error и иметь переменное количество параметров.

Соответствие типов

Параметры и возвращаемое значение подключаемых go-функций должны иметь типы в соответствии с данной таблицей. При использовании core типов необходимо импортировать github.com/gentee/gentee/core.
Gentee тип
Golang тип
int
int64
bool
int64
char
int64
thread
int64
float
float64
str
string
arr
*core.Array
buf
*core.Buffer
map
*core.Map
set
*core.Set
struct type
*core.Struct
obj
*core.Obj
1
func sum(x, y int64) int64 {
2
return x + 2*y
3
}
4
5
func varInt(init int64, pars ...int64) int64 {
6
for _, i := range pars {
7
init += i
8
}
9
return init
10
}
11
12
func shortLen(s string) (int64, error) {
13
if len(s) < 10 {
14
return len(s), nil
15
}
16
return 0, fmt.Errorf("string %s is too long", s)
17
}
18
19
func main() {
20
var customLib = []gentee.EmbedItem{
21
{Prototype: `sum(int,int) int`, Object: sum},
22
{Prototype: `InitSum(int) int`, Object: varInt},
23
{Prototype: `ShortLen(str) int`, Object: shortLen},
24
}
25
err := gentee.Customize(&gentee.Custom{
26
Embedded: customLib,
27
})
28
if err != nil {
29
log.Fatal(err)
30
}
31
workspace := gentee.New()
32
exec, _, err := workspace.Compile(`run {
33
Println("Sum = %{sum(10, 6)}")
34
Println("InitSum = " + InitSum(4, 67, 4, 22))
35
ShortLen("this string is too long")
36
}`, ``)
37
...
38
}
Copied!
Last modified 1yr ago