LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

У этого есть свои преимущества и это обычное поведение для большинства языков. Локальность по умолчанию только звучит хорошо, но на деле она сразу обязывает на просто написать print("hello") а ещё внести в локальную область этот самый print в lua стандартная база из коробки вшита в саму луа, её не надо подгружать и объявлять, она не иммутабельна и может быть изменена динамически или ещё до старта работы это следствие того что луа не существует сама по себе это всегда встраиваемый язык. Есть ещё разница в том как хранятся локальные и глобальные данные. Локальные быстрые ибо они переносятся на стек целиком либо прямым указателем без взятия хеша с глобальной таблички каждый раз при обращении. Поэтому есть ограничение на локальные переменные и функции. Отдельное слово global для явного указания что данные глобальны тоже лишь звучит красиво, а на деле костылей и подпорок не оберёшься из за побочных эффектов.

Идеального варианта нет, но явное указание локальности и «по умолчанию» глобальность дают хороший компромисс и большую гибкость, когда ты одновременно контролируешь и эффективное использование памяти и вычислительных ресурсов в зависимости в том что тебе более важно области видимости do...end никто не отменял как и в си {...} и в десяках других языков, опять же в них же всё всегда тоже глобально, а локальность компилируемой/интерпретируемой единицы есть сама по себе и лишь в отдельных случаях ты пишешь типа static int x = 5 если хочешь что-бы даже случайно через export кто не подхватил твои данные и другой компилируемой/интерпретируемой единицы (файла чаще всего, могут быть просто отдельные строки или замыкания или REPL)

Короче на деле не всё так просто и этот момент с local очень хорошо продуман и явно выбран учитывая как особенности языка, так и механизм взаимодействия с ним. У луа, лишь одна фундаментальная проблема это некая особенность работы таблиц и стандартных функций с nil и уже тридцатилетняя привычка людей считать nil ничем это родило кучу всякой фигни с которой нужно просто жить или выпускать lua-6.0 где поведение работы с nil будет изменено или будет новый тип nop который будет не просто типом который не является ни одним из базовых, а просто будет реально ничем, так как сейчас nil и реальное ничто это разные вещи которые вынуждают некоторые штуки в луа просто не делать. local в луа это здорово и хорошо.

Луа это часто просто гениальный баланс компромиссов, там любая закорючка обоснована. Но, некоторые вещи типа nil который тоже коспромисс вызывают спустя 30+ лет вопросы. Тогда это было экономией памяти и это правильно и это сейчас есть и это должно остаться, но вот в неекоторых случаях можно изменить поведение сохранив фичи и внеся ясность, просто тогда это не знали как сделать, а сейчас не делают потому что это будет тотальная несовместимость, просто весь прошлый код сломается разом. Для луа совместимость не так уж и важна в связи со спецификой языка, но тут будет прям конкретное такое эдакое. Так что Вавилонски решится на такое если пойдёт на пенсию наверное, хотяя…

Исправление LINUX-ORG-RU, :

У этого есть свои преимущества и это обычное поведение для большинства языков. Локальность по умолчанию только звучит хорошо, но на деле она сразу обязывает на просто написать print("hello") а ещё внести в локальную область этот самый print в lua стандарстная база из коробки вшита в саму луа, её не надо подгружать и объявлять, она не иммутабельна и может быть изменена динамически или ещё до старта работы это следствие того что луа не существует сама по себе это всегда встраиваемый язык. Есть ещё разница в том как храняться локальные и глобальные данные. Локальные быстрые ибо они переносятся на стек целиком либо прямым указателем без взятия хеша с глобальной таблички каждый раз при обращении. Поэтому есть ограничение на локальные переменные и функции. Отбельное слово global для явного указания что данные глобальны тоже лишь звучит красиво, а на деле костылей и подпорок не оберёшься из за побочных эффектов.

Идеального варианта нет, но явное указание локальности и «по умолчанию» глобальность дают хороший компромисс и большую гибкость, когда ты одновременно контролируешь и эффективное использование памяти и вычислительных ресурсов в зависимости в том что тебе более важно области видимости do...end никто не отменял как и в си {...} и в десяках других языков, опять же в них же всё всегда тоже глобально, а локальность компилируемой/интерпретируемой единицы есть сама по себе и лишь в отдельных слуячаях ты пишешь типа static int x = 5 если хочешь что-бы даже случайно через export кто не подхватил твои данные и другой компилируемой/интерпретируемой единицы (файла чаще всего, могут быть просто отдельные строки или замыкания или REPL)

Короче на деле не всё так просто и этот момент с local очень хорошо продуман и явно выбран учитывая как особенности языка, так и механизм взаимодействия с ним. У луа, лишь одна фундаментальная проблема это некая особенность работы таблиц и стандартных функций с nil и уже тридцатилетняя привычка людей считать nil ничем это родило кучу всякой фигни с которой нужно просто жить или выпускать lua-6.0 где поведение работы с nil будет изменено или будет новый тип nop который будет не просто типом который не является ни одним из базовых, а просто будет реально ничем, так как сейчас nil и реальное ничто это разные вещи которые вынуждают некоторые штуки в луа просто не делать. local в луа это здорово и хорошо.

Луа это часто просто гениальный баланс компромиссов, там любая закорючка обоснована. Но, некоторые вещи типа nil который тоже коспромисс вызывают спустя 30+ лет вопросы. Тогда это было экономией памяти и это правильно и это сейчас есть и это должно остаться, но вот в неекоторых случаях можно изменить поведение сохранив фичи и внеся ясность, просто тогда это не знали как сделать, а сейчас не делают потому что это будет тотальная несовместимость, просто весь прошлый код сломается разом. Для луа совместимость не так уж и важна в связи со спецификой языка, но тут будет прям конкретное такое эдкое. Так что Вавилонски решится на такое если пойдёт на пенсию наверное, хотяя…

Исходная версия LINUX-ORG-RU, :

У этого есть свои преимущества и это обычное поведение для большинства языков. Локальность по умолчанию только звучит хорошо, но на деле она сразу обязывает на просто написать print("hello") а ещё внести в локальную область этот самый print в lua стандарстная база из коробки вшита в саму луа, её не надо подгружать и объявлять, она не иммутабельна и может быть изменена динамически или ещё до старта работы это следствие того что луа не существует сама по себе это всегда встраиваемый язык. Есть ещё разница в том как храняться локальные и глобальные данные. Локальные быстрые ибо они переносятся на стек целиком либо прямым указателем без взятия хеша с глобальной таблички каждый раз при обращении. Поэтому есть ограничение на локальные переменные и функции. Отбельное слово global для явного указания что данные глобальны тоже лишь звучит красиво, а на деле костылей и подпорок не оберёшься из за побочных эффектов.

Идеального варианта нет, но явное указание локальности и «по умолчанию» глобальность дают хороший компромисс и большую гибкость, когда ты одновременно контролируешь и эффективное использование памяти и вычислительных ресурсов в зависимости в том что тебе более важно области видимости do...end никто не отменял как и в си {...} и в десяках других языков, опять же в них же всё всегда тоже глобально, а локальность компилируемой/интерпретируемой единицы есть сама по себе и лишь в отдельных слуячаях ты пишешь типа static int x = 5 если хочешь что-бы даже случайно через export кто не подхватил твои данные и другой компилируемой/интерпретируемой единицы (файла чаще всего, могут быть просто отдельные строки или замыкания или REPL)

Короче на деле не всё так просто и этот момент с local очень хорошо продуман и явно выбран учитывая как особенности языка, так и механизм взаимодействия с ним. У луа, лишь одна фундаментальная проблема это некая особенность работы таблиц и стандартных функций с nil и уже тридцатилетняя привычка людей считать nil ничем это родило кучу всякой фигни с которой нужно просто жить или выпускать lua-6.0 где поведение работы с nil будет изменено или будет новый тип nop который будет не просто типом который не является ни одним из базовых, а просто будет реально ничем, так как сейчас nil и реальное ничто это разные вещи которые вынуждают некоторые штуки в луа просто не делать. local в луа это здорово и хорошо.