Snusmumriken
Всем привет!
Подскажите, пожалуйста.
local t = {"unix":"5", "windows" : "foo", "apple" : "88", "microsoft" : "bar", "google" : "-5", "awk" : "baz", "c++" : "a"}
Хочу отсортировать ключи по алфавиту:
local key_list = {}
for key, _ in pairs(t) do
table.insert(key_list, tostring(key))
end
table.sort(key_list)
local info = {}
for _, v in pairs(key_list) do
info[v] = t[v]
end
Получаю:
{'c++': 'a', 'windows': 'foo', 'awk': 'baz', 'google': '-5', 'apple': '88',
'microsoft': 'bar', 'unix': '5'}
От перемены мест слагаемых, сумма не меняется.
От порядка добавления строковых ключей в хеш-табличку, их порядок тоже не меняется и зависит только от хеш функции.
Snusmumriken
Так что
function ordered_pairs(tbl, sortfunc)
local list = {}
for k, v in pairs(tbl) do list[#list + 1] = k end
table.sort(list, sortfunc)
local index = 0
return function()
index = index + 1
local key = list[index]
if not key then return end
return key, tbl[key], index
end
end
Но упорядоченность будет только у этого итератора, внутри таблички оно всё равно будет иметь рандомный порядок ))
Артем
Такс
Понял
Артем
Спасибо!
Денис
Snusmumriken
Например, ты сделал textinput, с обработкой выделенного текста и положения курсора на string:sub, ты не можешь просто так взять и заменить на utf8:sub, потому что его нет. Всё то же самое надо перекалькулировать и усложнять.
Денис
Snusmumriken
Там только utf8.offset, который указывает смещение до текущего символа. Без его длины, кстати. Ну то есть можно дописать функционал, но консистентность немного поломается и будет похоже на манки патчинг.
Snusmumriken
Ну условно проитерировать по символам — да, а вот обрезать а ля "отпилить пять символов справа и семь слева" — уже неприятно.
Snusmumriken
И вот такой штуки мне например тоже очень сильно не хватало.
for int startbyte, int endbyte in sstr.uoffsets(string u8text) do
local char = u8text:sub(startbyte, endbyte)
print(char, startbyte, endbyte)
end
Итератора по границам символов, мол, обрезаешь сколько тебе нужно. Есть и альтернативный итератор, который просто проходит по символам, но там расход памяти на нарезку строк, кстати.
Денис
Меня до сих пор вот бесит, когда мы виндовых библиотеках работаем с уникодными строками, и приходится гонять строки из мультибайта в WideChar и обратно, вот это боль...
Денис
И да, это относится конкретно к Lua
Денис
Вообще, отсутствие нормальных возможностей по подключению сторонних библиотек или использование системного API меня калит. Был LuaFFI, но это теперь фича жита, а если я не хочу сидеть на 5.1.1?
Денис
Писать сишные биндинги, как по мне, - путь в никуда, ибо тебе помимо луя придется выучить еще и C, еще и работу со стеком Lua понять, а если ты выучил C, то надо тебе тогда Lua?
Денис
Спасибо хотя бы за такие проекты, как Alien. Но ведь и там все негладко: использовать объявленные структуры внутри новообъявляемых структур нельзя, строки фиксированной длины - нельзя, нормально перегонять строки в ожидаемые на платформе - нельзя, нужно городить огород (спасибо хотя бы на том, что это можно сделать существующими способами)...
Денис
Snusmumriken
А, ну тут utf8.codes как итератор, я про него забыл.
User
Добрый день, можете подсказать как получить переменную с среды скрипта?
Snusmumriken
Snusmumriken
Что ты делаешь? Или что ты хочешь сделать?
User
В каком контексте?
В плане я создаю для скрипта среду ( environment ), чтобы изолировать его локальные переменные, и записываю туда "var" 50, и вызываю например функцию в этом скрипте get_script_id( ), и хочу получить переменную var
Snusmumriken
Вот из environment'а и получаешь
User
я получаю, у меня либо возращает пустую переменную, либо nil
Snusmumriken
Какая версия Lua?
User
LuaJIT 2.1.0
Snusmumriken
Ага, сек
Snusmumriken
User
User
собственно я и хочу получить в этой функции переменную со среды
Snusmumriken
Лол, так ты же не сказал что ты с С++ создаёшь окружение, как я пойму? )
Snusmumriken
Там — void lua_getglobal(lua_State *L, const char *name);
User
Немного не праивльно сформулировал мысль
Snusmumriken
И вопрос кажется звучит примерно как "Я создаю луа стейт, как из луа стейта получить переменную". Не?
User
Snusmumriken
Ну вот getglobal пушит глобальное значение в стек, вытряхиваешь его из стека и делаешь с ним что хочешь. Там уже всякие luaL_checknumber/luaL_optnumber и всякая такая ерунда.
User
Всё равно 0 возвращает
код:
lua_getglobal(L, "var" );
int iVar = lua_tonumber(L, 1);
printf(%i\n", iVar)
lua_pop(L, 1)
Snusmumriken
А var вообще объявлено?
User
да
User
да
если написать просто в луа:
return var
и получить значение в инт будет 50, то есть переменная есть
Snusmumriken
Snusmumriken
Если что, обычно функции работают с концом стека. Последний элемент стека — -1.
settop(L, 0); — чистит стек. Я вот убрал из стека nil которым было "a" при первом вызове.
Snusmumriken
Всё равно 0 возвращает
код:
lua_getglobal(L, "var" );
int iVar = lua_tonumber(L, 1);
printf(%i\n", iVar)
lua_pop(L, 1)
Так что возможно у тебя в стеке уже был какой-то nil с предыдущих вызовов:
lua_getglobal(L, "var" );
int iVar = lua_tonumber(L, -1);
printf(%i\n", iVar)
lua_pop(L, 1)
или
lua_settop(L, 0);
lua_getglobal(L, "var" );
int iVar = lua_tonumber(L, 1);
printf(%i\n", iVar)
lua_pop(L, 1)
User
User
User
а, всё, работает, спасибо за помощь
Null
лол, на википедии пасхалка
Null
в статье про песню Dragostea Din Tei
Rider
Кодеры, как жизнь?
Snusmumriken
Под пивас
Rider
Спасибо за помощь в Луа. Роботов пока в стронку. Я все по своей трейдерской теме. Создал группу по взглядам. Если админу интересно пишите. Ссылку кидать прямо не буду. Не хочу против правил.
GLOOM {Читайте БИО}
А lua можно использовать для мессенджера ?
Luсky
Да хоть для браузера
Null
WDMR
Null
что пишешь?
Lucky
Lucky
Под пивас
Привет! Снус, подскажи пожалуйста, тот модуль для простых TUI, что ты показывал, нет ли чего-то такого же простого на Python?
Aqendo
Lucky
dialog?
Да не, там совсем простенько. Диалог кучерявый.
Aqendo
бсд с таким умудряется всю систему установить, а ты жалуешься)
Aqendo
Понял
Aqendo
Ещё rich мне советовали
Null
а ncurses тоже слишком сложно, да? :)
Lucky
Lucky
модуль, который снус показывал, всего 4 кб, 213 строк
Hello, World! 🎄
Lucky
terminal.lua называется
Lucky
Lucky
Snusmumriken
Полагаю https://github.com/gravmatt/py-term
Lucky
Alxius
Lua. как получить имя функции из которой вызвали функцию? E vtyz Есть функция.function screens (x,y) её очень часто вызывают гораздо чаще чем надо.. если бы я мог знать ОТКУДА её так часто вызывают я бы орешил сразу все проблемы.. но я не знаю как узнать откуда "спам" идёт.. Может кто помочь?
Александр
Highly Likely
Highly Likely
Профилировщиу Луажита кажется тоже умеет показывать нечто такое