Занятие 15 мая
Lua C API (C)
См. документацию Lua. Здесь приведены избранные функции для старта.
Разные типы данных: чтение и запись
- lua_type(L, индекс) - возвращает тип элемента (enum)
- luaL_argcheck(L, выражение, номер аргумента, сообщение об ошибке)
- luaL_checktype(L, индекс, тип) - проверяет тип аргумента
- (кидает ошибку, если тип не сходится)
- luaL_checknumber(L, индекс) - достаёт число, лежущее по индексу
- (если там не число, кидает ошибку)
luaL_checklstring(L, индекс, &длина) - достаёт строку, лежащую по индексу
- (если там не строка, кидает ошибку)
- lua_toboolean(L, индекс) - возвращает истинность элемента
- lua_pushboolean(L, значение) - кладёт переменную типа boolean на вершину стека
- lua_pushlstring(L, строка, длина строки) - кладёт строку на стек
- lua_pushnil(L) - кладёт nil на стек
- lua_pushnumber(L, число) - кладёт число на стек
- lua_pushstring(L, C-строка) - кладёт C-строку на стек (ограничена 0-байтом)
Работа с таблицами
- lua_newtable(L) - создаёт пустую таблицу и кладёт на вершину стека
- lua_rawget(L, индекс таблицы) - достаёт значение из таблицы
- (снимает ключ с вершины стека)
- lua_rawgeti(L, индекс таблицы, числовой ключ) - достаёт значение из таблицы-массива
- lua_rawset(L, индекс таблицы) - добавляет значение в таблицу
- (снимает ключ и значение с вершины стека)
- lua_rawseti(L, индекс таблицы, числовой ключ) - добавляет значение в таблицу
- по числовому ключу
- lua_getfield(L, "имя поля") - достаёт из таблицы значение, сопоставленное полю
- lua_setfield(L, индекс таблицы, "имя поля") - добавляет элемент в таблицу
- lua_next(L, индекс ключа) - аналог функции next() Lua (для обхода словарей)
Глобальные переменные
- lua_getglobal(L, "имя глобальной переменной") - достаёт глобальную переменную
- lua_setglobal(L, "имя глобальной переменной") - устанавливает глобальную переменную
Стек
- lua_gettop(L) - узнаёт число аргументов текущей функции
- lua_pushvalue(L, индекс) - кладёт на стек копию переменной
- lua_pop(L, число элементов) - снимает элементы с вершины стека
- lua_remove(L, индекс) - удаляет элемент стека (вышестоящие элементы сдвигаются)
- lua_replace(L, индекс) - заменяет элемент стека элементом с вершины стека
Генерация ошибок
- luaL_error(L, "Сообщение об ошибке", ...) - кидает ошибку
Метатаблицы
- luaL_getmetatable(L, "название типа") - кладёт метатаблицу типа на вершину стека
- luaL_newmetatable(L, "название типа") - создаёт метатаблицу для типа
- lua_setmetatable(L, индекс элемента) - выставляет элементу метатаблицу
- (метатаблица снимается с вершины стека)
- lua_newuserdata(L, размер) - создаёт userdata, кладёт на вершину стека,
- возвращает указатель
- luaL_checkudata(L, индекс, "название типа") - достаёт userdata определенного типа
- (кидает ошибку, если тип не сходится)
Функции, замыкания
- lua_call(L, число аргументов, число результатов) - вызов функции
- См. также lua_pcall - вызов функции с перехваткой ошибок
- lua_pushcclosure(L, C-функция, число внешних лок. переменных) - создаёт замыкание
- (предварительно надо push'нуть внешние лок. переменные)
- lua_pushcfunction(L, С-функция) - создаёт замыкание без внешних лок. переменных
- lua_upvalueindex(номер внешней переменной) - возвращает индекс внешней
- переменной по её номеру (1, ..., n)
Домашнее задание
1. (Продолжение задач 1 и 2 с прошлого раза). Напишите на C модуль на Lua, возвращающий функцию.
Пример использования.
local markEqual = require 'markEqual' assert(markEqual("aaa", "aba") == "+-+")
Команда сборки на кодомо:
$ gcc -shared -fPIC -I /usr/include/lua5.1/ markEqual.c -o markEqual.so -llua5.1