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
Да
🦥Alex Fails
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. Даже веб-сервер на коленке. С другой стороны, гитхаба у меня нет, и я могу давать линк только на свой гугл-драйв.
🦥Alex Fails
Snusmumriken
Лень обыкновенная. И я пишу одновременно на куче компьютеров, одни и те же файлы. Синхронизация гугл-драйва - самое удобное.
Snusmumriken
Snusmumriken
Не использую плагинов.
Зиробрейн неплох, но я пишу на большом количестве языков. Notepad++.
Snusmumriken
Давай :3
Считай что тебе надо стереть часть динамического вектора. Ну, или динамического же списка. Если брать самый грубый вариант, количество строк то же что и у обычного цикла.
Мерль
Мерль
Мерль
Snusmumriken
оч нужно
У тебя есть хотя бы один комп с белым айпи?
Мой NAT pusher регистрирует пользователя по udp, поддерживая соединение, и на запрос об айди выдает реальный айпишник.
Формат сообщений - json.
Uncel
В dynasm avx-512 завезли?
Мерль
Disi
Snusmumriken
Не совсем прокся. Через эту 'проксю' только получаем адрес и линкуемся напрямую.
Зато оно может обслуживать кучу всего, выдавать список серверов по маске id и так далее.
Главное - чтобы твое приложение отвечало на пинги хоть чем-то, иначе оно будет убито.
Я буду чутка его перепиливать в сторону масштабируемости на манер DNS-сетей.
Snusmumriken
Совсем напрямую обход NAT невозможен
Snusmumriken
с v6 работает?
Luasocket не работает с ipv6.
Да и когда его таки распространят, надобность в моём пушере отвалится. Use teredo, Luke.
Через тередо - работает.
🦥Alex Fails
надо б им патч выслать)
Snusmumriken
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.
Переберём все элементы.
У тебя сложность чуть выше, потому что лишнее условие.
На деле, можно сделать еще проще, как для восприятия, так и по длине строк.
Просто чуть-чуть подумать.
Мерль
Snusmumriken
Ответ:
for i = #t, 1, -1 do
if (valid) then table.remove(t, i) end
end
Мерль
Проще для понимания =/= правильно
Snusmumriken
Ответ правильный.
Проверь.
Работает лучше всего.
Мерль
Это работает
Но работает фигово
Мерль
Потому что удалять из массива воообще неправильно
Мерль
За это на собеседованиях руки отрывают
И правильно делают
Мерль
Это не демагогия, а факт
Ты ведь знаешь как работает table.remove ?
Мерль
Она сдвигает ** каждый ** элемент выше удаляемого на одну позицию вниз
Мерль
Неужели так сложно rtfm?
Snusmumriken
Да, физически не сдвигает, если что.
Меняет порядок слабых связей в лишней табличке ответственной за порядок
Мерль
А те что ниже не трогает.
И что?
В среднем при равномерном распределении удаляемых элементов тебе придётся сдвинуть N/2 элементов
Snusmumriken
local t = {}
for i = 1, n do table.insert(t, {}) end
Snusmumriken
Snusmumriken
Делаешь пустой список на n элементов.
Байты зависят от длины. Пустая таблица 50000x30000 весит полтора гига.
Мерль
Не физически же.
Ну двигет она указатели вместо флоатов и что?
Разница минимально, всё равно надо переназначить N/2 указателей
Snusmumriken
Snusmumriken
Это эффективно :3
Давайте сделаем бенчмарк.
Snusmumriken
Мерль
Snusmumriken
Конечно
Тогда зачем вообще нужен ipairs?