
The Dude
02.12.2017
20:51:24

Ostap
02.12.2017
20:52:36

Philipp
02.12.2017
20:52:45

Snusmumriken
02.12.2017
20:53:04
Около восьми.

Google

Влад
02.12.2017
21:02:20
веков


Snusmumriken
02.12.2017
21:10:41
Рейтинг у такого форума взлетать будет быстро.
Есть универсальный ответ на вопрос "как реализовать тот или иной алгоритм на произвольном языке":
http://rosettacode.org/wiki/Rosetta_Code
Для луа нужна не "популярность" через олимпиады школьников, а неофициальные но нормальные и сравнительно популярные либы (или аналог boost, но не такой жирный и связанный), иначе скатится в паскаль, добро пожаловать: https://t.me/joinchat/BdG9wUMuKiF0sugEGC1nNQ.
Мне впадлу отвечать каждый раз на дебильные вопросы, ответ на который находится в первой строке гугла, а такой "форум" будет завален именно таким, омерзительно. Школьники-олимпиадники регулярно не умеют ценить своё время и силы, и уж они совсем не будут ценить время окружающих, будут дёргать по каждой мелкой фиговине и садиться на шею. Их надо учить искать информацию, а не давать ответы. И чем сложнее эту информацию добыть - тем лучше для них: самообучаемость резко вырастет, и мб перестанут дёргать окружающих своими мизерными хотелками.
Плюс луа - сам по себе - нишевой язык, таких пришибленных как я - мало. Его изначальная задача - быть встраиваемыми скриптами.
Популярность луям и так резко повышают гмоды-сталкиры-опенкомпьютерс и тонны игровых движков/фреймворков, тут нам нечего делать, а учить людей надо не конкретным алгоритмам (сам алгоритм произвольной сложности - фигня, перемешивание цифр) а архитектурам, ибо они, в "с-подобной" среде - языконезависимые.


Elias
02.12.2017
21:20:17
Полностью согласен всем вышесказанным согласен
И я думал, что у Lua есть шанс стать таким же популярным, как Питон, но после того, как я понял сколько сил и средств было вложено в инфраструктуру Питона, я понял, что такое второй раз навряд ли пройдёт.
Я считаю, что в идеале Lua надо юзать вместе с другими языками или если хочется использовать какую-нибудь конкретную штуку.
Но один numpy чего стоит. У Lua вроде нет настолько универсальных вещей

Snusmumriken
02.12.2017
21:21:04
http://torch.ch
Не настолько универсально, но похоже.

Elias
02.12.2017
21:22:20
Ага, это наверное ближайшее. И очень меня радует, что эта штука существует.
Вообще хотелось бы лично бороться с монополизмом языков и пиарить Lua, но даже не знаю, как это делать.
Сейчас пишу Lua/C++ туторы, которые по идее должны быть более подробными, чем всё, что я до этого находил
Но фиг знает, какой вклад это внесет.
Мб какой-то перспективный проект помогать писать в свободное время? Даже не знаю.


Snusmumriken
02.12.2017
21:26:42
Но сравнивая луа и питон, ты сравниваешь "сишку" от скриптов и "сиплюсплюс" от скриптов.
Задачи у ЯП немножко разные: питон даёт всё что можно, а луа - всё что необходимо, и это огромная разница.
И становится очевидно, почему "С++ гораздо популярнее С, но на С всё ещё много что пишут", нужны оба ЯП (хотя плюсы бы реворкнуть, ибо монстр несуразный).
Мне очень понравилось то, что в луа можно особо ничего не учить, и сразу приняться за велосипед, или заточить свой скрипт под узкую специализацию, чтобы он делал это предельно хорошо, а потом залить сурц на микроконтроллер, потому что внешних либ почти нет: тут почти всё - твоё.
В целом, язык выбрал случайно, года три-четыре назад, искал движок/фреймворк под "простую 2d-игрулю", когда меня припёрло учить какой-то язык, ибо визуальное программирование в construct2 - фигня, и факт что словами я напишу то же самое в пять раз быстрее - был очевиден даже для меня-непрограммиста.

_AMD_
02.12.2017
21:29:30


Elias
02.12.2017
21:30:17
Ну да, это хорошая аналогия. Только у C чуть больше силы - он может использоваться с C++ и часто делают биндинги больших библиотек, в итоге С навряд ли скоро умрёт, не смотря на все преимущества C++.
У Lua же нет большого брата, что несколько сложнее делает положение.
Язык выбрал я тоже почти случайно. Ну, в геймдеве Lua наверное самый универсальный и адекватный скриптовый язык. Все альтернативы чем то хуже, я считаю.
а где пишешь?
Пока что локально. Думаю сразу запостить сразу несколько статей на свой блог
(eliasdaler.github.io)
Это произойдет где-то в этом месяце, надеюсь :)
Сначала будут базовые статьи, разве что. Про установку, компиляцию, Lua state, работу с переменными, загрузку и выполнение скриптов.
Но я думаю, что я в этих статьях хотя бы часть вещей напишу, которые я нашёл только на третьем году знакомства с Lua, ха-ха. Не сразу понимание приходит.
В конце вообще хотел бы описать всякие хаки и очень практические примеры, например как я реализовывал разные штуки в своей игре. Как разделял движок и скрипты, как делал сами скрипты более читаемыми и гибкими и пр.
Но вообще я думаю, что стоит спросить здесь: если бы вы читали ИДЕАЛЬНЫЙ (11/10) ТУТОР, то что бы вы в нём хотели видеть?
Просто я часто встречаю туторы так себе. Слишком затянутые, либо слишком краткие. Либо с чрезмерным петросянством.
О чём бы стоило написать, что может быть не так очевидно?

Google

Snusmumriken
02.12.2017
21:46:39
Метатаблицы. У кучи начинающих с ними проблемы, притом кратенько расписать пример для каждого метаметода.
Для арифметических - уточнить что аргументы передаются в порядке выражения, и это придётся учитывать:
a = a + 10 --> __add(a, 10)
a = 10 + a --> __add(10, a)

Elias
02.12.2017
22:05:39
Хорошая идея, спасибо
Только вот не знаю, буду ли я углубляться, надо всё же будет частично посылать читать Programming in Lua. Тутор же всё же не а Lua, а о Lua/C++ :D

Andrey
03.12.2017
03:16:39
С++ в последнем стандарте очень сильно причесали - он намного лаконичней и удобней стал
У луа есть еще пара проблем - он осталяет ощущение незаконченности. Как будто студент делал, но некоторые моменты непродумал. Отсутсвие того же switch, к примеру. Или мне к примеру нужно было массово переименовать файлы, я пол дня убил пытаясь заставить встроенными средствами это сделать. В итоге не выдержал - поставил пакет из luarocks и увидел скомпилированную библиотеку для работы с файловой системой. luarocks тоже кстати та еще боль - он ужасно встраивается и временами пакеты им устанавливаемые просто не подхватываются. Приходится проиписывать пути руками, но это не всегда работает, поэтому установленные вещи руками перекидывать в папку с луа

Snusmumriken
03.12.2017
03:34:38


Andrey
03.12.2017
03:34:58
Я это в центосе делал

Snusmumriken
03.12.2017
03:35:13
А я в убунте встроенной в win10, мне норм )))

Andrey
03.12.2017
03:35:56
Синтаксический сахар помогает писать программы. Если он, конечно, не вырождается в джаву ?
И да - в центосе зачастую проще сделать yum install lua-%NAME% чем пытаться сделать это через luarocks


Snusmumriken
03.12.2017
03:41:11
Ненене, синтаксический сахар полезен только если ты в курсе, что действительно происходит, иначе это магия и потенциальная "дырка в абстракции", т.е. дурацкая штука которая вынуждает неучей делать ошибки.
Я люблю сахарок, но тщательно выясняю происходящее, иначе проблемсы.
Прекол луа - в малом объёме слов, и из сахара тут, пожалуй, только двоеточие.
Кстати, свитч-кейсы заменяются табличками с функциями. Например, чот такое:
local rswitch = {}
function rswitch.get(text) ... end
function rswitch.post(text) ... end
local data = socket:receive('*l;')
local command, tail = data:match'(%w+) (.*)'
if rswitch[command] then
socket:send(rswitch[command](tail))
end
Вот тебе наиболее удобный свитч-кейс, в который удобно запихивать произвольное количество команд, хоть делить на модули по две тысячи строк.

Andrey
03.12.2017
03:43:00
Я это сделал на таблице с метатаблицей на отсутствующий элемент в качестве default
Но я для примера приводил

Snusmumriken
03.12.2017
03:43:56
Ну да, можно default в метатаблице, но это уже "извращения", тупой и читаемый вариант - вставить else, если не нашёлся в таблице.

Andrey
03.12.2017
03:44:37
С чего вдруг нечитаемый то?

Snusmumriken
03.12.2017
03:46:03
local function rswitch_default(text) ... end
local rswitch = setmetatable({},
{__index = function() return rswitch_default end}
)
function rswitch.get(text) ... end
function rswitch.post(text) ... end
Ммм. Нечитаемо. Я так только в своих проектах пишу, потому что знаю что я - разберусь.
А если это придётся поддерживать "белому человеку"?

Andrey
03.12.2017
03:47:04
И вы считаете что switch все еще не нужен? ?

Snusmumriken
03.12.2017
03:47:23
Не а ))
Слишком редко нужен.
Читаемый вариант для тупых:
local rswitch = {}
function rswitch.get(text) ... end
function rswitch.post(text) ... end
local data = socket:receive('*l;')
local command, tail = data:match'(%w+) (.*)'
if rswitch[command] then
socket:send(rswitch[command](tail))
else
socket:send('Hai!')
end

Andrey
03.12.2017
03:49:11
Вы сейчас как типовой адепт Го - те точно также любят говорить что язык идеален. А как только чтото добавляется, делают вид что так и задумано было)

Snusmumriken
03.12.2017
03:49:21
Я в курсе, спасибо : )
Конечно язык идеален, да и я тоже ничего!

Google

Andrey
03.12.2017
03:49:50
??

Snusmumriken
03.12.2017
03:51:18

Andrey
03.12.2017
03:52:08
В моем случае все несколько хуже - многоэтажные конструкции if - else чаще встречаются

Snusmumriken
03.12.2017
03:52:33
Конкретно тут - ООП без метатаблиц на синглтонах, но если всё таки нужно много типизированных объектов - цепляется одна маленькая метатабличка.
Минимум непонятных действий.
Я про избыточность цепляния default к метатаблице таблицы для свитч-кейса.

Andrey
03.12.2017
03:54:08
Ну и помимо switch я бы не отказался от аналога #include - который просто вставляет содержимое одно файла в это место в другом. Да я знаю про require, dofile и тд, но это же логичный и минималистичный способ попилить одни большой скрипт на несколько мельче

Snusmumriken
03.12.2017
03:54:21
dofile чем плох?

Andrey
03.12.2017
03:54:49
Насколько помню он выполняет его как скрипт а не добавляет

Snusmumriken
03.12.2017
03:55:34
Require - технически выполняет скрипт как функцию и возвращает результат.
Эта "функция" может работать с глобальными переменными и всем таким. Но это путь ереси, если что.

Andrey
03.12.2017
03:57:01
Я просто для астериска диалплан на луа делаю. Проблема в видимости - если я чтото выношу во внешний файл, астерисковые вещи недоступны изза порядка инициализации. А без выноса во внешние файлы extensions.lua как то сильно раздувается


Snusmumriken
03.12.2017
03:57:22
На самом деле, "вставка содержимого одного файла в другой" - это кошмар и ужас, потому что приходится искать хвосты: где что объявилось, где что изменилось.
Дай дураку стеклянный член - он и член разобъёт, и сам порежется.
Ты кури нормальные структуры приложений:
1. Ни один модуль не объявляет, не изменяет и не удаляет ничего глобального. Никогда.
2. Если в нескольких модулях нужен один общий - реквайрить его в каждом. Это позволяет хоть как-то сводить концы с концами.
3. Модули не должны держать никаких внутренних состояний, только возвращать класс/объект. Если нужен, например, пополняемый словарь для LZW в модуле - объявляем там локально.
4. Вся реальная движуха и единственное место для глобалов - только в одном файле, который ты запускаешь.
Правила нехитрые, минимизируют 99% ошибок.

Andrey
03.12.2017
04:01:02
Я выше озвучил почему мне нужна проста вставка)

Snusmumriken
03.12.2017
04:01:29
А ООП для кого придумывали? : )

Andrey
03.12.2017
04:04:43
Так, поясню получше:
Как вызвать из внешнего модуля функции, которые появятся в глобалке после вызова этого файла? Потому как без них в этом модуле смысла нет

Snusmumriken
03.12.2017
04:06:26
Хм.
*module.lua*
[[
local M = {}
function M.foo(...) ... end
function M.bar(...) ... end
return M
]]
*a.lua*
[[
local module = require'module'
print(module.foo(...))
]]
*b.lua*
[[
local mod = require'module'
print(mod.bar(...))
]]
Вызывать require несколько раз - можно, хоть каждый раз при вызове (чуть медленнее чем обычный вызов, результат кешируется).
Карочи, переделай файл который объявляет глобалки на возвращаемую табличку с функциями.
Это можно частично сделать автозаменой, если что.
Но хвосты будут находиться в десять раз проще, а область видимости - в пять раз нагляднее.
Первое правило: ничего глобального в модулях, кроме использования стандартной библиотеки луа.
Ферштейн?

Andrey
03.12.2017
04:13:01
Я ищу исходники модуля чтобы пояснить)

Google

Andrey
03.12.2017
04:13:37
https://github.com/asterisk/asterisk/blob/master/pbx/pbx_lua.c
Раз

Snusmumriken
03.12.2017
04:13:47
Дай угадаю, он держит кучу своих состояний и объявляет глобальные define-переменные типа MAX_INCOMING_CALL_COUNT, и вообще написаны бывшими сишниками?

Andrey
03.12.2017
04:14:30
И вся логика превращается вот в такое - https://gist.github.com/igmar/4066527
О, только заметил - это неофициальный реп астериска - там комментарии к коду появились?
В оригинальном файле все несколько печальней

Snusmumriken
03.12.2017
04:19:13

Andrey
03.12.2017
04:20:22
Поэтому я думаю его переписать. Но на язык белок ?
На самом деле этот модуль давно в астериске появился, и я не заметил чтобы он хоть как то менялся


Snusmumriken
03.12.2017
04:26:15
А теперь, примерно так делают нормальные люди, когда встречаются с чем-то похожим:
*module.lua*
-- на случай если кто-то занял переменную, в противном случае - nil
local sqlite_old = sqlite3
-- эта хрень переписывает глобал, как мудень
require'sqlite3'
-- делаем локальной
local sql = sqlite3
-- чистим хвосты, чтобы наш модуль не потревожил глобал вот вообще никак
sqlite3 = sqlite_old
-- всякие модули которые цепляем, и мб сразу создаём новые объекты
local channel = require'channel':new()
local app = require'app'
local OLE = "Phone/phone0"
local APIKEY = "oursecretapikey"
...
local db = {}
function db:init()
self.sql = sql.open('/etc/asterisk/users.sqlite')
return self
end
function db:_hotdesk_logout(context, extension)
name = channel:CALLERID("name"):get()
peername = channel:CHANNEL("peername"):get()
...
app.Answer()
end
return db -- db:init() -- типа сразу инициализируем, или нет
Я к тому что глобалы - зло, и всегда были им.
Нет ни одного случая (кроме бешеной оптимизации памяти), когда модули работающие с глобалами были лучше чем тех кто не работает.


Andrey
03.12.2017
04:29:31
Глобалы помоему везде зло

Snusmumriken
03.12.2017
04:32:58
А вот уметь работать с глобалами - стоит. Никогда не знаешь с чем столкнёшься. Просто сам не используй.
Ну, это как будто половина людей в мире - геи, а тебе вдруг геи не нравятся, но твой начальник и коллега - тоже геи. Приходится уметь работать с ними, особенно если совокупляться не вынуждают ))

Group Butler [beta]
03.12.2017
04:36:08
Добро пожаловать в чат pro.lua, purplebl00d! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Andrey
03.12.2017
04:36:32
Да не - я и goto иногда пользуюсь. Но все же лучше делать ветвления - лучше логика выглядит. Сейчас на новом месте как раз разгребаю логику сделанную людьми, которые зачастую впервые в жизни камаилио видели. МНогоэтажные if-else, перескакивания туда сюда по логике и тд

Snusmumriken
03.12.2017
04:38:14
Когда-то использовал goto как замену continue.
Ну там:
for i, v in ipairs(t) do
if not v.key then goto continue end
bla-bla
::continue::
end
Сейчас - таблицы свитч-кейсов для таких случаев.

Andrey
03.12.2017
04:39:19
В камаилио есть switch-case конструкция, просто ктото не читал документацию. А еще там есть параметр который ограничивает этажность if-else ?
К одному if, в который порядка 50 ИЛИ засунули попался комментарий - сюда больше не добавлять условий

Snusmumriken
03.12.2017
04:41:03
Этажность if-else в продолжительной обработке правится негативизацией:
function foo(data)
local key, value = data:match(...)
if not key then return end
local id = key..value
if #id < 10 then return end
...
return ...
end

Andrey
03.12.2017
04:41:24
Не - в камаилио логика на С подобном синтаксисе

Google

Andrey
03.12.2017
04:41:56
http://docs.carbonsoft.ru/pages/viewpage.action?pageId=63799321
Вот к примеру

Snusmumriken
03.12.2017
04:42:42
Хорошо люди живут, много свободного времени, наверное : )

Andrey
03.12.2017
04:43:24
Ну а мне разгребать приходится ?

Snusmumriken
03.12.2017
04:45:12
Попробуй применять насильственные методы.
С сишниками проблема в том, что они мало переучиваются на другие стилистики, и продолжают писать на "С-луа" или "С с классами", или "С-питоне" там, где это не нужно и даже вредно.
Особенно обидно когда это крутые крупные библиотеки.

Andrey
03.12.2017
04:48:20
Зачем? Я просто в камаиливской логике наведу порядок, а дальше все равно кроме меня этим заниматься не будет. Как я понял сейчас с телефонией ситуация такова - что нужно разгрести все, что предыдущие телефонисты наделали

Snusmumriken
03.12.2017
04:48:57
Ну тады развлекайтесь, я потопал утренними делами заниматься : )

Andrey
03.12.2017
04:49:16
Да у меня выходной - завтра продолжу ?
Удачи)

Evgeniy
03.12.2017
18:28:25
Ну типа в реальной жизни - ноль раз, Фил прав, абсолютного наложения не будет никогда из-за нематематичности макро-мира.
В "виртуальной" - два раза, в полночь и полдень. Дальше будут расхождения хоть на пол градуса.
Остальные случаи, типа "ну может быть, если часы чуть спешат или ещё что-то такое, то они могут накладываться чуть чаще/чуть реже, бла-бла" - меня не интересует, ибо вводятся дополнительные условия.
Нет, я не смышлённый, я в opengl рисовал аналоговые часы и хотел сделать "максимально ровно", и это не получилось ))
так я ноль раз уже написал


TriΔng3l
03.12.2017
18:29:53
Ну типа в реальной жизни - ноль раз, Фил прав, абсолютного наложения не будет никогда из-за нематематичности макро-мира.
В "виртуальной" - два раза, в полночь и полдень. Дальше будут расхождения хоть на пол градуса.
Остальные случаи, типа "ну может быть, если часы чуть спешат или ещё что-то такое, то они могут накладываться чуть чаще/чуть реже, бла-бла" - меня не интересует, ибо вводятся дополнительные условия.
Нет, я не смышлённый, я в opengl рисовал аналоговые часы и хотел сделать "максимально ровно", и это не получилось ))
Я ничего не понял. Это про точность флоата?

Evgeniy
03.12.2017
18:30:46

Vadim
03.12.2017
19:16:37
http://bash.im/quote/408012

Group Butler [beta]
04.12.2017
12:40:24
Добро пожаловать в чат pro.lua, Ilya! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Philipp
04.12.2017
18:41:04
io.write по дефолту пишет в stdout?
@Snusmumriken @tverd Чай

Чай
04.12.2017
18:41:52
Да.