Михаил
в шарпе тоже есть
Михаил
чем луа хуже-то
Михаил
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
Михаил
UtoECat
ай переапутал, user values
Михаил
а, ты предлагал сделать ссылки на юзердате в си апи?
Михаил
или user values
UtoECat
Михаил
да. но можно же обойти C API
Михаил
я скачивал целый луажит, а значит я могу изменить весь луажит...
UtoECat
да. но можно же обойти C API
можно, но это, имхо, слишком нишевая оптимизация. оверхед на таблицу очень маленький, и легко можно компенсировать пихая в таблицу несколько значений
Михаил
ну да, может ссылки не такие важные
Михаил
и релиз будет полноценным и без них
Михаил
(точно)
Михаил
но надо подумать что значит ссылка. я имею ввиду ближайшее к ссылке в си шарп
Михаил
правда там она имеет ограничения в асинк, а ограничения в асинк никому не нужны
UtoECat
Михаил
я имел ввиду.. чо под капотом у ссылки. это просто синтаксический сахар для таблиц или нечто глубже
Михаил
синтаксический сахар у меня уже неплохо получается
Михаил
засахарил шо слипнется небось
Михаил
а вм еще не патчил
Михаил
Нельзя просто так взять... и изменить переменную вне стека для текущей функции...
Михаил
да и в чем проблема, когда ссылки можно сделать на сахарных операторах
Михаил
емнип можно
Михаил
и оператор -> можно сделать наподобие в с++, чтобы обращался к полям объекта
Михаил
ну гениально
Михаил
всё, не будет ссылок на уровне VM
Михаил
Михаил
как в шарпе?
Михаил
эквивалент
s and (s.field.action())
UtoECat
Михаил
а как он реализовал? подозреваю что так
1. если nil, то возвращается такая штука которая выдает на любое обращение к полю или оператору саму себя
2. если не nil то вызываем метод
Михаил
Михаил
аааа, он пропатчил nil чтоб он так делал...
UtoECat
Михаил
а как тогда вызывать nil
Михаил
там же определенно будут вызовы nil
Михаил
nil("hello world!")
Михаил
да можно же отдельную таблицу создать и ее возвращать вместо nil
Михаил
так, у меня проблемы с ->
Михаил
a -> b значит что? что a получит значение b, а не строку "b"
Михаил
и индексировать так удобно не получится
Михаил
надо сделать такой механизм, позволяющий получить имя поля при обращении
Михаил
о. я придумал
Михаил
если следующий токен после -> это 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
Михаил
я боюсь что это сильно засрет стек и ограничит количество локальных переменных, в худшем случае - вдвое
Михаил
стой.....
Михаил
Михаил
на одно присваивание может быть только один (ну не совсем один, но как правило) левый операнд
Михаил
а потом это дело очищается..
Михаил
а если это применить и для ?. чтобы заменить его на AND, стек подзасрется посильнее
Михаил
если не AND то будет дикий костыль, ломающий продовые решения...
Михаил
если бы я всего лишь мог заглянуть на несколько токенов вперед
Михаил
можно еще сделать MOV если вдруг регистр до этого остался пустым