Михаил
меньше скобочек,‌ быстрее кодинг
Михаил
Кароч, есть прекол. Если делать массивы через [], то им можно смело добавлять методы.
а,‌ ну хотя да, я так и собирался - [] будут инстансом встроенного какого-нибудь класса
Михаил
но шибко сложно сразу классом делать
Михаил
и немного противоречит философии,‌ я такое не люблю - тривиальное выражение сразу инстанс какого-то класса, это уж точно из питона и жс
Михаил
лучше четко писать что-то вроде List [ ... ]
Михаил
или ты предлагаешь сделать __call методом массивов?
Михаил
чтобы сразу for k,v in arr do пошло поехало
Михаил
чуваки, тут случился кек
Михаил
я обнаружил, что теперь функции с одним аргументом можно вызывать наоборот
Михаил
("Hello World!")print;
Михаил
Михаил
Но зачем?
это побочка от унарных операторов
Михаил
убирать или нет?
Михаил
да пофиг оставлю как есть
Михаил
и я пока твердо решил не делать индексацию с нуля и прочее
Михаил
наверно верну строки [[ ]] как было
Михаил
Или предлагайте куда девать [[1, 2], 3]
Михаил
может [[ сделать атрибутами ]] ?
Михаил
[//[ однозначно остаются комментариями
UtoECat
может [[ сделать атрибутами ]] ?
Атрибуты в lua5.4 только пошли. Зачем они тебе?
Михаил
[luar] let fn make_class(...) { let args = {...}; if (#args == 0) error("missing table"); let mt = {}; for i, v in args ipairs do { let src = (i == #args) and v or getmetatable(v); for k, vv in src pairs do if (k == 1 and vv == src); else mt[k] = vv; } if (!mt.__index) mt.__index = mt; let init = mt[1] or fn(); let template = {} setmetatable { __call = fn(_, ...) { let inst = {}; setmetatable(inst, mt); init(inst, ...); return inst; }, __concat = fn(self, other) { return make_class(self, other); }, __metatable = mt }; mt.template = template; return template; }; return {} setmetatable {__call = fn(_, ...) make_class(...)};
Михаил
примерно так будет выглядеть либа для классов
Михаил
ОГО там появились const и close
Михаил
close это как раз то что я хотел
Михаил
а я кажись могу сюда ввести close =))
Михаил
осталось только почитать как они там реализованы
Михаил
покодил еще операторы и нашел кучу мелких ошибок и идей для улучшения [luar] fn &&(l, r) l and r; fn ||(l, r) l or r; // user-defined functions fn +=(l, r) l: +=(r); fn -=(l, r) l: -=(r); fn ^=(l, r) l: ^=(r); fn &=(l, r) l: &=(r); fn |=(l, r) l: |=(r); // fn %=(l, r) l: %=(r); // todo: fix % fn =>(l, r) r(unpack(l)); // todo: fix r(l unpack) fn |>(l, r) r(l); fn of(l, r) l(r); local bit = "bit" require; // todo: function require should be patched somewhere // todo: fix single-token operators | & ||| = bit.bor; &&& = bit.band; ^^ = bit.bxor; // todo: make ^ xor instead of pow, make pow a keyword !! = bit.bnot; <=> = bit.bswap; << = bit.lshift; >> = bit.rshift; ->> = bit.arshift; |<< = bit.rol; |>> = bit.ror; // todo: fix {} and numbers as a statement beginning // ({2 <<| 9} => print);
Михаил
и да,‌ теперь здесь будет больше битовых операторов, именно операторов,‌ чем в с++ хоть порядок кастомных операторов будет всегда справа налево,‌ но думаю о нем никто не парится и всегда пишут в скобках
Михаил
больше всего сомнений вызывает вот такой синтаксис something print;
Михаил
кажись надо запретить вызывать функции двумя нехорошими словами и разрешить только для операторов,‌ чтоб те были унарными
Михаил
это конечно повлияет на r(l unpack) но сперва это повлияет на foo(bar ++)
Михаил
я имею ввиду,‌ щас если унарный оператор встречает скобку то получается ошибка вместо простого завершения оператора
Михаил
много работы.
Михаил
обижаешь
Михаил
а зачем я это все делаю
Михаил
UtoECat
обижаешь
) ну ведь правда оно жеж не ускорит особо сильно разработку... игры? что ты делаешь? ещё и будешь пытаться намеренно новые фичи пропихнуть везде где можно и нельзя) и читать потом что написал не сможешь))
Михаил
так я здесь и занимаюсь обсуждением того, как сделать,‌чтобы после введенных фич язык остался читаемым))
UtoECat
а зачем я это все делаю
не, много чего интересного делаешь. Но надо установить себе лимит. А то так всю луашку перелопатишь)
Михаил
не просто ж так пишу типа заметки в мой дневник)
Михаил
я еще хотел ссылки добавить
Михаил
а то немножечко кастрированный язык,‌ нельзя взять ссылку на число и изменить
Михаил
прямо как в питоне
Михаил
кстааа
Михаил
если кто не видел,‌ вот моя репа с расширениями питона. правда сам интерпретатор я не изменял,‌ это просто модуль github.com/reglnk/llpy
Михаил
Позволяющий... изменять... неизменяемые кортежи. badum tss
Михаил
ну и прочее
Михаил
но это костыль честно говоря,‌ и работает на (возможно единственной) одной версии одного интерпретатора пихтона
Михаил
И‌ это просто работает.. за счет того что тогда пихтон не был оптимизирован,‌ ну практически как мой дерьмоязык за 2 месяца или скок я там его писал
Михаил
правда мой тот язык еще в 5 раз медленнее питона,‌ну да ладно
Михаил
ну так вот,‌ я не остановлюсь на операторах..
Михаил
а вдруг ссылки... будет несложно добавить?‌ хотя бы на локальные переменные. они хранятся в "регистрах",‌ вот берешь адрес этого регистра и записываешь... а потом по нему изменяешь. звучит просто
Михаил
ссылку на глобальную вообще можно легко и просто записать
Михаил
или не надо записывать. взял и изменил
UtoECat
так я здесь и занимаюсь обсуждением того, как сделать,‌чтобы после введенных фич язык остался читаемым))
ну так что там было... операторы присаивания и какой-нибудь nil-условный оператор (отсутствие которого заставило снуса устанавливать на nil метатаблицы 😁) этого уже достаточно чтобы сделать синтаксис луашки чуть лучше.
UtoECat
bloated костыль
ну тогда созадвай юезрдату с upvalue user values
Михаил
нужен более низкоуровневый метод
Михаил
я вообще неоч разбираюсь в upvalue
Михаил
пускай тут luarjit будет ссылаться на мой форк...
Михаил
я вообще неоч разбираюсь в upvalue
наскок я щас понимаю это замыкание,‌ и это удобно
Михаил
и они сами создаются когда например записываешь новую функцию с локальной переменной извне,‌ и эту функцию передаешь
Михаил
но чтобы вручную их создавать..
UtoECat
я вообще неоч разбираюсь в upvalue
почитай, будет интересно. а пока приведу кода из REPL > function make() local v = 0 local function set(i) v = i end local function get() return v end return get, set end > get, set = make() > set(1) > return get() 1 > set(2) > return get() 2 >
Михаил
фича афигенная
Михаил
но увы. лишний синтаксис
UtoECat
ну тогда созадвай юезрдату с upvalue user values
а это не сработает в luajit и lua 5.1, упс... тогда только таблицей)
UtoECat
но увы. лишний синтаксис
что лишнего-то? 😁
Михаил
сравни int f = 0; int &ref = f; ref = 12;