Михаил
в шарпе тоже есть
Михаил
чем луа хуже-то
Михаил
UtoECat
чем луа хуже-то
она лучше, в таблицу можно и несколько значений запихнуть и расшарить) таблицы в регистрах и перменных - уже ссылки. Зачем выдумывать что-то ещё?
Михаил
Michael@hpv15:~> luajit LuaJIT 2.1.1707061634 -- Copyright (C) 2005-2023 Mike Pall. https://luajit.org/ JIT: ON SSE3 SSE4.1 BMI2 fold cse dce fwd dse narrow loop abc sink fuse > function make() local v = 0 local function set(i) v = i end local function get() return v end return get, set end>> >> >> >> > g, s = make(); > =g function: 0x7fb24f076498 > =s function: 0x7fb24f075be0 > =g() 0 > s(12) > =g() 12 >
UtoECat
ай переапутал, user values
Михаил
а,‌ ты предлагал сделать ссылки на юзердате в си апи?
Михаил
или user values
UtoECat
а,‌ ты предлагал сделать ссылки на юзердате в си апи?
да. Но не думаю что есть особо смысл... оно жеж не на luajit
Михаил
да. но можно же обойти C API
Михаил
я скачивал целый луажит,‌ а значит я могу изменить весь луажит...
UtoECat
да. но можно же обойти C API
можно, но это, имхо, слишком нишевая оптимизация. оверхед на таблицу очень маленький, и легко можно компенсировать пихая в таблицу несколько значений
Михаил
ну да,‌ может ссылки не такие важные
Михаил
и релиз будет полноценным и без них
Михаил
(точно)
Михаил
но надо подумать что значит ссылка. я имею ввиду ближайшее к ссылке в си шарп
Михаил
правда там она имеет ограничения в асинк,‌ а ограничения в асинк никому не нужны
Михаил
я имел ввиду.. чо под капотом у ссылки. это просто синтаксический сахар для таблиц или нечто глубже
Михаил
синтаксический сахар у меня уже неплохо получается
Михаил
засахарил шо слипнется небось
Михаил
а вм еще не патчил
Михаил
Нельзя просто так взять... и изменить переменную вне стека для текущей функции...
Михаил
да и в чем проблема,‌ когда ссылки можно сделать на сахарных операторах
UtoECat
сравни int f = 0; int &ref = f; ref = 12;
с интом в шарпе же вроде нельзя так делать... нет?
Михаил
емнип можно
UtoECat
емнип можно
без объекта с полем инта...
Михаил
да и в чем проблема,‌ когда ссылки можно сделать на сахарных операторах
local a = b ref; // экв. local a = {value = b}; a <- 8; // присвоили 8 print(a?) // достали значение
Михаил
и оператор -> можно сделать наподобие в с++‌, чтобы обращался к полям объекта
Михаил
ну гениально
Михаил
всё,‌ не будет ссылок на уровне VM
Михаил
как в шарпе?
Михаил
эквивалент s and (s.field.action())
UtoECat
эквивалент s and (s.field.action())
a?.b?.c?.d - вот для таких случаев и длиннее
Михаил
а как он реализовал?‌ подозреваю что так 1. если nil, то возвращается такая штука которая выдает на любое обращение к полю или оператору саму себя 2. если не nil то вызываем метод
Михаил
аааа, он пропатчил nil чтоб он так делал...
UtoECat
аааа, он пропатчил nil чтоб он так делал...
это просто debug.setmetatable() на nil с метаметодом __index, возвращающим nil (не делайте так)
Михаил
а как тогда вызывать nil
Михаил
там же определенно будут вызовы nil
Михаил
nil("hello world!")
UtoECat
а как тогда вызывать nil
__call метаметод тоже есть... но не надо так, пожалуйста
Михаил
да можно же отдельную таблицу создать и ее возвращать вместо nil
Михаил
так,‌ у меня проблемы с ->
Михаил
a -> b значит что?‌ что a получит значение b, а не строку "b"
Михаил
и индексировать так удобно не получится
Михаил
надо сделать такой механизм, позволяющий получить имя поля при обращении
Михаил
о. я придумал
UtoECat
да можно же отдельную таблицу создать и ее возвращать вместо nil
можно... но это гемор потом с сохранением метатаблицы этой... установкой её где надо... и всё ещё запутывает читателя - кажется, что кодом ожидается, что все поля всегда присутствуют
Михаил
если следующий токен после -> это TK_name, то оно интерпретируется как TK_string
Михаил
если в скобочках то будет значение
Михаил
Михаил
а хтя.. зачем. ведь есть точка
Михаил
__index
Михаил
проблема еще вот в чем - допустим есть susp?.field.action(sendmessage(ip, port, "fgjghfgjg"));
Михаил
sendmessage вызовется,‌даже если susp == nil
Михаил
в сишарпе такого не произойдет
Михаил
susp and susp.field.action... даст уже другой результат
Михаил
нормальный парсинг такого оператора будет примерно тогда же,‌ как и оператор замещения (замещающий += -= *= /=,‌ хоть и не так коротко, ну например var.field.act().field = rep + 8, где rep будет равняться var.field.act().field). я над этим подумаю
Михаил
вот эта шняга требует сохранения предыдущего значения в регистре. щас он каждый раз перезаписывается
Михаил
иными словами вот получили var в регистр 5 .field теперь в регистре 5 значение полученное от .field .act() теперь там значение из вызова .field теперь другое значение
Михаил
и при парсинге expr_primary мне надо будет их чередовать чтобы предыдущий всегда сохранялся,‌ а потом если что достать и превратить из destination (то куда присваивается,‌ левая часть от равно) в значение
UtoECat
sendmessage вызовется,‌даже если susp == nil
Не думаю что это проблема. Так уж луашка устроена.
Михаил
я боюсь что это сильно засрет стек и ограничит количество локальных переменных, в худшем случае - вдвое
Михаил
стой.....
Михаил
Михаил
на одно присваивание может быть только один (ну не совсем один,‌ но как правило)‌ левый операнд
Михаил
а потом это дело очищается..
Михаил
а если это применить и для ?. чтобы заменить его на AND, стек подзасрется посильнее
Михаил
если не AND то будет дикий костыль, ломающий продовые решения...
Михаил
если бы я всего лишь мог заглянуть на несколько токенов вперед
UtoECat
если бы я всего лишь мог заглянуть на несколько токенов вперед
вангую что это без построения AST уже не сделать нормально... а это уже какой-то luau получается
Михаил
можно еще сделать MOV если вдруг регистр до этого остался пустым