Andrey BushevПохоже в 5.5 externalstring это прям способ сделать деструктор, что может исполняться при emergency gc, а также после всех userdata при закрытии.
Может есть что проще? А то при закрытии можно получиться так, что ссылка есть, а функция __gc уже вызвалась.
Не понял?
Я точно уже не помню, но при закрытии стейта вроде и так просто всё собирается, разве нет?
(Ну вроде да правда я не помню уже как там emergency gc со всем этим работает... Вроде бы emergency gc финалайзеры и не вызывает, т.к для этого надо объект "воскресить" и ещё на стеке место на его вызов, а в emergency мы могли войти как раз из-за нехватки стека. Собственно ассерты об этом же и говорят...)
Andrey BushevПохоже в 5.5 externalstring это прям способ сделать деструктор, что может исполняться при emergency gc, а также после всех userdata при закрытии.
Может есть что проще? А то при закрытии можно получиться так, что ссылка есть, а функция __gc уже вызвалась.
Насколько я смутно помню, externalstring "деструктор" он только для освобождения собственно памяти строки, и со стейтом луашным из него взаимодействовать нельзя. Слегка похоже на то, как в luau финалайзеры юзердаты в целом сделаны, но не суть...
По сути это более оптимизированная версия на случай, когда надо внешние ресурсы прибить, без оверхеда. Вроде-бы новый лоадер нативных либ так её использует...
Хотя канонично это всё делали для переиспользования памяти константных строк между независимыми стейтами, а не вот это всё...
К слову большой вопрос стоило-ли оно того, т.к теперь надо по ещё одному указателю прогуляться, чтобы собственно данные строки получить... но да ладно.
SnusmumrikenГлавное при этом не попасть в касту бородатых очкастых фурри в свитере с оленями и с головой оленя.
Олени Санты - сильные уверенные в себе женщины.
Возвращаясь к теме глобалок - хотелось сделать нечто вроде:
if Lua_version < 5.5 then
require 'strict'
else
load('global none')()
x = 10 -- x не запрещена
end
y = 20 -- а здесь и подавно
Всё из-за скоупов. В принципе, это странный дизайн - глобальные переменные должны быть глобальными, в этом их назначение, а то мы фактически получили ещё один вид локалок. И смысл?
Sergey NikonovВозвращаясь к теме глобалок - хотелось сделать нечто вроде:
if Lua_version < 5.5 then
require 'strict'
else
load('global none')()
x = 10 -- x не запрещена
end
y = 20 -- а здесь и подавно
Всё из-за скоупов. В принципе, это странный дизайн - глобальные переменные должны быть глобальными, в
Опять-таки, это не замена поведения глобалок, это чисто компайл-тайм проверки для сохранения времени и нервов в случае опечаток и прочего)
Потому, что в луа, по умолчанию, если переменная не определена как локалка - значит юзаем глобалки.
Здесь же, если ты явно прописал какие глобалки ты хочешь чтобы были глобалками и только они - будет ошибка во время загрузки исходника, а не исполнения.
Sergey NikonovВозвращаясь к теме глобалок - хотелось сделать нечто вроде:
if Lua_version < 5.5 then
require 'strict'
else
load('global none')()
x = 10 -- x не запрещена
end
y = 20 -- а здесь и подавно
Всё из-за скоупов. В принципе, это странный дизайн - глобальные переменные должны быть глобальными, в
Ну он и с попыткой сохранить обратрую совместимость как-никак) иначе все старые скрипты прям нехило так поломаются.
UtoECatНу он и с попыткой сохранить обратрую совместимость как-никак) иначе все старые скрипты прям нехило так поломаются.
Понятно, что поломаются, может, моя цель в том состоит) - иметь полноценную статическую проверку.
Sergey NikonovЭто понятно, но ещё раз - механизм работает только в пределах скоупа, в том числе не распространяется на загруженное load/require.
В пределах цельного куска кода так сказать, да. По очевидным причинам.
global ключевое слово просто стоит больше интерпретировать как "allow_only_theese_globals_here", тогда всё становится проще к пониманию)
Ну и в разных файлах, само собой, может захотеться естественным образом навесить свои уникальные ограничения... Так что...
UtoECatВ пределах цельного куска кода так сказать, да. По очевидным причинам.
global ключевое слово просто стоит больше интерпретировать как "allow_only_theese_globals_here", тогда всё становится проще к пониманию)
Ну и в разных файлах, само собой, может захотеться естественным образом навесить свои уник
Верно, я уже об этом говорил. Просто хотелось сделать вжух! и отловить все глобалки не в рантайме, как это делает strict, а на этапе компиляции.
Sergey NikonovВозвращаясь к теме глобалок - хотелось сделать нечто вроде:
if Lua_version < 5.5 then
require 'strict'
else
load('global none')()
x = 10 -- x не запрещена
end
y = 20 -- а здесь и подавно
Всё из-за скоупов. В принципе, это странный дизайн - глобальные переменные должны быть глобальными, в
Такое можно сделать маленьким костыликом, написав условный
if Lua_version >= 5.5 then
function my_load(str) return load("global print, assert, table, string, etc; " ... str) end
else
my_load = load
end
:) и повторить на все функции загрузки кода подобное...
Можно ещё <const> вдобавок навесить вроде)
СавваТакой способ только не ловит _G[...] лукапы.
_G можно просто не разрешать как глобалку)) вроде бы как
СавваОстаётся _ENV :-)
Ну тут да... Но на прямое чтение/запись из/в ENV в целом должны быть веские основания, обычно это крайне специфичный и изолированный код... Так что...