Михаил
меньше скобочек, быстрее кодинг
Михаил
но шибко сложно сразу классом делать
Михаил
и немного противоречит философии, я такое не люблю - тривиальное выражение сразу инстанс какого-то класса, это уж точно из питона и жс
Михаил
лучше четко писать что-то вроде List [ ... ]
Михаил
или ты предлагаешь сделать __call методом массивов?
Михаил
чтобы сразу for k,v in arr do пошло поехало
Михаил
чуваки, тут случился кек
Михаил
я обнаружил, что теперь функции с одним аргументом можно вызывать наоборот
Михаил
("Hello World!")print;
Михаил
UtoECat
Михаил
Но зачем?
это побочка от унарных операторов
Михаил
убирать или нет?
Михаил
да пофиг оставлю как есть
Михаил
и я пока твердо решил не делать индексацию с нуля и прочее
Михаил
наверно верну строки [[ ]] как было
Михаил
Или предлагайте куда девать [[1, 2], 3]
Михаил
может [[ сделать атрибутами ]] ?
Михаил
[//[ однозначно остаются комментариями
Михаил
Михаил
[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]
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(...)};
Михаил
покодил еще операторы и нашел кучу мелких ошибок и идей для улучшения
[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
обижаешь
) ну ведь правда оно жеж не ускорит особо сильно разработку... игры? что ты делаешь?
ещё и будешь пытаться намеренно новые фичи пропихнуть везде где можно и нельзя) и читать потом что написал не сможешь))
Михаил
так я здесь и занимаюсь обсуждением того, как сделать,чтобы после введенных фич язык остался читаемым))
UtoECat
а зачем я это все делаю
не, много чего интересного делаешь. Но надо установить себе лимит. А то так всю луашку перелопатишь)
Михаил
не просто ж так пишу типа заметки в мой дневник)
Михаил
Михаил
я еще хотел ссылки добавить
Михаил
а то немножечко кастрированный язык, нельзя взять ссылку на число и изменить
Михаил
прямо как в питоне
Михаил
кстааа
Михаил
если кто не видел, вот моя репа с расширениями питона. правда сам интерпретатор я не изменял, это просто модуль github.com/reglnk/llpy
Михаил
Позволяющий... изменять... неизменяемые кортежи. badum tss
Михаил
ну и прочее
Михаил
но это костыль честно говоря, и работает на (возможно единственной) одной версии одного интерпретатора пихтона
Михаил
И это просто работает.. за счет того что тогда пихтон не был оптимизирован, ну практически как мой дерьмоязык за 2 месяца или скок я там его писал
Михаил
правда мой тот язык еще в 5 раз медленнее питона,ну да ладно
Михаил
ну так вот, я не остановлюсь на операторах..
Михаил
а вдруг ссылки... будет несложно добавить? хотя бы на локальные переменные. они хранятся в "регистрах", вот берешь адрес этого регистра и записываешь... а потом по нему изменяешь. звучит просто
Михаил
ссылку на глобальную вообще можно легко и просто записать
Михаил
или не надо записывать. взял и изменил
UtoECat
Михаил
Михаил
нужен более низкоуровневый метод
Михаил
Михаил
я вообще неоч разбираюсь в upvalue
Михаил
Михаил
пускай тут luarjit будет ссылаться на мой форк...
Михаил
и они сами создаются когда например записываешь новую функцию с локальной переменной извне, и эту функцию передаешь
Михаил
но чтобы вручную их создавать..
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
Михаил
сравни
int f = 0;
int &ref = f;
ref = 12;