void *
просто у меня ничего серьёзного на луа нет
void *
я пилил одну либу для OC
void *
но забросил
Мерль
А в 5.3 integer вроде есть?
Snusmumriken
Дальше можно: c = require 'constructor' d = c:new('int', 10, 20)
Snusmumriken
Есть но не нужно. Даблов хватает же.
Snusmumriken
Ну, если добавить лишний метаметод конструктору, то вместо d = c:new('int', 10, 20) Можно писать d = c('int', 10, 20)
Snusmumriken
Типа вызов таблицы как функции.
Snusmumriken
Люблю такие штуки. Минимизируется куча фигни.
Alejandro Jeditobe
Да
Snusmumriken
Это уже есть. Метаметод __call.
Alejandro Jeditobe
Выпустили новую версию, что изменилось? Добавили новые неизвестные баги.
Snusmumriken
Ага. И не исправили ещё не обнаруженные, потому что их НЕ НАШЛИ.
Alejandro Jeditobe
В 5.2 чото добавляли важное
Alejandro Jeditobe
Совершенство. На солнце пятен нет.
Snusmumriken
Snusmumriken
На тему метаметодов, которые сейчас есть.
Snusmumriken
Ну, это просто самое типичное. Через это легко сделать, например, свою длинную арифметику, или свой класс строк.
Snusmumriken
На тему функций которые добавили в lua 5.2-5.3, есть метаметоды типа __pairs, которые вызываются при проходе по таблице. Это очень удобно. Возможность легко делать хеш-таблицы с заданным порядком (не только сортирующиеся в процесе).
Snusmumriken
Свои итераторы кто-нибудь мутил?
Snusmumriken
О, кстати, задачка на алгоритмическую сообразительность. Есть список объектов. Надо пройти по списку, и удалить часть объектов, которые соответствуют некоторому условию. Как это сделать в один проход, без ошибок выхода за пределы списка и без пропуска элементов?
Snusmumriken
Всё что нужно. Игрушки, сетевые либы, пакеры, пробиватели NAT. Даже веб-сервер на коленке. С другой стороны, гитхаба у меня нет, и я могу давать линк только на свой гугл-драйв.
Snusmumriken
Лень обыкновенная. И я пишу одновременно на куче компьютеров, одни и те же файлы. Синхронизация гугл-драйва - самое удобное.
Snusmumriken
да вроде не сложно звучит
Не сложно. Попробуй.
Snusmumriken
Не использую плагинов. Зиробрейн неплох, но я пишу на большом количестве языков. Notepad++.
🦥Alex Fails
Не сложно. Попробуй.
я ща занят, могу тебе пример на плюсах только если накидать
Snusmumriken
Давай :3 Считай что тебе надо стереть часть динамического вектора. Ну, или динамического же списка. Если брать самый грубый вариант, количество строк то же что и у обычного цикла.
Snusmumriken
оч нужно
У тебя есть хотя бы один комп с белым айпи? Мой NAT pusher регистрирует пользователя по udp, поддерживая соединение, и на запрос об айди выдает реальный айпишник. Формат сообщений - json.
Uncel
В dynasm avx-512 завезли?
Мерль
А Прокся Ок Так и я могу
Собсно это первое, что приходит в голову
Snusmumriken
Не совсем прокся. Через эту 'проксю' только получаем адрес и линкуемся напрямую. Зато оно может обслуживать кучу всего, выдавать список серверов по маске id и так далее. Главное - чтобы твое приложение отвечало на пинги хоть чем-то, иначе оно будет убито. Я буду чутка его перепиливать в сторону масштабируемости на манер DNS-сетей.
Snusmumriken
Совсем напрямую обход NAT невозможен
Snusmumriken
с v6 работает?
Luasocket не работает с ipv6. Да и когда его таки распространят, надобность в моём пушере отвалится. Use teredo, Luke. Через тередо - работает.
🦥Alex Fails
надо б им патч выслать)
Snusmumriken
Примеров решения простой задачки не будет? :3
🦥Alex Fails
чтоб ипв6 работал)
Snusmumriken
чтоб ипв6 работал)
Сложна. Это надо высылать конкретно в kepler project, которые занимаются разработкой luasocket. Слегка обидно что они заблокировали по умолчанию работу с serial port, можно было бы пилить, например, bluetooth-софтины. А разбирать и перекомпилировать лень.
🦥Alex Fails
template <typename T> struct list { T val; list *next; } // допустим, что в типе T есть функция bool remove_condition_is_true() // template<typename T> void rm_elem_from_list(list<T> &l) { list *tmp = &l; list *last = &l; while(tmp->next != 0) { if (tmp->val->remove_condition_is_true()) { last->next = tmp->next; } else { last = tmp; } tmp = tmp->next; }
Snusmumriken
Молодец. Но сложна :3
Snusmumriken
Фактически, это аналог данного
Snusmumriken
Snusmumriken
Можно проще
Мерль
Я бы так делать не стал
Snusmumriken
Почему? Что бы ты стал делать?
Мерль
Потому что сложность table.remove( . ) - O(n) То есть чтобы удалить первый элемент в таблице из тысячи записей, эта функция переберёт 999 элементов Я бы сделал как-то так local l = newlist {1, 2, 3, 4, 5, 6} --какая-нибудь релизация контейнера двунаправленного списка из миллиона существующих. Или написал бы сам урезаную версию в четыре строки local curr while curr do if not isvalid(curr.val) then curr.remove() end curr = curr.next() end Вот эта штука curr.remove() (удаление из списка) имеет сложность порядка O(1), то есть не зависит от длины списка
Snusmumriken
Ок, тогда не while i < #t а while i <= #t. Переберём все элементы. У тебя сложность чуть выше, потому что лишнее условие. На деле, можно сделать еще проще, как для восприятия, так и по длине строк. Просто чуть-чуть подумать.
Мерль
Ок, тогда не while i < #t а while i <= #t. Переберём все элементы. У тебя сложность чуть выше, потому что лишнее условие. На деле, можно сделать еще проще, как для восприятия, так и по длине строк. Просто чуть-чуть подумать.
Лол Чувак Сложность алгоритма определяется не сколько сложностью строк Проверок у меня даже меньше, чем у тебя Но дело в том, что проверка - как раз быстрая операция А вот удаление из массива - очень тяжёлая
Snusmumriken
Ответ: for i = #t, 1, -1 do if (valid) then table.remove(t, i) end end
Мерль
Проще для понимания =/= правильно
Snusmumriken
Ответ правильный. Проверь. Работает лучше всего.
Мерль
Это работает Но работает фигово
Мерль
Потому что удалять из массива воообще неправильно
Мерль
За это на собеседованиях руки отрывают И правильно делают
Мерль
Это не демагогия, а факт Ты ведь знаешь как работает table.remove ?
Мерль
Она сдвигает ** каждый ** элемент выше удаляемого на одну позицию вниз
Мерль
Неужели так сложно rtfm?
Snusmumriken
Неужели так сложно rtfm?
А те что ниже не трогает.
Snusmumriken
Да, физически не сдвигает, если что. Меняет порядок слабых связей в лишней табличке ответственной за порядок
Мерль
А те что ниже не трогает.
И что? В среднем при равномерном распределении удаляемых элементов тебе придётся сдвинуть N/2 элементов
Snusmumriken
local t = {} for i = 1, n do table.insert(t, {}) end
Snusmumriken
Делаешь пустой список на n элементов. Байты зависят от длины. Пустая таблица 50000x30000 весит полтора гига.
Мерль
Не физически же.
Ну двигет она указатели вместо флоатов и что? Разница минимально, всё равно надо переназначить N/2 указателей
Мерль
И что? Какую проблему ты тут видишь? :3
Такую, что это чертвоски долго и неэффективно Это блин азы
Snusmumriken
Такую, что это чертвоски долго и неэффективно Это блин азы
Lua не предназначена для работы с огромными массивами данных. Используй ffi.
Snusmumriken
Это эффективно :3 Давайте сделаем бенчмарк.
Мерль
Lua не предназначена для работы с огромными массивами данных. Используй ffi.
Зато нам может понадобится делать такую операцию часто и быстро Вот тогда это заиграет новыми красками И вообще, конечно же есть такая штука, как преждевременная оптимизация, однако если много говнокодить, то быстро окажется, что всё работе очень медленно и херово Неожиданность, однако
Snusmumriken
Конечно
Тогда зачем вообще нужен ipairs?