Михаил
ладно я спать. цель на завтра - лечь на 4ч раньше
Михаил
всем бобра
UtoECat
Михаил
утра* у тебя сколько?
UtoECat
Hello, World! 🎄
У меня тоже утро +4 от мск
Hello, World! 🎄
Уже скоро обед будет
Luсky
Михаил
кстати я ща понял какие ограничения
Михаил
a.foo, b.foo =~ .foo, .foo не будет работать
Михаил
или надо парсить сразу с момента запятой
Михаил
просто схавать все в одном expr_primary
Михаил
просто сделаю такой оператор только для единичного присваивания, ничего страшного...
Михаил
ну сначала посмотрим че с обычными *. а потом уже на =~ размахнусь
Михаил
[luar]
fn *.(a, b) a[b];
fn __a__LRop_tmul(a, s, d) { a[s] = d; }
foo = {};
foo.bar = 78;
foo*.bar = 900;
print(foo.bar);
вывод: 900
Михаил
Михаил
вторая тоже должна была называться *. но чет не срослось
Михаил
предлагайте как их различать
Михаил
первая для получения (как __index), вторая как __newindex
Михаил
fn newindex *. ?
Михаил
возможно...
Михаил
fn <newindex> *.(obj, index, value) ... Вот идеал
Михаил
а довольно удобно получилось. прямо офигенно. Я думал, будет как какой-то костыль, а теперь можно использовать даже условные операторы в левой части присваивания
Михаил
пример:
obj? *.field = 78;
если obj == nil или false, ничего просто не будет вызвано. а если тру объект, то будет эквивалентно
obj*.field = 78;
Сергей
UtoECat
всё это вроде игнорится в компиляторе в байткод... вроде...
Там отдельной тулзой идёт чекер под это дело.
Сергей
UtoECat
как и у питона
у питона оно потом хотя-бы просто сохраняется в рантайме, а тут нет)
но да ладно
Михаил
как и у питона
питон просто по другому реагирует на тайп хинты.
v: int = ЧортЛысый(); # ok
Михаил
итак я отладил новую версию.. отладка заняла час
local fn operator ~.(obj, field) {
return {__obj = obj, __fld = field}
}
local fn operator<newindex> ~.(obj, field, v) {
obj[field] = v
}
local fn +=(l, r) {
l.__obj[l.__fld] = l.__obj[l.__fld] + r
}
fn main(args)
{
local foo = {};
foo.bar = {};
foo.bar.field = 78;
foo.bar~.field += 90;
print(foo.bar.field);
}
main()
вывод: 168
Михаил
тяжелый медленный синтаксический сахар "оператор замещения", написанный на операторах
Михаил
зато можно вот так делать...
local fn operator ~.(obj, field) {
return {__obj = obj, __fld = field}
}
local fn operator<newindex> ~.(obj, field, v) {
obj[field] = v
}
local fn +=(l, r) {
l.__obj[l.__fld] = l.__obj[l.__fld] + r
return l
}
fn main(args)
{
local foo = {};
foo.bar = {};
foo.bar.field = 78;
foo.bar~.field += 90 += 25 += 98 += 100500;
print(foo.bar.field);
}
main()
вывод: 100791
Михаил
Михаил
мне уже нравится свой язык. скоро залью релиз
Михаил
идеально было бы сделать доку вроде PIL но кажись я не потяну
Михаил
почему то кеды стали считать мою прогу сишной
usernameak
Snusmumriken
Ну и норм.
Михаил
Ну и норм.
я вот так и не смог понять, а почему строки в луа конкатенируются справа налево
Михаил
хз что даст этот пример, но вывод таков:
concatenating: [world!], [ ... wat?]
concatenating: [hello ], [world! ... wat?]
hello world! ... wat?
require "luar";
require "oop";
local cat = class (
fn(self, str) {
self.str = str
}
);
fn cat.src.__concat(self, oth) {
print("concatenating: [" .. self.str .. "], [" .. oth.str .. "]");
return classof(self)(self.str .. oth.str);
}
fn cat.src.__tostring(self) self.str;
fn main(args)
{
local c = cat("hello ");
local w = cat("world!");
local k = cat(" ... wat?");
print(c .. w .. k);
}
main()
Михаил
загадка.
Михаил
Михаил
Михаил
это просто другой ЯП типа как котлин по отн. к жаве
Михаил
ну local забыл заменить на var или другой кейворд, но зачем
Михаил
а хотя.. можно
Михаил
или нет.. пусть пока будет такое
Михаил
Можно еще убрать присваивание глобальной переменной изнутри функции
Михаил
но с этим тоже, думаю, смысла нет - в луа было, значит и здесь пускай будет
Михаил
(улучшенная) защита от коленострелов не цель форка
Михаил
если сделаю let - будет похоже на жаваскрипт буеееее
если var - некоторым тоже жс напомнит, некоторым c#
а в c# var это как auto в с++, здесь скорее object надо
а object слишком длинно для переменной, поэтому local
Михаил
хотя если сделать let - у меня же уже есть fn вместо function, из раста спёр
Михаил
и будет похоже на раст.. тоже не оч
Petr
Михаил
я был готов и сейчас готов
Михаил
но готов к большему
Михаил
релизну и соберу 78 звездочек, и стану популярным
Petr
Главное опыт в Си набрал
Михаил
ну это да... половина это объявления препроцессора, а остальная это использование препроцессора, склеенное сишными операторами
Михаил
но это легче читать чем адский плюсовый код исключительно последнего стандарта
Михаил
самый перелопаченный мною файл это lj_parse.c
Михаил
теперь в нем 3234 строки и 93 килобайта
Михаил
(количество lines of code очень очень близко к 3234)
Petr
Есть и методы с таким количеством строк, например какой-нить рендерер, был бы толк главное
Petr
Я вот тут мучаюсь с ребятами у которых мозг клин кодом поражен. Страшное дело.
Михаил
Главное опыт в Си набрал
и то скорее не опыт в си, а в луажите. мне понравилась реализация парсера. быстрый и от настоящего программиста. а не какое-то говно на regexp'ах
Uni_X
А если человека записать в тетрадь смерти, сможет ли он умереть до указанного в тетради времени и места?
Сергей
почему нет
Uni_X
Но тогда, тетрадь смерти не сработает. Тогда будет не интересно.
Алёша
Uni_X
По логике - нет
Тогда это надо было обузить Кире. Записать себе смерть через миллион лет и не париться)
Алёша
Вот распланировал ты план в котором всё держится на том, что человек Х должен умереть так-то и там-то, а его сбила машина, пока он туда шел... Directed by...
По сути, такого не произойдёт, если указано что чел должен умереть там то и там то и при таких то обстоятельствах, то так оно и будет. Машина, которая в теории могла бы его сбить раньше судьбы, написанной в тетради, проедет мимо, собьёт кого то другого, может вообще где то в дороге сломается и не доедет и тд и тп
Uni_X
Тогда Кира мог стать почти бессмертным...
Uni_X
А... А тетрадь может убивать людей по описанию?
Uni_X
"Мой убийца" должен умереть "Сейчас"