Я работаю над подключением моделирования электронного устройства Lua.
Я хочу, чтобы это было хорошо в дизайне и удобстве использования, поскольку, скорее всего, многие пользователи далеки от ИТ и отладки ,
Пользователи описывают устройство в Lua, а plug-in переводит его через API Lua C.
Пользователи могут пропустить имена функций, типы переменных и порядок аргументов.
Хорошее руководство помогает, но приложение не должно терпеть крах или давать плохие описанные ошибки. Я не нашел никаких «лучших практик» и хочу спросить опытных пользователей, поскольку я совершенно новый для Lua. ПорядокОбработка вызовов Lua и ошибок в C пуленепробиваемым способом
Аргументы и тип
На данный момент функции Lua объявляются так:
typedef struct lua_bind_func
{
int32_t (*lua_c_api) (lua_State*);
const char* lua_func_name;
} lua_bind_func;
И затем
{.lua_func_name="state_to_string", .lua_c_api=&lua_state_to_string},
Для того, чтобы проверить, что порядок аргументов и типы передаются исправить:
Создание макросов:
#define STRING (&lua_isstring)
#define INT (&lua_isinteger)
#define USER (&lua_islightuserdata)
Добавить массив в список:
int (*args[16]) (lua_State*, int index);
Изменения список функций:
{.lua_func_name="set_callback", .lua_c_api=&lua_set_callback, .args={INT, INT}}
Список параметров проверка:
static void
SAFE_EXECUTE (lua_State* L, void* curfunc)
{
int argnum = lua_gettop (L);
for (int i=0; lua_c_api_list[i].lua_func_name; i++)
{
if (curfunc == lua_c_api_list[i].lua_c_api)
{
for (int argcount=0; lua_c_api_list[i].args[argcount]; argcount++)
{
if (argnum < argcount+1)
{
IDSIMMODEL* model = (IDSIMMODEL*) lua_get_model_obj (L);
print_error (model, "Too few arguments passed to the function \"%s\"", lua_c_api_list[i].lua_func_name);
}
else if (!lua_c_api_list[i].args[argcount] (L, argcount+1))
{
IDSIMMODEL* model = (IDSIMMODEL*) lua_get_model_obj (L);
print_error (model, "Argument %d is of wrong type", argcount+1);
}
}
}
}
}
Тогда я могу проверить порядок аргументов, их типов и может создать соответствующее сообщение об ошибке с помощью мини-справки:
SAFE_EXECUTE (L, &lua_set_callback);
Код не обрабатывает дополнительные аргументы, но его легко добавить.
Вопрос: сценарий в порядке или может быть лучше?
Опечатки имена функций
Например, у меня есть следующий код:
set_callback(time + 100 * MSEC, PC_EVENT)
set_calback(time + 200 * MSEC, PC_EVENT)
set_callback(time + 333 * MSEC, PC_EVENT)
Второй Ошибочное и после этой части код не выполняется.
Я не могу понять, как поймать вызов неопределенной функции в C, чтобы повысить адекватную ошибку.
Другие подводные камни
Может быть, есть еще возможно подводных камней я не знаю о?
Обычно вы просто проверяете аргументы, переданные непосредственно в самой функции 'lua_CFunction', вызывая' lua_check * ', предоставляемые API lua. Непонятно, зачем вам вообще помещать их в список ссылок. Если вам нужно больше контролировать, как выполняются сценарии lua, здесь могут быть полезны такие функции, как 'pcall' и' xpcall'. Вы также можете имитировать параметры аргумента ключевого слова python с помощью lua-tables, и в этом случае порядок параметров не имеет значения. – greatwolf
Причина заключается в том, чтобы сделать его более показательным, и каждый чек - это проверка только одной строки. Но идея со столом очень интересная. Можете ли вы ответить на него как на вопрос? – pugnator
Может быть полезно, если вы разместите код привязки, который показывает, как вы проверяете аргументы и как вы вызываете базовую функцию C. Обратите внимание, что вам не нужно создавать собственную структуру 'lua_bind_func', lua-api уже предоставляет что-то вроде этого - она называется' luaL_Reg'. – greatwolf