
Антон
06.04.2017
09:47:00
как указать что он реализует интерфейс EventListener?

Tverd
06.04.2017
09:47:33
MyChild = Class(MyObject, EventListener, Mutota, Fignya)
но это придется скорее всего писать самому класс

Антон
06.04.2017
09:47:49
у Class всего 2 параметра

Google

Антон
06.04.2017
09:47:51
я так понял что я прсото могу написать MyObject:OnEvent безо всяких формальных указаний и это будет рабатть, но как такой код читать то?

Tverd
06.04.2017
09:47:58
это у твоего )

Snusmumriken
06.04.2017
09:48:16
Хех, товарищи, вы переусложняете.

Антон
06.04.2017
09:48:37
ну упрости

Snusmumriken
06.04.2017
09:58:13
Примерно такие миксины. Только миксины должны быть максимально простыми.
Не требующими инициализации и цепляющимися за минимум параметров объекта, чтобы было легко проверять.
И не трогающими любые другие методы объекта, кроме своих.
В идеале - при инициализации объекта, миксин должен проверять наличие всех своих переменных.
И тем не менее, это рак убивающий, требующий минимума использования :3
Ибо код с одной стороны гораздо легче превращается в кашу, а с другой - если одни миксины используют те же имена методов что и другие - приходится десять раз проверять приоритеты. Или именовать методы миксинов, включая имя миксина, вроде: obj:posGetPosition и obj:sizeGetSize(), где первый "префикс" - по имени миксина.
И нужен прямой доступ к миксинам типа: self.Super[mixinname].method(self, ...), то есть, миксины ещё стоит именовать.


Oleg
06.04.2017
18:50:41
Ребята, посоветуйте решение.
Есть файл, содержащий комбинации клавиш, описание и действие, типа:
a a a
this is aaa
say "aaa"
a b c
this is abc
say "abc"
Нужен код, который перегонит это в массив, типа:
keys[a][a][a][description] = "this is aaa"
keys[a][a][a][action] = 'say "aaa"'
keys[a][b][c][description] = "this is abc"
keys[a][b][c][action] = 'say "abc"'
Через load()() делать?


Snusmumriken
06.04.2017
19:28:59
1. Если у тебя есть выбор в чём хранить - используй json. Он крайне универсален и избавляет от моря проблем.
2. Если нет выбора - пишешь парсер типа такого:
function load(path)
local file = io.open(path)
loca raw_data = file:read('*all'); file:close()
local raw_blocks = {}
for line in (raw_data..'\n\n'):gmatch('(.-)\n\n') do
table.insert(raw_blocks. line)
end
local keys = {}
for i, v in ipairs(raw_blocks) do
local a, b, c = v:match('(%w) (%w) (%w)')
keys[a] = keys[a] or {}
keys[a][b] = keys[a][b] or {}
keys[a][b][c] = keys[a][b][c] or {}
local desc, act = v:match('\n(.-)\n(.*)')
keys[a][b][c].description = desc
keys[a][b][c].action = act
end
return keys
end
Я не проверял, тут могут быть мелкие баги, но суть думаю ясна. Ещё стоит вычистить лишние пробелы, если в изначальном файле перед фразой есть лишние пробелы.
Распустил на много строк чтобы читать было удобнее.

Tverd
06.04.2017
19:34:49
я храню в луа скриптах, если менять не надо ничего\

Google

Tverd
06.04.2017
19:34:55
это намного проще )

Snusmumriken
06.04.2017
19:36:01
Ну как тебе сказать. Есть очень много очень классных сериализаторов.
Например, serpent. Он корректно сериализует в lua-табличку в том числе функции, например.
Им можно полноценно сериализовать объекты.
Но конфигурационные файлы всё же стоит хранить в json.
Так же как пересылаемые сообщения - тоже он же.
Количество ёбли уменьшается во много раз, даже по сравнению с XML.
Меня сильно удивляет то, что всякие html до сих пор не перевели на что-то json-подобное, потому что читаемость может вырасти на порядок.
Хоть и за DOM-структурой придётся следить строже.

Oleg
06.04.2017
19:40:16
А если комбинация ключей в строке произвольной длины и заранее неизвестна?
то есть может быть
a a a
а может
a a b d a q

Snusmumriken
06.04.2017
19:40:59
Тогда пиши усложнённый парсер, который сплитит первую строку полностью :3

Oleg
06.04.2017
19:41:38
Это как?
Мне на ум пришло только раскукожить строчку и пихнуть в load.
Понимаю что в джейсоне оно правильней, но не хочу. Там нужно следить за скобками и прочей хренью. А тут у меня такая топорная, но простая и понятная форма.
То есть мне надо этот конфиг будет часто руками править и в поле action там будет луа-код для исполнения. Если в джейсоне, его же надо будет экранировать?

Snusmumriken
06.04.2017
19:44:47
Так же как делим на блоки.
v = raw_block[i]
local letters = {}
for letter in ((v:match('(.-)\n')):gsub(' ', ''):gmatch('%w') do
table.insert(letters, letter)
end
Ну, match - выделяет первую строку,
gsub - заменяет пробелы на пустоты,
gmatch - проходит по каждой букве.
Прежде чем писать что-то своё, тебе придётся учить регулярки.
Потом - пробиваем путь в табличке по буквам циклом.
local t = keys[i] or {}
for i, v in ipairs(letters) do
t[v] = t[v] or {}
t = t[v]
end
t.description, t.action = ....

Tverd
06.04.2017
19:46:33
проще тогда DSL шлепнуть
хотя не, не сильно проще, но полезнее )

Oleg
06.04.2017
19:47:21
Что значит dsl шлёпнуть? Если что, я чайник =)

Tverd
06.04.2017
19:47:42
написать в смысле )

Snusmumriken
06.04.2017
19:48:15
Карочи, товарищ, давай по человечески, а json ты можешь и автоматически сгенерировать : 3

Tverd
06.04.2017
19:48:47
ну да, согласен, на данный момент лучше всего json завести

Oleg
06.04.2017
19:55:43
А что в итоге получается в t?

Google

Oleg
06.04.2017
19:55:46
Не догоняю.

Snusmumriken
06.04.2017
19:56:07
Пробиваем ключ. А под конец, в t вгоняем description и action

Oleg
06.04.2017
20:17:42
Мой конфиг больше похож на yaml, чем json. Только нужное, без лишней херни.
Тем более достаточно прост. Вот отсюда и такая задача.

Snusmumriken
06.04.2017
20:22:05
Вот и используй yaml.
https://github.com/gvvaughan/lyaml
Кстати, многомерный массив тебе не нужен.
Достаточно key-value:
abcd
desc = ...
act = ...
Который превращается в табличку:
{
abcd = {desc = ..., act = ...}
}

Alexander
06.04.2017
20:27:49
а если всякие там ctrl и другие названия клавиш не в один символ, то так и храним с пробелами
"a b ctrl d"

Snusmumriken
06.04.2017
20:28:49
Есть такое искусство - искусство упрощать.
Причём не только формат передачи, но и свою работу.
Ты, вон, можешь сделать ещё проще, и сделать свой язык программирования, который воспринимает естественный текст:
"Сделай мне массив А из двадцати значений, заполненный нулями, но чтобы каждое пятое значение было единицей, а шестое - двойкой"
и "Разверни, пожалуйста, только что созданный сервер на восьмидесятом порте".
Но ты представляешь, с какими трудностями ты столкнёшься, ваяя интерпретатор?
Прежде чем изобретать велосипед - пользуйся тем что люди уже сделали. И велосипедь только в крайнем случае, когда что-то тебе ну совсем уж не подходит.

Alexander
06.04.2017
20:30:00
*me мерзко хихикает, вспомнив байку про робота, которому дали задание выбросить глобусы

Snusmumriken
06.04.2017
20:30:49
Хех, естественные языки ещё и двусмысленны :3
Придётся учитывать и это тоже.

Alexander
06.04.2017
20:31:09
байку знаешь? :)

Snusmumriken
06.04.2017
20:31:16
Не а, давай, рассказывай.

Alexander
06.04.2017
20:31:52
Джон купил домашнего робота. Первым заданием для него было - почистить кремом ботинки.
На вопрос робота, что такое крем, человек ответил "густая однородная масса светло-коричневого цвета".
Когда Джон вернулся, оказалось что робот намазал на ботинки яблочный джем.
Джон рассердился, но робот резонно заметил, что джем полностью подходит под описание.
Вторым заданием для робота было выбросить из комнаты старые глобусы.
Глобус Джон описал как "шарообразный предмет на тонкой ножке".
Тогда робот схватил Джона за голову и выбросил его из комнаты, сломав при этом шею.

Snusmumriken
06.04.2017
20:32:12
Оу е!
Не, на естественном языке вполне можно писать программы: вон, люди же как-то общаются друг между другом, и ничего. Инструктировать друг друга могут.
Просто нужно будет запихнуть весь человеческий языковой опыт в формальный, машиночитаемый вид :3

Alexander
06.04.2017
20:34:15
зато сколько недоразумений бывает :)

Snusmumriken
06.04.2017
20:34:46
Ну, значит что-то надо описать подробнее, и качество программиста будет измеряться в способности чётко излагать свои мысли.
Обычно, кстати, у программистов с этим проблемы :3

Vlad
06.04.2017
20:47:06
я видимо сильно устал но как получить остатком от деления числа само число?

Alexander
06.04.2017
20:55:01
Не всегда то что написано - то что написано, но то что написано может быть тем, что написано

Google

Snusmumriken
06.04.2017
20:58:02
А если у тебя есть только остаток от деления и делитель - делимое не получишь.

Vlad
06.04.2017
20:59:36
там типа что то
num % magic = num

Snusmumriken
06.04.2017
20:59:56
Хм.
num % 1 = num.

Vlad
06.04.2017
21:00:02
0

Snusmumriken
06.04.2017
21:00:52
А, не. Будет ноль. Хм.

Admin
ERROR: S client not available

Alexander
06.04.2017
21:01:29
ноль на массу

Snusmumriken
06.04.2017
21:01:49
num % (num + N > 0) = num, во.
Ну, тебе достаточно:
num % math.huge = num.

Alexander
06.04.2017
21:01:54
по определению остатка - остаток не может быть равен делителю

Snusmumriken
06.04.2017
21:03:35
А делимому - может ))
Если делитель больше делимого.

Vlad
06.04.2017
21:03:40
а почему конструкция max - (max - num) выдает 0?
если num изначально целое то все нормально
но если num будет с ,0 тогда 0

Snusmumriken
06.04.2017
21:25:37
Если num - ноль - выдаст ноль.

Vlad
06.04.2017
21:28:05
local num1 = 150.0
local num2 = 150
num1 = max - (max - num1)
num2 = max - (max - num2)
print(num1) — 0
print(num2) — 150

Snusmumriken
06.04.2017
21:29:20
Max - это что?
Math.huge?

Vlad
06.04.2017
21:29:33
максимальный инт

Snusmumriken
06.04.2017
21:29:57
Ну что ты, это же не число, не пытайся работать с ним как-то кроме сравнения :3

Alexander
06.04.2017
21:31:02
lua: test.lua:7: attempt to perform arithmetic on global 'max' (a nil value)
stack traceback:
test.lua:7: in main chunk
[C]: ?

Vlad
06.04.2017
21:31:34
там у меня все просто как в бронепоезде
посмотрел значение maxinteger
записал его отдельно в переменную max
и потом с ним так баловался невесь пойми зачем
max = 9223372036854775807

Google

Alexander
06.04.2017
21:39:20
local maxint = math.huge
local num1 = 150.0
local num2 = 150
print(maxint)
num1 = maxint - (maxint - num1)
num2 = maxint - (maxint - num2)
print(num1)
print(num2)
===$ lua test.lua
inf
-nan
-nan
если вместо math.huge написать 9223372036854775807
получаю
9.2233720368548e+18
0
0
ну я не понимаю, к чему все эти извраты

Vlad
06.04.2017
21:45:28
не знаю мнепочему то сложно заставить себя идти до конца и изучать нормальные вещи что б нормально работать, я вот даже толком с таблицами нормально работать не умею, но мне интересено заниматься всякой такой идеотией типа той что я изложил выше

Snusmumriken
06.04.2017
21:53:23
Ну, подобные эксперименты - это нормально, я тоже много таким баловался. Просто я это не выкладывал :3
Кстати, размерность чисел в lua - 2^52, вне зависимости от битности. Компромисс, блин, между 32/64.

Vlad
06.04.2017
21:55:34
это к примеру почему ругается? :
function con.magic( number ) — норма
local function con.magic( number ) — ругань

Alexander
06.04.2017
21:56:12
это попытка вызова функции? тогда логично

Vlad
06.04.2017
21:56:41
не вызова а создания

Snusmumriken
06.04.2017
21:58:11
Рекурсивные функции не могут объявляться локально, кстати.
local function foo() return foo() end — ругань
function foo() return foo() end — ок
local foo
foo = function() foo() end - норм

Vlad
06.04.2017
22:01:27
эт хорошо, возьму на заметку
но у меня без рекурсии
function con.magic( number ) — хорошо
— some magic
end
local function con.magic( number ) — бубубу
— some magic
end
это к слову как и работа с ними, типа локальные функции нельзя использовать без ругани в глобальных, если последние обьявлены раньше
как тут все к слову выкладывают не текст а красивенькие код?

Snusmumriken
06.04.2017
22:05:09
А, правильная ругань.
local function con.magic( number ) — бубубу
— some magic
end
Оно уже находится в таблице con. Как ты предлагаешь делать локальные функциии относительно таблицы?
Тогда уж сразу саму таблицу делай локальной.

Vlad
06.04.2017
22:07:23
а, понял,
таблица к слову уже локальная,
прям локальность в квадрате

Snusmumriken
06.04.2017
22:07:55
Красивенький код - заключить блок кода между апострофами "`", которые там где тильда.
'''
[код]
'''
Только вместо одинарных кавычек - апострофы.
Между одинарными апострофами - инлайн-вставка.

Alexander
06.04.2017
22:08:20
`
вот этот символ

Vlad
06.04.2017
22:55:04