Snusmumriken
Только кто-то сверху ))
Да не, хороших учеников было много. И мне повезло что они были первыми.
Anonymous
Насчет кулаков вспомнил: Надо обеим сторонам (особенно тому кто с ошибками) практиковать "научный" подход, когда исправление каждой ошибки - это шаг вперёд и ничего зазорного в этом нет.
Вроде и без этого понятно, что конструктивная критика есть хорошо, но в буквенном виде такое лучше :)
Anonymous
Ибо не все понимают и принимают в штыки. А иногда косяки начинают "политкорректно" описываться, что тоже весело
Anonymous
Мол ни в чем не виноват, но вот таки дела...
Короче, хорош с меня повествований, а @FGNTFG спасибо за ссылку на clickerjam!
Snusmumriken
Не все способны на научный подход.
Один товарищ постоянно присылает мне рандомные куски кода и спрашивает, на тему логики: "А так - правильно?". Иногда больше похоже что он бьётся головой об клавиатуру. Я его спрашиваю: "А это что? А что ты хотел?", но он жутко невнимательный и даже списать без ошибок не может. Пихает рандомные переменные в случайные места, например. Жутко благодарный, но, блин, не учится. Точнее, учится, но о-о-о-очень медленно, огромное количество дыр в знаний даже базового синтаксиса и ожидание что все вокруг - телепаты. Вроде бы и не стоит, но жалко. Типа того.
Snusmumriken
Хорошо кушай и хорошо спи. Это универсально.
Anonymous
Я так вообще синтаксис Луа по примерам других брутфорсил. Несколько самостоятельных проектов и ситуация заметно улучшилась по вниканию и построению архитектуры. (меж тем на Хабре зачитывался)
Да, рандомные переменные - нормально может для него. Пускай через недели 2 попытается вернуться к своим вермешелям в коде и авось прозреет.
Anonymous
Anonymous
А ёще ими страдают те, кто в чате и проектами не занимается!
Snusmumriken
fgntfg
я когда большое что-то пишу, то переменные будут вида типИмя
fgntfg
а так - однобуквенное месево
fgntfg
ну когда хуяк-хуяк и в продакшен
Anonymous
for i ...
fgntfg
ну и результат функции у меня в rez или res
fgntfg
da
fgntfg
иногда в функциях встречаются обе две
Snusmumriken
Однобуквенные удобны для локальных мелочей.
for i, a in ipairs(objects) do
for j, b in ipairs(objects) do
if a:collide(b) then do domething end
end
end
fgntfg
Snusmumriken
Да ладно, в типичной мало-мальски большой игруле, списки сущностей больше.
Snusmumriken
Snusmumriken
Старбаунд графонистее, но уникального контента меньше. Но это уже оффтоп ))
Идея с монстриков из запчастей у них забавная, но проблема с ИИ для них.
fgntfg
вангую в тёрках и старбаундах кластерезацию
Snusmumriken
Чанкизация - конечно.
Но ничто не мешает тебе выбросить из инвентаря сто миллионов блоков по одной штуке.
fgntfg
игра превращается в кликер
fgntfg
ну и да, инвентарь там не такой большой
fgntfg
кажется
Snusmumriken
Там сундуки есть. Можно выбрасывать их содержимое.
Кстати, интересно поэксперементировать с этим.
fgntfg
Интересно, как скоро игра превратиться в лагач?
Snusmumriken
Во-во. Хотя там есть оптимизация: однотипные кирпичи, находящиеся рядом, стакаются в одну сущность.
mva
почему сюда постоянно кучками набегают?
mva
// и молчат потом...
Dika
так делают везде
MrSmith
Вот я сейчас серьезно, есть любители доты?
MrSmith
MrSmith
Гуйз хочет кто мод пописать?
Snusmumriken
Слишком сложно ))
Ты про первую? А то с меня начальство хочет побольше карт на третий варик, чтобы прям интересно было.
MrSmith
Tverd
Нужен аналог питонячего OrderedDict?
Tverd
на тесты?
Snusmumriken
Его можно написать.
Но фигня в том, что его нельзя создавать вот так:
v = orderedDict{{a = 10}, {a = 20}, {a = 30}}, то есть, необходимо его сначала создать, а потом заполнять.
__newindex срабатывает на момент добавления нового поля, при инициализации он всегда будет пуст.
И да, тут есть косяки в плане удаления значений из такого словаря.
Когда мы пишем: dict.key = nil - newindex тоже не срабатывает. Разве что держать пустую прокси-табличку, в __index которой - словарь (и доступ по числовым ключам), а в __newindex - заведение нового значения или удаление из таблички.
В общем, довольно много мусора на один упорядоченный словарь.
Если заполнять огромным количеством ключей - получится довольно жопно (три-четыре таблички на одну фигню).
Хотя набросать рабочий могу )))
Tverd
он уже написан
Tverd
https://pastebin.com/bAWpi0n1
Snusmumriken
Тут есть лишние ключи в объекте: _keys и _vals. Можно без этого, через прокси.
Tverd
тогда надо прокси сохранять в объекте
Snusmumriken
Не а, надо таблицу сохранять в замыкании, а прокси вывешивать наружу ))
Теперь надо придумать как по этому итерировать через pairs/ipairs.
Snusmumriken
Вот вообще не вижу никаких проблем ))
Итератор по хеш-стороне и по числовой. Хм.
Tverd
окай, подумаю как через прокси сделать
Tverd
Снус, а где пример чего-нить такого? а то не совсем понятно - сохранять в замыкании? там несколько таблиц
Tverd
что-то типа этого?
local function createHashtable() -- конструктор хэштаблицы
local self = {
_keys = {}, -- список ключей
_vals = {}, -- список значений
_keyvals = {}, -- таблица ключ-значение
}
local proxy = newproxy(true)
local mt = getmetatable(proxy)
mt.__index = function( _, k )
end
mt.__newindex = function( _, k, v )
end
return proxy
end
return createHashtable
Snusmumriken
Что-то типа этого. Но я сейчас смотрю, удаление не прокатывает, хм. Надо подумать. Не исключено что будет нормально сплошь на методах:
`dict:add(key, value)`
`dict:remove(key)`
Snusmumriken
А я-то хотел сахарно ))
Плюс метаметоды pairs/dict нормально работают толко в lua5.2 и выше.
Tverd
у меня не сработало setmetatable на прокси, може ошибся где
Snusmumriken
Ох, ты в качестве прокси дёргаешь newproxy? Эта функция возвращает абстрактный указатель. Проще возвращать пустую табличку. Тут - прокси-таблица а не указатель, в общем.
Tverd
а, ну тогда проще... для меня прокся - это через newproxy )))
Snusmumriken
В принципе, с newproxy тоже должно проканать. Это же чисто перенаправлятор.
Tverd
ну да, а сильно медленнее такой создание таблиц, нежели обычным способом? я так понимаю постоянная компиляция при new? не так выразился, интерпретатор проходит же по заново создаваемым функциям?
Snusmumriken
Медленно, да. Ещё как. Ну, в сравнении с нативными фичами.
Ну, тогда в функциях index/newindex будут использоваться не таблицы числовых/реальный словарь, а непойми что. Тут нужны замыкания, для "скрытости" реального положения дел, чтобы нельзя было ничего случайно сломать.
Tverd
ну или проксей тогда скрывать, без замыканий...
Snusmumriken
Ой, боюсь что не покатит ((
Карочи, надо подумать. Вариант объекта с методами add/get/pairs/ipairs - оказывается самым надёжным и быстрым, хоть и не таким сахарным.
Tverd
опять же pairs/ipairs у меня не покатит, только свой итератор
Snusmumriken
Во, чот такое. Хотя всё равно не очень правильно.
Snusmumriken
Мороки реально ещё больше. Тут удаление через set(number_key, nil) корректно работает только если значение - таблица или функция (ссылки с уникальными id), или наш словарь заполнен сплошь уникальными значениями.
Это можно исправить если хранить ещё одну таблицу numberToKey, но с ней тоже морока.
Dmitry Kichev
ребя а почему луа стабильней питона? ))
Snusmumriken
Потому что проще.
Чем сложнее инструмент, тем больше в нём косяков.
А почему вы спрашиваете? ))
Dmitry Kichev
выбрали типо стабильный
Snusmumriken
Ну и правильно. Проблема в чём? ))
Питон - с бохатой библиотекой, но большим количеством неочевидностей.
Луа - с бедной библиотекой, но с мелким количеством неочевидностей (по пальцам пересчитать), плюс luajit как магии кусок. Да и народ учить проще.
Dmitry Kichev
ну вот учить буду ) даже не знал о таком языке. стабильность только не понятно чем меряется, оно же все динамически типизированное.. ну в питоне плюшки - слайсы, как бы админы одобряют вроде
Snusmumriken
Подозреваю что под "стабильностью" они имели ввиду скорость исполнения и отсутствие жутких внешних тормозов при обработке большого количества данных разом (из-за сборки мусора и не шибко оптимальной работе со структурами данных).
Snusmumriken
У меня на работе весь бекенд на луа, и всё ок, а там распределённые вычисления на куче серверов с map-reduce и прочим ))
Dmitry Kichev
ну да, про скорость говорили, плюсы и луа. у них все скоростное должно быть, свои протоколы.. крутые ребята ))
Dmitry Kichev
mva
но отвечая на то, что ты на самом деле имел в виду, хочется привести цитату одного именитого разработчика:
Snusmumriken
Цитата: "А я - томат!" - и это сказал я!
mva
Python tries to give you as much as possible, while Lua tries to give you as **less** as possible
mva
То бишь: питон — комбаен, который в любой момент может отстрелить тебе ногу потому что ты его не знаешь
Snusmumriken
И никогда не узнаешь, потому что он не поместится у тебя в голове.
mva
а Lua — набор "сделай сам" из которого ты можешь сделать ровно то, что тебе нужно