Domka
Даже кодзимы
Igor
кодзима - геймдизайнер
Igor
сомневаюсь, что он хоть что-то сам написал
Domka
Один фиг к геймдевелеперу относится
Domka
Крч его Снус тож научил
Domka
И Джона Кармака
Aqendo
Вопрос: вы разрабатываете с поддержкой LSP/IntelliSense на луа? Просто установить-то установил, а писать всякие плагины ко всему и ко вся очень проблематично. Взять даже mpv. Там встроенная либа mp, но она преимпортирована, а файлов mp.lua не нашёл. LSP не видит, что такое mp, соответственно КПД всей этой истории стремится к нулю.
Igor
И Джона Кармака
Да дум вообще снусом был написан и кармаку от доброго сердца подарен
Domka
У меня вопросец возник
Domka
крч есть таблица menu
Domka
в ней есть таблица button
Domka
menu={
button={
play=false,
setting=false,
exit=false
},
Domka
и когда я использую цикл for k,p in pairs(menu.button)do он не по порядку их выставляет, точнее у него порядок свой какой то
Domka
он сначало setting ставит, потом play, потом exit
Domka
for k,p in pairs(menu.button)do
love.graphics.print(k,menu.border.x,menu.border.y+n*16)
end
Domka
вопрос возник почему именно так делает, вродь по порядку все идут
Snusmumriken
Domka
то есть не от чего отталкиваться чтобы его создать?
Snusmumriken
Оформляй списком а ля
{
{name = "play", state = false},
{name = "settings", state = false},
{name = "exit", state = false},
}
Domka
Domka
я сразу как увидел такую шляпу так сделал, прост интересно почему так
Snusmumriken
Просто хеши не имеют определённого порядка, порядок определяется хеширующей функцией.
Snusmumriken
И есть специальная функция next, которая извлекает из таблички "следующий" ключ, а ля
local key, value = next(mytable)
while key ~= nil do
print(key, value)
key, value = next(mytable, key)
end
Domka
понял спасибо
Domka
удобно
Domka
а есть ли низкоуровневые языки которые имеют такие же таблицы с "ключами"?
Snusmumriken
В принципе, можно сделать таблички где хеши имеют порядок, а ля:
function OHash()
local hash = {}
local order = {}
hash.__order = order
local mt = {
__newindex = function(self, key, value)
if value == nil then
for i, v in ipairs(order) do
if v == key then table.remove(order, i) end
hash[k] = nil
end
return
end
hash[key] = value
table.insert(order, key)
end,
__index(self, key)
return hash[key]
end
}
return setmetatable({}, mt), spairs
end
И дальше ты такой:
local mytable = OHash()
mytable.foo = 10
mytable.bar = 20
mytable.baz = 30
И итерируешь:
for i, k in ipairs(mytable.__order) do
local v = mytable[k]
end
Можно и более приятненько, с перегрузкой всяких __pairs/__ipairs, но это 5.2
Но теряется фишечка скорости доступа/изменения хешей. Проще сразу сделать список. И нельзя пользоваться конструкторами {foo = 10, bar = 20} потому что это луёвый конструктор, и он сразу всё что можно захеширует безо всяких вызовов метаметодов.
Domka
да не мне впринципе не надо сейчас эту инфу, но спасибо мб в далеком будущем мне нужно будет мозг ебать для этого
Domka
Domka
Domka
а есть ли возможность хранить функции внутри них?
Snusmumriken
Ты можешь сделать
function foo() end
mytable = {}
mytable[foo] = 10
И функция будет ключом.
Domka
ну тип, я могу допустим в каком нибудь "Си" аналогично как в луа вызывать ключом определенную ячейку таблицы?
name["name"]="lol"
Snusmumriken
Скорее
hash_get(myhash, "key");
и
hash_set(myhash, "key", "value");
Snusmumriken
Или даже
hash * myhash = new_string_hash();
myhash->set("key", "value");
Snusmumriken
Принципиальной разницы с вариантом myhash["key"] = "value" нет.
Snusmumriken
Как вообще луашка справляется с хешированием всего подряд: у луашки всё имеет некоторый ID, и этот ID можно хешировать.
Snusmumriken
Если ты в сишке обернёшь всё подряд в обёртку с ID или какой-нибудь функцией самохеширования, ты в принципе сможешь делать структуры где всё что угодно может быть ключом-значением.
Или скастить всё в void, лол. И дальше наощупь.
Всеволод
Domka
Domka
я там сумею разобраться, больше интересно возможно ли строку впихнуть в ID ячейки массива/таблицы
Domka
крч это нужно самому делать?
Snusmumriken
ДА.
Domka
пон
Domka
Snusmumriken
В плюсах есть стандартная библиотека где есть нашаблоненные хешмапы
WDMR
Snusmumriken
Почему тебе не нравятся шаблоны?
WDMR
Вот эти параметры типов в треугольных скобочках. Это испортило простоту сипп
Snusmumriken
Чел
Snusmumriken
Во-первых, в шаблонах нет ничего принципиально сложного
Snusmumriken
Во-вторых, в сипп и без шаблонов есть с чем поебстись жёстко в сракотан, причём ебут тебя
WDMR
У них все типы данных в stl
WDMR
Вот нельзя было сделать стандартную либу без шаблонов?
Snusmumriken
Не а
Всеволод
WDMR
Snusmumriken
Да даже в собранном виде.
Snusmumriken
А теперь умножь этот объём на сорок, чтобы описать каждый вариант для каждого стандартного типа.
Snusmumriken
А потом ты лично будешь ручками писать каждый новый вариант для твоих новых свежих типов, копипастя сорцы примерно 400 раз.
Snusmumriken
Так вот. В шаблонах нет ничего плохого, и практика показывает, что их остро не любят те кто их не знает.
Snusmumriken
Те кто знает просто недолюбливает, и правильно делает.
А ещё есть те кто любит составлять шаблоны из шаблонов из шаблонов из шаблонов, но тут нет разницы с макросами-из макросов-из макросов или множественным наследованием.
Но это тот инструмент, который, при аккуратном применении, даёт очень много хорошего, и очень мало плохого.
Snusmumriken
И вот у меня тут например дишечка, и шаблончики в дишечке. И без шаблончиков, я оформлял бы по 9 отдельных функций (в сумме 18).
Нет, оно на самом деле разворачивается в 9 отдельных функций. Но количество бойлерплейта, мозговой нагрузки и отлаживаемости без шаблончиков возрастает в разы.
WDMR
Snusmumriken
Ага, и на шаблонах тоже.
Snusmumriken
Ты кстати знаком с стдлибой сишечки?
Snusmumriken
В signal.h лез? Пробовал ей пользоваться? А без IDE и готовых сниппетов, где все указатели на функции принимающие указатели на указатели и возвращающие указатели на функции разрешены?
WDMR
Snusmumriken
Щя покажу,
void (* signal(int __sig, void (* __func)(int))) (int)
А теперь попробуй понять что это за покемон, разобрав на отдельные части : )
Snusmumriken
А знаешь что ещё смешнее?
Snusmumriken
С шаблонами это можно было оформить гораздо проще, и пользоваться этим было бы тоже проще.
Всеволод
Где то слышал мнение что в прикладном коде вообще не должно быть стандартных типов. Всё уже внутри классов и структур спрятано должно быть
Snusmumriken
Ага. Когда "прикладной" код это программирование конфигами, так и происходит.
Snusmumriken
У программирования конфигами кстати, есть свой набор проблем.
Snusmumriken
А если это вдруг не про конфиги, то возникают вопросы: у них свои типы для строк? У них свои типы для чисел? Мало сорока тысяч их переизобретений?
Нет, понятно что это для "кроссплатформы", чтобы допустим, циферки работали и на 16-битных платформах и на 64-битных, и на arm'е, потому что тот же int может иметь разную размерность.
Но стандартные либы УЖЕ переопределяют их на более-менее стандартные штуки.