Anonymous
что Snusmumriken
FailsBot
∧_∧
( ・ω・。)つ━☆・*。
⊂ ノ ・゜+.
しーJ °。+ *´¨)
.· ´¸.·*´¨) ¸.·*¨)
(¸.·´ (¸.·'* ☆
Anonymous
Прости. Запилить что ??
Anonymous
Я его знаю еще по контакту. О чем с ним можно договариваться ))))
Anonymous
Как вариант, учитывая что сообщество Lua прогеров слабоватое, то можно совместными усилиями его приумножить в разы. Вот смотри, нас тут подписчиков: 247 чел. Можно сказать что активных человек 30-40. Не знаю даже. Если бы каждый из этих сорока, каждый день (ну или через день) реализовывал бы хоть 1 одну задачку по алгоритмам и тому подобное, То за год у нас бы накопилось десяток тысяч решеных и хорошо закомментированных любых задач. Включая все олимпиадные из всевозможных учебников. Если это все запостить отдельным форумом в сети, то представь как быстро начнет увеличиваться число пишущих на Lua.
Anonymous
На прогерских форумах очень часто студенты приходят и просят решить. Представь себе базу готового кода на все случаи жизни. При чем все они составлены предельно ясно, так что можно самому студенту перевести и на С
Anonymous
Рейтинг у такого форума взлетать будет быстро.
Anonymous
Знаешь, некоторые вещи невозможно объяснить. Надо только пробовать. Я просто знаю и все. Ну хорошо, приведи мне пример хорошо структурированного сайта по готовым исходникам. На бывалых форумах задач валом, но как правило они все написаны отрывисто и невнятно. Новичок сам хер разберется. А на луа писать и не надо, даже если С или Python, то как я уже ранее говорил, код всеми участниками (тобишь нами) составляется приближенно к псевдокоду. Саму логику студент потом сам переведет в С. Если он не совсем баран.
Anonymous
Не забывай что я писал в начале. Это для энтузиастов : ) Для тех, кто влюблен в Луа
Anonymous
Те кто знают С тем более. Они овладеют им за 40 мин.
Anonymous
Я знаю С. Но только не ++. Без ООП. И вот сейчас если ты мне даешь любую задачу на алгоритмы, то я знаю что открыв Scite я напишу ее в 2 раза быстрее чем на С. Так что в этом есть смывсл
Anonymous
Ну пожалуйста: вот к примеру тематика нейронных сетей. Распознавание речи, образов, анализ, статистика. Очень модно сейчас : ) Или опять не то ? ) Тут ты спотыкнешься, сказав что этого валом в сети )))
Snusmumriken
Может быть Snusmumriken ответит. Это смышленый малый - посмотрим )
Ну типа в реальной жизни - ноль раз, Фил прав, абсолютного наложения не будет никогда из-за нематематичности макро-мира.
В "виртуальной" - два раза, в полночь и полдень. Дальше будут расхождения хоть на пол градуса.
Остальные случаи, типа "ну может быть, если часы чуть спешат или ещё что-то такое, то они могут накладываться чуть чаще/чуть реже, бла-бла" - меня не интересует, ибо вводятся дополнительные условия.
Нет, я не смышлённый, я в opengl рисовал аналоговые часы и хотел сделать "максимально ровно", и это не получилось ))
Snusmumriken
Я влюблён в не луа а в себя, и мне просто пофигу на мнения окружающих, поэтому меня можно обсирать сколько влезет ))
Snusmumriken
Ostap ꑭ
Snusmumriken
Около восьми.
vvzvlad
веков
Snusmumriken
Рейтинг у такого форума взлетать будет быстро.
Есть универсальный ответ на вопрос "как реализовать тот или иной алгоритм на произвольном языке":
http://rosettacode.org/wiki/Rosetta_Code
Для луа нужна не "популярность" через олимпиады школьников, а неофициальные но нормальные и сравнительно популярные либы (или аналог boost, но не такой жирный и связанный), иначе скатится в паскаль, добро пожаловать: https://t.me/joinchat/BdG9wUMuKiF0sugEGC1nNQ.
Мне впадлу отвечать каждый раз на дебильные вопросы, ответ на который находится в первой строке гугла, а такой "форум" будет завален именно таким, омерзительно. Школьники-олимпиадники регулярно не умеют ценить своё время и силы, и уж они совсем не будут ценить время окружающих, будут дёргать по каждой мелкой фиговине и садиться на шею. Их надо учить искать информацию, а не давать ответы. И чем сложнее эту информацию добыть - тем лучше для них: самообучаемость резко вырастет, и мб перестанут дёргать окружающих своими мизерными хотелками.
Плюс луа - сам по себе - нишевой язык, таких пришибленных как я - мало. Его изначальная задача - быть встраиваемыми скриптами.
Популярность луям и так резко повышают гмоды-сталкиры-опенкомпьютерс и тонны игровых движков/фреймворков, тут нам нечего делать, а учить людей надо не конкретным алгоритмам (сам алгоритм произвольной сложности - фигня, перемешивание цифр) а архитектурам, ибо они, в "с-подобной" среде - языконезависимые.
Elias
Полностью согласен всем вышесказанным согласен
И я думал, что у Lua есть шанс стать таким же популярным, как Питон, но после того, как я понял сколько сил и средств было вложено в инфраструктуру Питона, я понял, что такое второй раз навряд ли пройдёт.
Я считаю, что в идеале Lua надо юзать вместе с другими языками или если хочется использовать какую-нибудь конкретную штуку.
Но один numpy чего стоит. У Lua вроде нет настолько универсальных вещей
Snusmumriken
http://torch.ch
Не настолько универсально, но похоже.
Elias
Ага, это наверное ближайшее. И очень меня радует, что эта штука существует.
Elias
Вообще хотелось бы лично бороться с монополизмом языков и пиарить Lua, но даже не знаю, как это делать.
Сейчас пишу Lua/C++ туторы, которые по идее должны быть более подробными, чем всё, что я до этого находил
Но фиг знает, какой вклад это внесет.
Мб какой-то перспективный проект помогать писать в свободное время? Даже не знаю.
Snusmumriken
Но сравнивая луа и питон, ты сравниваешь "сишку" от скриптов и "сиплюсплюс" от скриптов.
Задачи у ЯП немножко разные: питон даёт всё что можно, а луа - всё что необходимо, и это огромная разница.
И становится очевидно, почему "С++ гораздо популярнее С, но на С всё ещё много что пишут", нужны оба ЯП (хотя плюсы бы реворкнуть, ибо монстр несуразный).
Мне очень понравилось то, что в луа можно особо ничего не учить, и сразу приняться за велосипед, или заточить свой скрипт под узкую специализацию, чтобы он делал это предельно хорошо, а потом залить сурц на микроконтроллер, потому что внешних либ почти нет: тут почти всё - твоё.
В целом, язык выбрал случайно, года три-четыре назад, искал движок/фреймворк под "простую 2d-игрулю", когда меня припёрло учить какой-то язык, ибо визуальное программирование в construct2 - фигня, и факт что словами я напишу то же самое в пять раз быстрее - был очевиден даже для меня-непрограммиста.
_AMD_
Elias
Ну да, это хорошая аналогия. Только у C чуть больше силы - он может использоваться с C++ и часто делают биндинги больших библиотек, в итоге С навряд ли скоро умрёт, не смотря на все преимущества C++.
У Lua же нет большого брата, что несколько сложнее делает положение.
Язык выбрал я тоже почти случайно. Ну, в геймдеве Lua наверное самый универсальный и адекватный скриптовый язык. Все альтернативы чем то хуже, я считаю.
Elias
а где пишешь?
Пока что локально. Думаю сразу запостить сразу несколько статей на свой блог
(eliasdaler.github.io)
Elias
Это произойдет где-то в этом месяце, надеюсь :)
Elias
Сначала будут базовые статьи, разве что. Про установку, компиляцию, Lua state, работу с переменными, загрузку и выполнение скриптов.
Но я думаю, что я в этих статьях хотя бы часть вещей напишу, которые я нашёл только на третьем году знакомства с Lua, ха-ха. Не сразу понимание приходит.
В конце вообще хотел бы описать всякие хаки и очень практические примеры, например как я реализовывал разные штуки в своей игре. Как разделял движок и скрипты, как делал сами скрипты более читаемыми и гибкими и пр.
Elias
Но вообще я думаю, что стоит спросить здесь: если бы вы читали ИДЕАЛЬНЫЙ (11/10) ТУТОР, то что бы вы в нём хотели видеть?
Просто я часто встречаю туторы так себе. Слишком затянутые, либо слишком краткие. Либо с чрезмерным петросянством.
О чём бы стоило написать, что может быть не так очевидно?
Snusmumriken
Метатаблицы. У кучи начинающих с ними проблемы, притом кратенько расписать пример для каждого метаметода.
Для арифметических - уточнить что аргументы передаются в порядке выражения, и это придётся учитывать:
a = a + 10 --> __add(a, 10)
a = 10 + a --> __add(10, a)
Elias
Хорошая идея, спасибо
Только вот не знаю, буду ли я углубляться, надо всё же будет частично посылать читать Programming in Lua. Тутор же всё же не а Lua, а о Lua/C++ :D
ShadoWalkeR
С++ в последнем стандарте очень сильно причесали - он намного лаконичней и удобней стал
ShadoWalkeR
У луа есть еще пара проблем - он осталяет ощущение незаконченности. Как будто студент делал, но некоторые моменты непродумал. Отсутсвие того же switch, к примеру. Или мне к примеру нужно было массово переименовать файлы, я пол дня убил пытаясь заставить встроенными средствами это сделать. В итоге не выдержал - поставил пакет из luarocks и увидел скомпилированную библиотеку для работы с файловой системой. luarocks тоже кстати та еще боль - он ужасно встраивается и временами пакеты им устанавливаемые просто не подхватываются. Приходится проиписывать пути руками, но это не всегда работает, поэтому установленные вещи руками перекидывать в папку с луа
Snusmumriken
ShadoWalkeR
Я это в центосе делал
Snusmumriken
А я в убунте встроенной в win10, мне норм )))
ShadoWalkeR
Синтаксический сахар помогает писать программы. Если он, конечно, не вырождается в джаву 😃
ShadoWalkeR
И да - в центосе зачастую проще сделать yum install lua-%NAME% чем пытаться сделать это через luarocks
Snusmumriken
Ненене, синтаксический сахар полезен только если ты в курсе, что действительно происходит, иначе это магия и потенциальная "дырка в абстракции", т.е. дурацкая штука которая вынуждает неучей делать ошибки.
Я люблю сахарок, но тщательно выясняю происходящее, иначе проблемсы.
Прекол луа - в малом объёме слов, и из сахара тут, пожалуй, только двоеточие.
Кстати, свитч-кейсы заменяются табличками с функциями. Например, чот такое:
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
Вот тебе наиболее удобный свитч-кейс, в который удобно запихивать произвольное количество команд, хоть делить на модули по две тысячи строк.
ShadoWalkeR
Я это сделал на таблице с метатаблицей на отсутствующий элемент в качестве default
ShadoWalkeR
Но я для примера приводил
Snusmumriken
Ну да, можно default в метатаблице, но это уже "извращения", тупой и читаемый вариант - вставить else, если не нашёлся в таблице.
ShadoWalkeR
С чего вдруг нечитаемый то?
Snusmumriken
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
Ммм. Нечитаемо. Я так только в своих проектах пишу, потому что знаю что я - разберусь.
А если это придётся поддерживать "белому человеку"?
ShadoWalkeR
И вы считаете что switch все еще не нужен? 😃
Snusmumriken
Не а ))
Слишком редко нужен.
Snusmumriken
Читаемый вариант для тупых:
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
ShadoWalkeR
Вы сейчас как типовой адепт Го - те точно также любят говорить что язык идеален. А как только чтото добавляется, делают вид что так и задумано было)
Snusmumriken
Я в курсе, спасибо : )
Конечно язык идеален, да и я тоже ничего!
ShadoWalkeR
😂👍
Snusmumriken
Большая часть моего кода выглядит примерно так. Если где-то в очень редком случае нужен свитч-кейс - отдельная табличка под него.
ShadoWalkeR
В моем случае все несколько хуже - многоэтажные конструкции if - else чаще встречаются
Snusmumriken
Конкретно тут - ООП без метатаблиц на синглтонах, но если всё таки нужно много типизированных объектов - цепляется одна маленькая метатабличка.
Минимум непонятных действий.
Я про избыточность цепляния default к метатаблице таблицы для свитч-кейса.
ShadoWalkeR
Ну и помимо switch я бы не отказался от аналога #include - который просто вставляет содержимое одно файла в это место в другом. Да я знаю про require, dofile и тд, но это же логичный и минималистичный способ попилить одни большой скрипт на несколько мельче
Snusmumriken
dofile чем плох?
ShadoWalkeR
Насколько помню он выполняет его как скрипт а не добавляет
Snusmumriken
Require - технически выполняет скрипт как функцию и возвращает результат.
Эта "функция" может работать с глобальными переменными и всем таким. Но это путь ереси, если что.
ShadoWalkeR
Я просто для астериска диалплан на луа делаю. Проблема в видимости - если я чтото выношу во внешний файл, астерисковые вещи недоступны изза порядка инициализации. А без выноса во внешние файлы extensions.lua как то сильно раздувается
Snusmumriken
На самом деле, "вставка содержимого одного файла в другой" - это кошмар и ужас, потому что приходится искать хвосты: где что объявилось, где что изменилось.
Дай дураку стеклянный член - он и член разобъёт, и сам порежется.
Snusmumriken
Ты кури нормальные структуры приложений:
1. Ни один модуль не объявляет, не изменяет и не удаляет ничего глобального. Никогда.
2. Если в нескольких модулях нужен один общий - реквайрить его в каждом. Это позволяет хоть как-то сводить концы с концами.
3. Модули не должны держать никаких внутренних состояний, только возвращать класс/объект. Если нужен, например, пополняемый словарь для LZW в модуле - объявляем там локально.
4. Вся реальная движуха и единственное место для глобалов - только в одном файле, который ты запускаешь.
Правила нехитрые, минимизируют 99% ошибок.
ShadoWalkeR
Я выше озвучил почему мне нужна проста вставка)
Snusmumriken
А ООП для кого придумывали? : )
ShadoWalkeR
Так, поясню получше:
Как вызвать из внешнего модуля функции, которые появятся в глобалке после вызова этого файла? Потому как без них в этом модуле смысла нет
Snusmumriken
Хм.
*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(...))
]]
Snusmumriken
Вызывать require несколько раз - можно, хоть каждый раз при вызове (чуть медленнее чем обычный вызов, результат кешируется).
Snusmumriken
Карочи, переделай файл который объявляет глобалки на возвращаемую табличку с функциями.
Snusmumriken
Это можно частично сделать автозаменой, если что.
Но хвосты будут находиться в десять раз проще, а область видимости - в пять раз нагляднее.
Первое правило: ничего глобального в модулях, кроме использования стандартной библиотеки луа.
Snusmumriken
Ферштейн?
ShadoWalkeR
Я ищу исходники модуля чтобы пояснить)
ShadoWalkeR
https://github.com/asterisk/asterisk/blob/master/pbx/pbx_lua.c
ShadoWalkeR
Раз
Snusmumriken
Дай угадаю, он держит кучу своих состояний и объявляет глобальные define-переменные типа MAX_INCOMING_CALL_COUNT, и вообще написаны бывшими сишниками?
ShadoWalkeR
И вся логика превращается вот в такое - https://gist.github.com/igmar/4066527
ShadoWalkeR
О, только заметил - это неофициальный реп астериска - там комментарии к коду появились😂
ShadoWalkeR
В оригинальном файле все несколько печальней
Snusmumriken
Поздравляю, вы попали на придурков, писавших сишный модуль как сишники. Нормальные люди делают примерно так. Ничего глобального, возвращаем табличку с функциями.
ShadoWalkeR
Поэтому я думаю его переписать. Но на язык белок 😊
ShadoWalkeR
На самом деле этот модуль давно в астериске появился, и я не заметил чтобы он хоть как то менялся
Snusmumriken
А теперь, примерно так делают нормальные люди, когда встречаются с чем-то похожим:
*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() -- типа сразу инициализируем, или нет