Comments 10
Когда-то лет 15 назад меня жизнь сталкивала с Lua и я плевался: "Вот что за гадость? Массивов нет. continue нет. Регекспы и те с нуля зачем-то придумали!".
Мы в то время писали большие проекты на Perl.
Так вот, за эти 15 лет я от Lua отошёл, потом отошёл от Perl. Всё заполнили Go, Python и Rust.
Сейчас вернулся в проект на С и Lua и... с большой теплотой стал относиться к этому языку после Python, Go и Rust
Я с универа начал писать на C# и сколько бы я не смотрел на другие языки, все они казались не удобными, только TypeScript нормальный
Да ладно, Rust смотрит на вот этот кусок с нескрываемым удовольствием, поглаживая свой match
код для “if-селектора”, который является абсолютным чемпионом по производству багов в проекте
Хотел именно этот кусок прокомментировать. В таких случаях я всегда пользуюсь dispatch table (по индексу ID лежит функция-обработчик). Я не знаю, где там закрадывались баги, но еще не вижу defensive programming, чтобы было в конце else бросающее исключение ошибку на несуществующий ID.
Плюс такой таблицы (как и остальные таблицы в Lua): O(1) read.
Но ведь условия переходов даже по таблице все равно нужно как-то формализовать. Насколько эта формализация менее подвержена человеческому фактору, чем if/else сопли?
В итоге получается эквивалент (catch all/default) else: error(...), потому что на несуществующий ID из таблицы вернется nil, который нельзя как функцию вызвать.
Если нужно наворотить сверху логику, то никак не поможет. (или что вы имели ввиду?) Но обычно-то речь идет о том, что альтернативная реализация этого куска будет по ООПшному: каждый тип объекта имеет свой обработчик, который без лишних телодвижений вызывается.
Посмотрел доку на match. Да, лишними телодвижениями через метатаблицы я и range делал (типа 2..99). Этим стандартный синтаксис/сахар и хорош, что он стандартный. А метатабличные... сопли -- каждый раз когнитивная нагрузка. Может получится приближение к "самый умный код, что ты можешь написать, умнее того, чтобы ты в нем исправлял ошибки".
PS: Обратная сторона сахара: если его станет слишком много и что-либо можно решить двумя-тремя путями. Тогда уже начинается "А это что за магия? А что, так можно было?" Поднимается значительно порог входа
В свое время тоже написал тысячи строк на Lua для мода NLC7 (STALKER Shadow of Chernobyl), с привеликим удовольствием улучшая возможности игры. При этом параллельно развивал API, дорабатывая сам движок.
Ослеп, когда долистал до "Секрета". Надо было сильнее предупреждать!
"таблица в таблице не является таблицей, а ссылкой на таблицу"
Если в языке нет явного разделения на значения и указатели, то это разделение неявно.
Что я думаю о Lua после релиза проекта на 60,000 строчек кода?