Mark ☢️
У меня всё равно пока не хватает мозгов разбираться во всех этих разновидностях разновидностей деревьев, их фичах и особенностях. Так что просто сократим: "воспользуйся деревом"
Кароч в б-дереве ссылок на чайлдов сильно больше 2. Поэтому слоев тоже меньше. Но и узел пожырнее. Поэтому если узел сделать размером со страницу памяти то профет ядреный
Snusmumriken
Кароч в б-дереве ссылок на чайлдов сильно больше 2. Поэтому слоев тоже меньше. Но и узел пожырнее. Поэтому если узел сделать размером со страницу памяти то профет ядреный
Мы же на луёвой стороне а не на сишной, нам хватит дерева индексов по буковкам. И даже словарь английского языка на 30-100к слов влезет в оперативку и по нему будет достаточно оперативно искаться. Плюс ещё в идеале впихнуть веса частоупотребления слов (или даже связок слов), если мы делаем клавиатуру/подсказки.
Snusmumriken
Во, чот такое: local dict = { a = { a = {...} b = {...}, ... n = { ['#'] = 10, -- вес текущего слова an a = {}, ... d = { ['#'] = 20, -- вес and a = {} }, }, ... } Распихнуть весь словарь по такой фигне. Памяти сожрёт конечно дофига, но довольно быстро ищется и подсказывает по частоте словоупотребления. Извращение? Ну да, зато работает ))
Snusmumriken
Тогда разговор ниачём, да
Нет, не "ни о чём", а ты предлагаешь в луа-чате мегарешение для железной стороны, которую надо писать на сишке. Не, ну это хорошо для общего образования, но имхо немножко избыточно.
Mark ☢️
Может и да. Надо бенчить
Snusmumriken
Или luajit-ffi, да.
Snusmumriken
Перебирать надо пол списка, а тут типа дерево, в которое запиханы буковки, да ещё и с весами слов.
Snusmumriken
Там ещё надо уметь дополнять слова, типа "enga" дополняем до "engage", "engaged" и, например "engagedly", так что дерево выдаёт весь список слов начинающихся на "enga", да ещё и с весами частоты употребления: переходим по листикам, считываем (то где есть волшебный ["#"]), набираем слова по частоте употребления.
Mark ☢️
Ордередмап тоесть
Snusmumriken
Хм. Ну типа бинарный поиск, да.
Mark ☢️
Хм. Ну типа бинарный поиск, да.
Там не бинарный в плюсах
Snusmumriken
А какой?
Mark ☢️
Бдерево же
Snusmumriken
Аы
Mark ☢️
Но это не точно. Имплементейшен специфик
Mark ☢️
Тоесть в musl наверно таки бинарный. Но тоже не точно
Snusmumriken
В общем, чот сложное и плюсовое, очень специфичное.
Mark ☢️
Ну не мусл, а в ембеддед либах для ц++
Mark ☢️
В общем, чот сложное и плюсовое, очень специфичное.
Костылить и велосипедить на луе -- еще хуже, имхо
Snusmumriken
Highly Likely
Сегодня пытался придумать адекватную прокси-табличку, которая бы была оберткой над модулем, чтобы при отсутствии модуля не падать с attempt to index a nil value, но в итоге взгрустнул, что все варианты адекватно предусмотреть не получится (или я глупый). Ну чот типа такого. Исходный модуль CoolModule. Вызов какой-нибудь функции CoolModule.MyFunc(). Получение какой-нибудь константы CoolModule.CONST. И вот в некоторых случаях этого модуля может не быть. И хочется избавиться от проверок а-ля if CoolModule then … end
Highly Likely
Не то чтобы это вопрос (задачу решил иначе), но вдруг Снус скажет что я дурак и забыл, что как-то можно было подхачить :)
Mark ☢️
Highly Likely
Переопределить __index и навесить туда логику по типу __index = function(t, k) if CoolModule then return CoolModule[k] else return bla end Не получается, ибо перестает работать, если мы дергаем функции CoolModule, ибо Attempt to call a nil value
Snusmumriken
Сегодня пытался придумать адекватную прокси-табличку, которая бы была оберткой над модулем, чтобы при отсутствии модуля не падать с attempt to index a nil value, но в итоге взгрустнул, что все варианты адекватно предусмотреть не получится (или я глупый). Ну чот типа такого. Исходный модуль CoolModule. Вызов какой-нибудь функции CoolModule.MyFunc(). Получение какой-нибудь константы CoolModule.CONST. И вот в некоторых случаях этого модуля может не быть. И хочется избавиться от проверок а-ля if CoolModule then … end
А это смотря что ты делаешь со значениями ключей, которые не можешь найти. Ну класека — local MyTable = {} local mt = {} function mt:__index(key) return rawget(self, key) or "Nothing here" end setmetatable(mt, MyTable) Другое дело что возвращаемое "дефолтное значение" может быть только одного типа. Но можно извратиться: local MyTable = {} local emptyProxy = {} local mt = {} setmetatable(emptyProxy, mt) function mt:__tostring() return "nothing here" end function mt:__concat(v) return tostring(self) .. tostring(v) end function mt:__call() return "empty func" end -- рекурсия, о да function mt.__index(...) return rawget(...) or emptyProxy end function mt:__add(v) return self == emptyProxy and v or self end mt.__sub = mt.__add mt.__mul = mt.__add mt.__div = mt.__add setmetatable(MyTable, {__index = mt.__index}) Эту "дефолтную таблицу" можно вызывать как функцию, складывать, вычитать, конкатенировать и она работает типа как "дефолтное пустое значение с которым делайте что хотите, ничо не будет"
Highly Likely
Но в итоге, пока кода мало, ограничился (хотя и не хотел) проверками if CoolModule then
Snusmumriken
А ещё есть pcall, кек
Highly Likely
pcall защищает от attempt to index/call a nil value?
Snusmumriken
Ещё как
Highly Likely
А, точно
Highly Likely
(простите, я в последнее время маловато пишу на Lua системные весчи)
Snusmumriken
Он защищает даже от части ошибок на сишной стороне (когда рейзится еррор)
Highly Likely
Ага, вспомнил, спасибо
Snusmumriken
Ага, вспомнил, спасибо
Блин, допилил прокси-таблицу, теперь можно неограниченно дёргать ключи рекурсивно, хоть так: MyTable.Foo.Bar(), даже если никаких Foo и Bar нету. Давно не делал такие адовые хаки.
Highly Likely
Универсальный safe-wrapper для неоднозначно подгруженных модулей
Snusmumriken
Единственная проблема — тип возвращаемого значения всё равно таблица, могут ругаться некоторые функции, типа "хуле ты сюда таблицу сунул", особенно сишные с проверкой аргументов. Но тут я уже не помогу. Но делать с этой таблицей можно что угодно.
Mark ☢️
@JohnRoebot
Mark ☢️
Этот бот у меет в капчу
Mark ☢️
только что лично видел
fgntfg
Pavel
а че он java обидел?
Highly Likely
а че он java обидел?
А чего Джаву не обижать?
Highly Likely
:-)
fgntfg
Java сложно описать одним словом
Highly Likely
Java is SPECIAL
Snusmumriken
Bit
Existing уж тогда :)
Snusmumriken
Лады
Egor
Подскажите ::pos{0,2,-81.0034,-135.1533,270.4962} чем и как лучше такой текст распарсить? точнее надо вытащить цифры, разделенные запятыми
fgntfg
Регулярные выражения
Mikhail
Подскажите ::pos{0,2,-81.0034,-135.1533,270.4962} чем и как лучше такой текст распарсить? точнее надо вытащить цифры, разделенные запятыми
проще шаблонами-паттернами. По примерам все поймешь. И не надо углубляться в регулярные выражения http://lua-users.org/wiki/PatternsTutorial
Egor
проще шаблонами-паттернами. По примерам все поймешь. И не надо углубляться в регулярные выражения http://lua-users.org/wiki/PatternsTutorial
О, кажется подходит, я бегло глянул, он умеет в массив? т.е. несколько совпадений запихнуть в массив?
Mikhail
О, кажется подходит, я бегло глянул, он умеет в массив? т.е. несколько совпадений запихнуть в массив?
))) думаю можно обернуть так, чтобы в массив... но в примере не будет массива. в Луа вообще нет массивов...(есть tables - как массивы)
Egor
ну как там, ьтаблицы
Egor
а регекс... pcre надо врубать как отдельный модуль.
Mikhail
я бы использовал цикл. но щас проснется народ. посоветует тебе решение из 1-2 строк
Egor
я бы использовал цикл. но щас проснется народ. посоветует тебе решение из 1-2 строк
мне нужно решение, которое не требует доп. либ, а инструментами, что входит в кор
Mikhail
ссылка тебе дана была без доп либ. и регулярные выражения в луа тоже СВОИ встроены. если надо нормальные - - то подключать
Mikhail
не надо бояться подключать сторонние библиотеки.
Egor
не надо бояться подключать сторонние библиотеки.
я внутри игры кодю, там трудновато добавлять
Egor
и еще сложнее шарить код для других игроков
Mikhail
я внутри игры кодю, там трудновато добавлять
судя по всему ты нуб в Луа. а так, если что ты мог бы чужой исходный код в свой вставить. И шарить все вместе. как 1 файлик но для твоей задачи ничего внешнего НЕ надо
Ivan
string.gmatch норм вытаскивает
Egor
так что бандлить все не вариант
Ivan
Что-нибудь вроде string.gmatch('::pos{0,2,-81.0034,-135.1533,270.4962}', '[-%d.]+')
Ivan
Но судить по такому маленькому примеру - это всё равно что по фотографии лечить
Ivan
Ну тогда должно работать и можно обойтись встроенными паттернами
Sergey
как мне не ждать выполнения функции
Sergey
а просто запустить ее выполнение и все
Sergey
дальше не котролироват
Sergey
просто щас в коде идет лаг на еее выполнение
Egor
корутины?