Anonymous
Ой написал :)
B
Как не спать и высыпаться?
Anonymous
эх, мечты, мечты)
B
Меня если сильно прихватывает сплю по по дня а чувство будто в шахте неделю провел, а спишь по 6-8 часов вроде нормально но ближе к вечеру рубит сильно
Anonymous
благо завтра суббота - можно и порубиться немного))... часиков до 13-14)
Anonymous
точнее уже сегодня)
Temirgali
Temirgali
😄
Temirgali
А заболеваний никаких нет?
Мерль
[last news]
Urn: A Lisp implementation for Lua
ㅤ
Кто-то использовал библиотеку Sol2 для привязки к C++?
Snusmumriken
Хех, достаточно буфера нажатых кнопок в виде строки.
Oleg
Не достаточно.
Snusmumriken
В общем, если тебе так уж необходим краткий формат - используй существующие. Они есть.
Oleg
Там посреди хотки юзер может задуматься на нажатой кнопке, тогда прога должна ему нарисовать читшыт по текущей позиции и глубже.
Snusmumriken
Ну и? Это не сложно, когда у тебя есть список нажатий. Ты там файтер с комбами делаешь что ли? :3
Oleg
Типа того =)
Oleg
Ну вот смотри, есть разные комбы с разными функциями: «a», «a a», «a z», «a a b».
Oleg
Юзер нажимает «a» и держит её. Вываливается хинт со всеми описаниями хоток: a, a a, a z, a a b.
Oleg
он может отжать, тогда выполнится a. если отожмёт и сразу нажмёт z, выполнится соответственно a z.
Oleg
И т.п.
Oleg
Если нажмёт a q, то нихера не выполнится =) Типа такой комбы нету.
Oleg
Как это сделать удобней, кроме многомерного массива из гирлянды клавиш?
Oleg
Получается что-то типа мортал-комбата, только в AI. Иллюстралити =D
Oleg
У меня сейчас >300 хоток только в иллюстраторе и я их устал помнить.
Snusmumriken
Ну, тогда действительно похоже на многомерные массивы.
Образец кусочков парсера я тебе дал :)
Oleg
Да, я вкурил твою магию =D
Oleg
Завтра наколбашу новый модуль.
Snusmumriken
Ну, это же просто регулярки. Они довольно магичны, конечно, но их незнание очень сильно мешает работе с текстом.
Snusmumriken
Например тут. И экспериментировать.
http://lua-users.org/wiki/StringRecipes
Сам очень долго в них вкуривал, а когда вкурил - как заорал
fgntfg
Регэкспы это главный инструмент в работе с текстом.
fgntfg
И они есть почти в каждом языке
B
почему при рекваире самого себя происходит бесконечный вызов?
почему при выводе значений через pairs оно выводит не в порядке живой очереди а сортирует ключи каким то неведомым образом перед выводом?
B
типа key1, key2, key3
вывод key1, key3, key2
Anonymous
вызови функцию этой же функцией и посмотри что будет. точно не конечный автомат.
вместо pairs есть более-менее сортированный ipairs. В остальных случаях надо создавать список и делать table.sort(...)
B
значит нужно почитать про рекваир
а то я думал так мол просим и при этом записываем в переменную, и пока ее не пользуем то ничего не происходит
B
local bla = require 'self' -- пока bla не активна то ничего страшного
B
а про таблицы просто интересно
пример сбрасывать не буду, там все страшно, но интересно почему оно ведет себя именно так
Snusmumriken
B
получается что
require
сразу в исполнение
ну тогда где то видел что то наподобии
loadfile
или что то в этом роде
Snusmumriken
require - грузит файлы и динамические библиотеки, и кеширует их.
dofile - безусловно выполняет файл
loadstring - преобразует строку в функцию, которую потом можно вызвать
Snusmumriken
>почему при выводе значений через pairs оно выводит не в порядке живой очереди а сортирует ключи каким то неведомым образом перед выводом?
Потому что ты знаешь как работают хеш-таблицы? И почему они называются именно "хеш"?
P.S. Оно "сортирует неведомым образом" ещё при добавлении, а не перед выводом.
B
Snusmumriken
Да, ещё вопрос. Как хеш-таблицы обеспечивают такой быстрый доступ к полям?
Ну, допустим у тебя миллиарды ключей в табличке, а доступ к ним - всё равно очень быстрый, а ведь ключи - строковые. Не проходить же нам по всей структуре, сравнивая текущий ключ с требуемым.
Я бы просто загуглил разные структуры данных и общий принцип их работы.
B
don't have any ideas need to go smoke some manuals
Snusmumriken
Держи.
https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE-%D1%87%D1%91%D1%80%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
B
познавательно, но стоит изучить мне пожалуй для начала матчасть
B
начну с
https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Snusmumriken
На самом деле, есть различные способы организации порядка в таких структурах.
Например:
function ohash()
local hash = {}
local order = {}
local mt = {}
function mt:__newindex(key, value)
rawset(self, key, value)
order[#order] = key
end
function iter()
local i, shift = 0, 0
return function()
i = i + 1
if i < #hash then
while not hash[order[i+shift]] do shift = shift + 1 end
return i, order[i+shift], hash[order[i+shift]]
end
end
end
return = setmetatable(hash, mt), iter
end
Ну, это одно из нетривиальных решений.
Не тестил, но должно работать примерно так:
h, h_iter = ohash()
h.data = 'value'
h.key = 'some_data'
for i, key, value in h_iter() do print(i, key, value) end
B
вообще много чему стоит поучиться в целом
это я говорю о самых основах основ не идя еще в дебри
Snusmumriken
Это более чем нормально.
Есть замечательная книжка Вирта - "Алгоритмы и структуры данных". С 89 года мало что поменялось :3
Прошу прощения за такой линк, просто кому-то удобнее читать в сети.
http://tka4.org/materials/lib/Articles-Books/Numerical%20Algorithms/%D0%92%D0%B8%D1%80%D1%82%20%D0%9D.%20%D0%90%D0%9B%D0%93%D0%9E%D0%A0%D0%98%D0%A2%D0%9C%D0%AB%20%D0%98%20%D0%A1%D0%A2%D0%A0%D0%A3%D0%9A%D0%A2%D0%A3%D0%A0%D0%AB%20%D0%94%D0%90%D0%9D%D0%9D%D0%AB%D0%A5.%20%D0%9C.%D0%9C%D0%B8%D1%80%201989.pdf
B
спасибо, скачал
Snusmumriken
На самом деле, есть несколько книжек, которые стоит прочитать даже будь ты пхп/делфи-кодером, который раз в месяц пишет маленькую программку/кусочек сайта.
Хотя бы для того чтобы корректно понимать учебные материалы от "нормальных программистов", которые эту литературу читали. Книги выполняют куда большую роль чем образовательную, ибо задают стандарт мышления. Когда мышление людей относительно стандартизировано, коммуникация между ними значительно быстрее и точнее. Ну, и тупо понимаешь, почему этот человек написал код в примере именно так а не иначе.
Сюда входит Совершенный Код Макконнелла, кучка книг Вирта, и, в идеале - Кернигана и Риччи (сишка), чтобы примерно представлять, что происходит на "низком уровне".
B
вообще спасибо за информацию,
надеюсь хоть малую часть буду в состоянии понять во время изучения,
а пока уже пора спать идти, удачи
Snusmumriken
Йоу, давай удачки.
Напоследок, держи восхитительную штуку от Джоеля Спольски (сейчас - глава компании разработки трелло и стаковерфлоу). Он в забавной форме жалуется на то, что нельзя абстрагироваться от всего на свете :3
http://russian.joelonsoftware.com/Articles/LeakyAbstractions.html
Как раз ты столкнулся с дырявой абстракцией хеш-таблиц. Это оно самое.
Alexander
чего?
разговариваем, когда есть о чем осмысленно говорить. а для разговора ради флуда и счетчика сообщений есть другие места
B
Кстати пока временами страдаю думаю мож написать каких то мелких штук каких нет в луне, нпр щас думаю как бы реализовать свич =)
Snusmumriken
Свитч чего?
Типа, ретранслятор сообщений?
Или свитч-кейс?
B
switch-case
Snusmumriken
Во.
Snusmumriken
Кстати, у меня есть забавная реализация луа-массивов. Там есть типа стрелочные функции.
А свитч-кейс - это довольно просто. Функция, которой передаём табличку:
a = case{
a > 0, 10,
b > 0, b,
c > 0, c
}
Функция проверяет каждый нечётный элемент, до тех пор пока он не окажется истинным, и возвращает следующий чётный.
Правда, как ты понимаешь, это не очень быстро.
B
я тугенький
как оно работает?
a = case{
a > 0, 10,
b > 0, b,
c > 0, c
}
B
ааа
B
я просто люблю писать максимально понятно и разжевано, буквально что б по названиям переменных было понятно работу целой программы, не говоря о функциях и тд, что б было максимально понятно для таких вроде меня
Snusmumriken
function case(t)
if #t%2 ~= 0 then error('Case got '..#t..' args') end
for i = 1, #t, 2 do
if t[i] then return t[i+1] end
end
end
Применение как раз:
a = case{
a > 0, 10,
b > 0, b,
c > 0, c
}
B
а вроде понял
тут идет типа case-do
элементы таблицы идут и как условие и как ответ
я просто хотел разделять по максимуму
Snusmumriken
Да, только что созданные таблицы и строки можно передавать в функции без скобок:
print'Wowow' = print('Wowow')
table.concat{a, b, c, d} = table.concat({a, b, c, d})
Этот вариант прост и наиболее быстр. Если ты будешь делать что-то вроде:
case{
{sw = a > b, state = b},
{sw = a < b, state = a},
}
То будет плодиться охрененно много таблиц. Слишком много лишних действий. Мой вариант, конечно, требует соответствующего форматирования, но во-первых, это форматирование оправдано в любом случае, а во-вторых - работает быстрее всего остального. Кроме кучи if-else.
Да, если что, в lua есть тернарники. То же самое можно написать:
a = a > 0 and 10
or b > 0 and b
or c > 0 and c
or 10
И я регулярно их использую. Функционал тот же что у свитч-кейсов. Любой другой самописный свитчкейс будет медленнее, хотя бы по причине ленивости этих тернарников, которые выполняют условие только если оно нужно.
Например:
state = case{
Fast_Function(), 'yo',
Slow_Function(), 'yoyo',
WerySlowFunction(). 'yoyoyo'
}
перед выполнением выполнит все три функции, (которые очевидно возвращают true/false или какое-то значение и nil).
А эта штука:
state = Fast_Function() and 'yo'
or Slow_Function() and 'yoyo'
or WerySlowFunction() and 'yoyoyo'
Будет выполнять, например, Slow_Function только если Fast_Function не выполнилась.
Догадываешься о последствиях?
Snusmumriken
Смари:
a = a and b —> если a == true то b, в противном случае - nil
a = a or b —> если a == true то a, в противном случае - b
Комбинируем:
a = a and b or c —> если a == true то b, в противном случае - c.
a = a and b or c and d —> если a == true то b, в противном случае - если c == true то d, а в случае если не a и не c - nil.
Карочи, условие-следствие между and, альтернативные варианты - между or.
Прочитай примеры которые я давал как свитч-кейс.
Snusmumriken
О, вот тебе задачка.
Чему будет равна a?
a = true, b = 'yo', c = nil
a = b and c and 10 or 20
B
nil?
Snusmumriken
Не а, 20.
Первое условие b and c and 10 не выполняется, ибо c - nil (false). Так что 20.
Если бы c выдавало true и выполнилось - было бы 10.
Alexander
я тоже так решил что 20
B
думал как то так
( (b and c) and 10 ) or 20
Snusmumriken
На самом деле, это обычная матлогика которую проходят на первом курсе, с коньюнкцией-дизьюнкцией.
Snusmumriken
Ща покажу.
a = (b and c and 10) or (20)
В первом блоке - если все варианты до последнего - true - то вытаскивается последний.
Если цепочка прерывается - через or переходим к следующей цепочке.
a = 10 and 20 and 30 and 40
print(a) --> 40
a = 10 and 20 and false and 40
print(a) --> nil, ибо блок 'or' с альтернативами отсутствует
Snusmumriken
Советую побаловаться, в общем, и примерно понять как работает.
А тернарники, которые я выдал, типа этих:
a = a > 0 and 10
or b > 0 and b
or c > 0 and c
or 10
Можно использовать и без дословного понимания как они работают. Главное чтобы было понятно что куда пихать, и соблюдение форматирования.
Snusmumriken
Можно и вообще без них, но это чудовищно муторно:
local a = n
if a > 0 then
a = 10
elseif b > 0 then
a = b
elseif c > 0 then
a = c
else
a = 10
end
Меня как раз жавы/шарпы жутко раздражают многословностью, а тут получается апогей бессмысленного многословия.
B
чета сложна
B
вродь всегда думал что nil, false == false
и на and'e должен либо идти первый false либо дальше