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
вопрос возник почему именно так делает, вродь по порядку все идут
Domka
то есть не от чего отталкиваться чтобы его создать?
Snusmumriken
Оформляй списком а ля { {name = "play", state = false}, {name = "settings", state = false}, {name = "exit", state = false}, }
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
UtoECat
а есть ли низкоуровневые языки которые имеют такие же таблицы с "ключами"?
хеш таблицу сделать не сложно, сложно сделать хеш таблицу максимально эффективную... Хотя последнее зависит от того, для чего эта таблица будет применяться. На реализацию луашных таблиц на си можешь в любое время глянуть в исходниках лушаки.
Snusmumriken
а есть ли низкоуровневые языки которые имеют такие же таблицы с "ключами"?
Низкоуровневые языки обычно имеют строгую типизацию, поэтому настолько радостных кей-валуев, где кей и валуй может быть чем угодно там нет. Обычно есть хешмапы на шаблонах, где кеи и валуи фиксированного типа.
Domka
а есть ли возможность хранить функции внутри них?
Snusmumriken
ну просто ключи же там есть?
"Просто ключи" это что? Строки? Числа? Функции? Юзердата? Булеаны?
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
я там сумею разобраться, больше интересно возможно ли строку впихнуть в ID ячейки массива/таблицы
Snusmumriken
я там сумею разобраться, больше интересно возможно ли строку впихнуть в ID ячейки массива/таблицы
В сишке? typedef struct Hashable { void * ptr; ull ID; ETYPE type; size_t size } Пихаешь сюда что угодно (прописав всю ерунду) и делаешь структуру с функциями которые оборачивают ключи-значения в это, а потом хешируешь по айдишке например, или если это строки — по строкам.
Domka
крч это нужно самому делать?
Snusmumriken
ДА.
Domka
пон
Domka
Snusmumriken
В плюсах есть стандартная библиотека где есть нашаблоненные хешмапы
Snusmumriken
Почему тебе не нравятся шаблоны?
WDMR
Вот эти параметры типов в треугольных скобочках. Это испортило простоту сипп
Snusmumriken
Чел
Snusmumriken
Во-первых, в шаблонах нет ничего принципиально сложного
Snusmumriken
Во-вторых, в сипп и без шаблонов есть с чем поебстись жёстко в сракотан, причём ебут тебя
WDMR
У них все типы данных в stl
WDMR
Вот нельзя было сделать стандартную либу без шаблонов?
Snusmumriken
Не а
Snusmumriken
Вот нельзя было сделать стандартную либу без шаблонов?
Скажи мне пожалуйста, сколько места занимает стандартная плюсовая либа? В гигабайтах, пожалуйста.
Snusmumriken
Да даже в собранном виде.
Snusmumriken
А теперь умножь этот объём на сорок, чтобы описать каждый вариант для каждого стандартного типа.
Snusmumriken
А потом ты лично будешь ручками писать каждый новый вариант для твоих новых свежих типов, копипастя сорцы примерно 400 раз.
Snusmumriken
Так вот. В шаблонах нет ничего плохого, и практика показывает, что их остро не любят те кто их не знает.
Snusmumriken
Те кто знает просто недолюбливает, и правильно делает. А ещё есть те кто любит составлять шаблоны из шаблонов из шаблонов из шаблонов, но тут нет разницы с макросами-из макросов-из макросов или множественным наследованием. Но это тот инструмент, который, при аккуратном применении, даёт очень много хорошего, и очень мало плохого.
Snusmumriken
И вот у меня тут например дишечка, и шаблончики в дишечке. И без шаблончиков, я оформлял бы по 9 отдельных функций (в сумме 18). Нет, оно на самом деле разворачивается в 9 отдельных функций. Но количество бойлерплейта, мозговой нагрузки и отлаживаемости без шаблончиков возрастает в разы.
Snusmumriken
Ага, и на шаблонах тоже.
Snusmumriken
Ты кстати знаком с стдлибой сишечки?
Snusmumriken
В signal.h лез? Пробовал ей пользоваться? А без IDE и готовых сниппетов, где все указатели на функции принимающие указатели на указатели и возвращающие указатели на функции разрешены?
Snusmumriken
Щя покажу, void (* signal(int __sig, void (* __func)(int))) (int) А теперь попробуй понять что это за покемон, разобрав на отдельные части : )
Snusmumriken
А знаешь что ещё смешнее?
Snusmumriken
С шаблонами это можно было оформить гораздо проще, и пользоваться этим было бы тоже проще.
Всеволод
Где то слышал мнение что в прикладном коде вообще не должно быть стандартных типов. Всё уже внутри классов и структур спрятано должно быть
Snusmumriken
Ага. Когда "прикладной" код это программирование конфигами, так и происходит.
Snusmumriken
У программирования конфигами кстати, есть свой набор проблем.
Snusmumriken
А если это вдруг не про конфиги, то возникают вопросы: у них свои типы для строк? У них свои типы для чисел? Мало сорока тысяч их переизобретений? Нет, понятно что это для "кроссплатформы", чтобы допустим, циферки работали и на 16-битных платформах и на 64-битных, и на arm'е, потому что тот же int может иметь разную размерность. Но стандартные либы УЖЕ переопределяют их на более-менее стандартные штуки.