Документация

Здесь описаны функции и структуры для использования языка программирования Gentee в проектах на Golang.

Типы

type Custom

Тип Custom служит для дополнительной настройки компилятора и виртуальной машины. Передается при вызове функции Customize.

  • Embedded []EmbedItem - массив дополнительных функций для стандартной библиотеки.

type EmbedItem

Тип EmbedItem описывает функцию, подключаемую к стандартной библиотеки. Используется в типе Custom.

  • Prototype string - описание функции на языке Gentee. Например, myfunc(str,int) int.

  • Object interface{} - соответствующая golang функция.

type Settings

Тип Settings служит для указания дополнительных параметров при запуске байт-кода в методе Run.

  • CmdLine []string - массив параметров командной строки.

  • Stdin *os.File - свой собственный стандартный ввод.

  • Stdout *os.File - свой собственный стандартный вывод.

  • Input []byte - предопределенный стандартный ввод (stdin). Может использоваться, например, в функции ReadString.

  • Cycle uint64 - максимальное количество итераций в цикле. По умолчанию, равно 16000000.

  • Depth uint32 - максимальная вложенность исполняемых блоков. Ограничивает глубину рекурсии. По умолчанию, равно 1000.

  • SysChan chan int - канал для отправки команд SysSuspend (1), SysResume (2), SysTerminate (3). Позволяет управлять выполнением скрипта извне.

    • SysSuspend - приостановить работу скрипта и всех потоков.

    • SysResume - возобновить работу скрипта и всех потоков.

    • SysTerminate - завершить работу скрипта и всех потоков.

settings.SysChan = make(chan int)
go func() {
_, err = exec.Run(settings)
}()
settings.SysChan <- gentee.SysTerminate

Функции и методы

Customize(custom *Custom) error

Функция Customize служит для дополнительной настройки компилятора и виртуальной машины. Она должна вызываться раньше всех функций. Функция возвращает значение ошибки.

New() *Gentee

Функция New создает рабочее пространство для компиляции исходного кода.

(g *Gentee) Compile(input, path string) (*Exec, int, error)

Функция Compile компилирует скрипт переданный в input. В параметре path можно указать путь к скрипту. Функция возвращает структуру с байт-кодом, номер модуля и значение ошибки.

(g *Gentee) CompileAndRun(filename string) (interface{}, error)

Функция CompileAndRun компилирует скрипт из файле filename и выполняет его. Функция возвращает результат выполнения скрипта и значение ошибки.

(g *Gentee) CompileFile(filename string) (*Exec, int, error)

Функция CompileFile компилирует скрипт из файла filename. Функция возвращает структуру с байт-кодом, номер модуля и значение ошибки.

(exec *Exec) Run(settings Settings) (interface{}, error)

Функция Run выполняет байт-код из структуры exec. В параметре settings можно указать дополнительные настройки. Функция возвращает результат выполнения скрипта и значение ошибки.

Gentee2GoType(val interface{}, vtype... string) interface{}

Функция Gentee2GoType конвертирует переменную в стандартные типы Go. Во втором параметре можно указать тип Gentee переменной. Например, arr.bool. В этом случае, вы получите массив переменных типа bool, а не int64. Вы можете использовать эту функцию, в ваших встраиваемых функциях.

Таблица соответствия типов

Gentee тип

Получаемый тип

Возвращаемый тип (vtype)

int

int64

int64

bool

int64

bool ("bool")

char

int64

rune ("rune")

float

float64

float64

str

string

string

arr

*core.Array

[]interface{}

buf

*core.Buffer

[]byte

map

*core.Map

map[string]interface{}

set

*core.Set

[]byte

struct type

*core.Struct

map[string]interface{}

obj

*core.Obj

interface{}

func cnv1(in *core.Map) (*core.Map, error) {
my := gentee.Gentee2GoType(in).(map[string]interface{})
for key, a := range my {
for i, v := range a.([]interface{}) {
a.([]interface{})[i] = v.(int64) + 1
}
delete(my, key)
my[key+`2`] = a
}
ret, err := gentee.Go2GenteeType(my)
return ret.(*core.Map), err
}

Go2GenteeType(val interface{}, vtype... string) (interface{}, error)

Функция Go2GenteeType конвертирует стандартный тип Go в тип Gentee. Во втором параметре можно указать тип Gentee переменной. Например, set, если вы хотите сконвертировать []byte в *core.Set. Вы можете использовать эту функцию, в ваших встраиваемых функциях.

Таблица соответствия типов

Gentee тип

Получаемый Go тип

Возвращаемый тип (vtype)

int

all int & uint

int64

bool

bool

int64

char

rune

int64

float

float64

float64

str

string

string

arr

[]interface{}

*core.Array

buf

[]byte

*core.Buffer

set

[]byte

*core.Set ("set")

map

map[string]interface{}

*core.Map

obj

interface{}

*core.Obj ("obj")

func cnv5(in *core.Set) (*core.Set, error) {
my := gentee.Gentee2GoType(in).([]byte)
for i, b := range my {
if i > 10 {
break
}
if b == 0 {
my[i] = 1
} else {
my[i] = b - 1
}
}
ret, err := gentee.Go2GenteeType(my, `set`)
return ret.(*core.Set), err
}

Version() string

Функция Version возвращает номер текущей версии языка.