2015-02-19 4 views
1

Я работаю над подключением моделирования электронного устройства 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, чтобы повысить адекватную ошибку.

Другие подводные камни

Может быть, есть еще возможно подводных камней я не знаю о?

+1

Обычно вы просто проверяете аргументы, переданные непосредственно в самой функции 'lua_CFunction', вызывая' lua_check * ', предоставляемые API lua. Непонятно, зачем вам вообще помещать их в список ссылок. Если вам нужно больше контролировать, как выполняются сценарии lua, здесь могут быть полезны такие функции, как 'pcall' и' xpcall'. Вы также можете имитировать параметры аргумента ключевого слова python с помощью lua-tables, и в этом случае порядок параметров не имеет значения. – greatwolf

+0

Причина заключается в том, чтобы сделать его более показательным, и каждый чек - это проверка только одной строки. Но идея со столом очень интересная. Можете ли вы ответить на него как на вопрос? – pugnator

+1

Может быть полезно, если вы разместите код привязки, который показывает, как вы проверяете аргументы и как вы вызываете базовую функцию C. Обратите внимание, что вам не нужно создавать собственную структуру 'lua_bind_func', lua-api уже предоставляет что-то вроде этого - она ​​называется' luaL_Reg'. – greatwolf

ответ

0

Чтобы использовать Lua для запуска сценариев, которые вызывают функции C, необходимо:

  • Запись каждый C функция будет экспортироваться в Lua с использованием протокола Lua получить аргументы и возвращаемые значения.
  • Экспортируйте эти функции C в Lua как глобальные переменные или поля в таблице.
  • Запуск пользовательских скриптов, улавливающих ошибки синтаксиса и ошибки выполнения, с использованием защищенных вызовов.
  • При необходимости предоставить сценарии пользователя среду для разрешения глобальных переменных.

C API предоставляет функции для выполнения всего этого без особых усилий.

См. Стандартные библиотеки C, которые включены в исходный код Lua. Начните с простейших, например math или os.

Читайте также книгу Programming in Lua.

Смежные вопросы