Size: a a a

2021 January 08

T

The Dormouse in pro.lua
В сишных Луа-библиотеках нет способа без костылей сделать константы, доступные в Lua?

https://www.lua.org/pil/26.2.html
> Next, we declare an array with all functions and their respective names. This array has elements of type luaL_reg, which is a structure with two fields: a string and a function pointer.
    static const struct luaL_reg mylib [] = {
     {"dir", l_dir},
     {NULL, NULL}  /* sentinel */
   };

Выглядит, там могут быть только функции, верно?
sudo summon @Snusmumriken, ты много биндил, вроде.
источник

T

The Dormouse in pro.lua
Хотя, есть смысл посмотреть, как встроенные библиотеки сделаны, там же есть константы.
источник

T

The Dormouse in pro.lua
  /* placeholders */
 {"pi", NULL},
 {"huge", NULL},
 {"maxinteger", NULL},
 {"mininteger", NULL},
 {NULL, NULL}
};


/*
** Open math library
*/
LUAMOD_API int luaopen_math (lua_State *L) {
 luaL_newlib(L, mathlib);
 lua_pushnumber(L, PI);
 lua_setfield(L, -2, "pi");
 lua_pushnumber(L, (lua_Number)HUGE_VAL);
 lua_setfield(L, -2, "huge");
 lua_pushinteger(L, LUA_MAXINTEGER);
 lua_setfield(L, -2, "maxinteger");
 lua_pushinteger(L, LUA_MININTEGER);
 lua_setfield(L, -2, "mininteger");
 return 1;
}

Забавно.
источник

T

The Dormouse in pro.lua
Что важнее при создании биндинга сишной библиотеки к Lua?
Анонимный опрос
12%
Сохранить API оригинальной библиотеки
88%
Сделать более Lua-way API для биндинга
Проголосовало: 17
источник

T

The Dormouse in pro.lua
Иными словами, есть ли смысл сохранить общий для всех функций префикс и сохранить флаги на уровне библиотеки?
Или лучше убрать префикс (т.к. функции всё равно в таблице-неймспейсе) и заменить передачу интовых флагов в функции на таблицы с параметрами?

TL;DR:
lib.lib_func1(param1, param2, lib.FLAG1 | lib.FLAG3)
vs
lib.func1(param1, param2, {flag1 = true, some_value = something })

За первый вариант говорит то, что не нужно делать документацию или много пояснений, и все примеры переносятся почти 1 в 1. Против него, кажется, говорит всё остальное.
источник
2021 January 09

S

Snusmumriken in pro.lua
The Dormouse
Иными словами, есть ли смысл сохранить общий для всех функций префикс и сохранить флаги на уровне библиотеки?
Или лучше убрать префикс (т.к. функции всё равно в таблице-неймспейсе) и заменить передачу интовых флагов в функции на таблицы с параметрами?

TL;DR:
lib.lib_func1(param1, param2, lib.FLAG1 | lib.FLAG3)
vs
lib.func1(param1, param2, {flag1 = true, some_value = something })

За первый вариант говорит то, что не нужно делать документацию или много пояснений, и все примеры переносятся почти 1 в 1. Против него, кажется, говорит всё остальное.
2

Документацию всё равно нужно делать.
Примеры и так переносятся 1в1, если у тебя есть строка с require твоей библиотеки:
local mylib = require"mylib"
print( mylib.foo(10, 20) )
источник

S

Snusmumriken in pro.lua
The Dormouse
  /* placeholders */
 {"pi", NULL},
 {"huge", NULL},
 {"maxinteger", NULL},
 {"mininteger", NULL},
 {NULL, NULL}
};


/*
** Open math library
*/
LUAMOD_API int luaopen_math (lua_State *L) {
 luaL_newlib(L, mathlib);
 lua_pushnumber(L, PI);
 lua_setfield(L, -2, "pi");
 lua_pushnumber(L, (lua_Number)HUGE_VAL);
 lua_setfield(L, -2, "huge");
 lua_pushinteger(L, LUA_MAXINTEGER);
 lua_setfield(L, -2, "maxinteger");
 lua_pushinteger(L, LUA_MININTEGER);
 lua_setfield(L, -2, "mininteger");
 return 1;
}

Забавно.
// Не люблю setfield, дёргает метаметоды
#define luax_tsfunction(L, name,  func)  lua_pushstring(L, name);  lua_pushcfunction(L, func); lua_rawset(L, -3)
#define luax_tnnumber(L, index, value) lua_pushnumber(L, index); lua_pushnumber(L, value);   lua_rawset(L, -3)
#define luax_tsnumber(L, name,  value) lua_pushstring(L, name);  lua_pushnumber(L, value);   lua_rawset(L, -3)

int luaopen_math (lua_State *L) {
 luaL_newtable(L);
   luax_tsfunction(L, "dir", luamath_dir);
   luax_tsnumber(L, "pi", PI);
   luax_tsnumber(L, "huge", HUGE_VAL);
 return 1;
}

Мне нравятся подобные варианты тем, что тут полный контроль над либой.
источник

AR

Alxius R in pro.lua
User
имя акка другое, а картинка та же
Это илон Маск бесстыдник мошенничает :)
источник

U

User in pro.lua
Alxius R
Это илон Маск бесстыдник мошенничает :)
источник

AR

Alxius R in pro.lua
Да знаю пошутить что-ли нельзя )
источник

U

User in pro.lua
надо видимо сменить тэг группы. она в какой-то базе :/
источник

T

The Dormouse in pro.lua
Snusmumriken
2

Документацию всё равно нужно делать.
Примеры и так переносятся 1в1, если у тебя есть строка с require твоей библиотеки:
local mylib = require"mylib"
print( mylib.foo(10, 20) )
> Документацию всё равно нужно делать.
Не уверен, что в этом есть смысл, если можно сослаться на официальную документацию, указав разницу в API. Написать полноценную документацию для ~100 функций там, где официальная документация не очень хорошо структурирована (т.е. её нельзя сконвертировать) — работа в несколько раз больше, чем сгенерировать биндинг.

По крайней мере, если не уверен, что этим кто-то кроме тебя когда-нибудь будет пользоваться.
источник

S

Snusmumriken in pro.lua
The Dormouse
> Документацию всё равно нужно делать.
Не уверен, что в этом есть смысл, если можно сослаться на официальную документацию, указав разницу в API. Написать полноценную документацию для ~100 функций там, где официальная документация не очень хорошо структурирована (т.е. её нельзя сконвертировать) — работа в несколько раз больше, чем сгенерировать биндинг.

По крайней мере, если не уверен, что этим кто-то кроме тебя когда-нибудь будет пользоваться.
В подобном виде, всё равно крайне желательна документация, за примером биндинга почти без доки можно  посмотреть сюда: https://luapower.com/libcurl или сюда: https://luapower.com/clipper.
В этом очень неудобно разбираться, постоянно скача между одной докой и другой, ещё приходится смотреть  на код биндинга, чтобы понимать какие константы где что означают, где какая версия либы была использована и т.д. Плюс придётся документировать твои разрешения ситуаций несовместимости типов, а ля "сишная функция хочет список указателей строк с указанием количества элементов".
источник

S

Snusmumriken in pro.lua
Человеку, который учится работать с твоей либой, значительно удобнее смотреть всё в одном месте, особенно когда там, пусть и повторно, но расписаны все фичи, плюс есть примеры использования именно твоей либы.
источник

S

Snusmumriken in pro.lua
Если биндинг простой, и там все функции легко мапятся - пожалуйста. Если он худо-бедно сложный - уже желательно всё передокументировать.
источник

NK

ID:1583762736 in pro.lua
источник
2021 January 10

m

mds in pro.lua
Всем привет, посоветуйте пожалуйста библиотеку для работы с snmp под lua
источник

m

mds in pro.lua
раньше использовал luasnmp, но она не поддерживает работу с последней версией netsnmp
источник

m

mds in pro.lua
не работает с  net-snmp 5.8 если быть точным
источник

U

UsernameAK in pro.lua
https://www.lua.org/manual/5.1/manual.html
тут написано
 Lua handles a chunk as the body of an anonymous function with a variable number of arguments (see §2.5.9). As such, chunks can define local variables, **receive arguments**, and return values. 
вопрос, а как он может принимать аргументы, если у него нет части которая function()?
допустим я передал из сишного апи при вызове его аргументы
куда они попадут?
источник