#hws
fvar(s)
s = block
s.select( BLK_BODY )
а то в FTCG они только именуются объектами и таковыми не являются даже близко. Это все нужно для того, чтобы сделать более удобный и красивый интерфейс cgt, который бы возвращал именно объекты(схема, елемент, св-во, точка и т.д.), а не их id.
Оформление:
обязательное наличие процедуры загрузки и выгрузки
#cpp
int initScript(char *fileName, int data); // <- возвращает некий id объекта скрипта, fileName - текст скрипта, data - некие данные
void freeScript(int id);
точка выполнения методов скрипта
#cpp
TValue *run(int id, char *entryPoint, TValues *args);
// после отработки функции скрипта значение возвращается в типе TValue
// id - то, что вернулось после initScript
// entryPoint - тут все ясно
// args массив аргументов
регистрация внешних методов
#cpp
int regFunc(int id, TFunc *func);
// возвращает код ошибки
// func указатель на функцию
регистрация внешних переменных
#cpp
int regVariable(int id, TArg *var);
// var - определяет тип и область памяти внешней переменной
регистрация внешних объектов
(тут надо еще подумать каким интерфейсом это лучше организовать. Как раз объекты lng, block и sys должны быть реализованы через него и не являтся частью синтаксиса скрипта)
примерный вариант такой:
#cpp
int regObject(int id, TFuncList *methods, TArgs *fields, char *name);
где:
#cpp
typedef struct {
char *name;
int type;
void *value;
} TArg;
typedef struct {
int count;
TArg arg[];
} TArgs;
typedef struct {
int type;
void *value;
} TValue;
typedef struct {
int count;
TValue arg[];
} TValues;
typedef TValue*(TFuncProc) (int data, TValues *args);
typedef struct {
char *name;
TFuncProc *proc;
TArgs *args;
} TFunc;
typedef struct {
int count;
TFunc *procs[];
} TFuncList;
typedef struct {
int count;
TFunc *procs[];
} TFieldList;
в будущем наверно имело бы смысл приделать и пользовательские типы, чтобы скажем делать такое:
#hws
func test()
fvar(s)
s = new TStringList()
s.add("hello world")
s.add("second string")
trace(s.text)
end
с описанным выше интерфейсом это можно сделать и так, если все объекты хранить на стороне "клиента" и регить их в скрипте через regObject:
#hws
func test()
fvar(s)
s = makeObject('TStringList')
s.add("hello world")
s.add("second string")
trace(s.text)
end