@ProLua

Страница 209 из 307
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 - фигня, и факт что словами я напишу то же самое в пять раз быстрее - был очевиден даже для меня-непрограммиста.

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
У луа есть еще пара проблем - он осталяет ощущение незаконченности. Как будто студент делал, но некоторые моменты непродумал. Отсутсвие того же switch, к примеру. Или мне к примеру нужно было массово переименовать файлы, я пол дня убил пытаясь заставить встроенными средствами это сделать. В итоге не выдержал - поставил пакет из luarocks и увидел скомпилированную библиотеку для работы с файловой системой. luarocks тоже кстати та еще боль - он ужасно встраивается и временами пакеты им устанавливаемые просто не подхватываются. Приходится проиписывать пути руками, но это не всегда работает, поэтому установленные вещи руками перекидывать в папку с луа
1. Всякие свитч-кейсы, стандартное ООП, стрелочные лямбды и прочая лабуда - ну типа да, типа не хватает. Если хотите умереть от сахарного диабета - вперёд в moonscript. 2. Луарокс заточен изначально под линекс, т.е: > apt-get install luajit > apt-get install luarocks > luarocks install luasocket > luajit http = require'socket.http' print(http.request'http://yandex.ru') HTTP 200 OK ....

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: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
Да.

Страница 209 из 307