UtoECat
так а что будет если в луа без local f <close> файл оставить? он же тоже не закроется вм-кой. а только при завершении процесса
Когда сборщик мусора надумает файл собрать - закроется. Но суть tobeclosed в том, что они гарантированно закроются при выходе из фрейма луашной функции, по ошибке или return - не важно. Как и при сборке корутины сборщиком - там где надо будет вызван __close
Михаил
ладно я спать. цель на завтра - лечь на 4ч раньше
Михаил
всем бобра
Михаил
утра* у тебя сколько?
Hello, World! 🎄
У меня тоже утро +4 от мск
Hello, World! 🎄
Уже скоро обед будет
Сергей
Я кстати вместо mongodb, redis и т.п выбрал SqlAlchemy
ещё редиску бы прикрутить или мемкешд какой-нибудь, чтобы по 100500 в секунду раз одни и те же данные не дергать из бд
Михаил
кстати я ща понял какие ограничения
Михаил
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;
Сергей
omagad typed lua
UtoECat
omagad typed lua
всё это вроде игнорится в компиляторе в байткод... вроде... Там отдельной тулзой идёт чекер под это дело.
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 но кажись я не потяну
Михаил
почему то кеды стали считать мою прогу сишной
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()
Михаил
загадка.
Михаил
Petr
идеально было бы сделать доку вроде PIL но кажись я не потяну
Это лишнее. Ты же пользоваться можешь, а больше вряд-ли кто-то заинтересуется пока что.
Михаил
это просто другой ЯП типа как котлин по отн. к жаве
Михаил
ну local забыл заменить на var или другой кейворд, но зачем
Михаил
а хотя.. можно
Михаил
или нет.. пусть пока будет такое
Михаил
Можно еще убрать присваивание глобальной переменной изнутри функции
Михаил
но с этим тоже, думаю, смысла нет - в луа было, значит и здесь пускай будет
Михаил
(улучшенная) защита от коленострелов не цель форка
Михаил
если сделаю let - будет похоже на жаваскрипт буеееее если var - некоторым тоже жс напомнит, некоторым c# а в c# var это как auto в с++, здесь скорее object надо а object слишком длинно для переменной, поэтому local
Михаил
хотя если сделать let - у меня же уже есть fn вместо function, из раста спёр
Михаил
и будет похоже на раст.. тоже не оч
Михаил
я был готов и сейчас готов
Михаил
но готов к большему
Михаил
релизну и соберу 78 звездочек, и стану популярным
Petr
Главное опыт в Си набрал
Михаил
ну это да... половина это объявления препроцессора, а остальная это использование препроцессора, склеенное сишными операторами
Михаил
но это легче читать чем адский плюсовый код исключительно последнего стандарта
Михаил
самый перелопаченный мною файл это lj_parse.c
Михаил
теперь в нем 3234 строки и 93 килобайта
Михаил
(количество lines of code очень очень близко к 3234)
Petr
Есть и методы с таким количеством строк, например какой-нить рендерер, был бы толк главное
Petr
Я вот тут мучаюсь с ребятами у которых мозг клин кодом поражен. Страшное дело.
Михаил
Главное опыт в Си набрал
и то скорее не опыт в си, а в луажите. мне понравилась реализация парсера. быстрый и от настоящего программиста. а не какое-то говно на regexp'ах
Uni_X
А если человека записать в тетрадь смерти, сможет ли он умереть до указанного в тетради времени и места?
Сергей
почему нет
Uni_X
Но тогда, тетрадь смерти не сработает. Тогда будет не интересно.
Uni_X
Но тогда, тетрадь смерти не сработает. Тогда будет не интересно.
Вот распланировал ты план в котором всё держится на том, что человек Х должен умереть так-то и там-то, а его сбила машина, пока он туда шел... Directed by...
Uni_X
По логике - нет
Тогда это надо было обузить Кире. Записать себе смерть через миллион лет и не париться)
Алёша
Вот распланировал ты план в котором всё держится на том, что человек Х должен умереть так-то и там-то, а его сбила машина, пока он туда шел... Directed by...
По сути, такого не произойдёт, если указано что чел должен умереть там то и там то и при таких то обстоятельствах, то так оно и будет. Машина, которая в теории могла бы его сбить раньше судьбы, написанной в тетради, проедет мимо, собьёт кого то другого, может вообще где то в дороге сломается и не доедет и тд и тп
Uni_X
Тогда Кира мог стать почти бессмертным...
Алёша
Тогда это надо было обузить Кире. Записать себе смерть через миллион лет и не париться)
Ммм, так не работает. Насколько я помню, один обладатель тетради не в силах убить другого. А тк ты являешься обладателем, то и убить себя с её помощью ты не в состоянии
Uni_X
А... А тетрадь может убивать людей по описанию?
Uni_X
"Мой убийца" должен умереть "Сейчас"