Pull to refresh

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, дорабатывая сам движок.

Ослеп, когда долистал до "Секрета". Надо было сильнее предупреждать!

"таблица в таблице не является таблицей, а ссылкой на таблицу"

Если в языке нет явного разделения на значения и указатели, то это разделение неявно.

Sign up to leave a comment.

Articles