История изменений
Исправление 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
в луа это здорово и хорошо.