UtoECat
ну, shared_ptr
Это refcounter. Даже два : weak и strong
Михаил
UtoECat
его можно реализовать на япе так что он выглядит как gc
Ну хз хз... Я как о gc слышу, так сразу проблемы многопотока и stop-the-world в голове... (А так-же то, как определить когда объект действительно будет уничтожен) Поэтому я так его не вижу)
UtoECat
его можно реализовать на япе так что он выглядит как gc
И там помоему есть требование о возможности конвертации из shared_ptr в unique_ptr без копирования, если только одна ссылка на shared_ptr, поэтому нет, нельзя одним лишь gc)
Михаил
там в многопотоке все пашет и с GC
UtoECat
так я и говорю - стащить модель из .NET или жавы
Ну там gc супер комплексный. И stop-the-world в каком-то варианте всё равно есть. В микро варианте, но всё равно ощутимо может быть
Михаил
ясно
Михаил
опять своё выдумывать
UtoECat
Ну там gc супер комплексный. И stop-the-world в каком-то варианте всё равно есть. В микро варианте, но всё равно ощутимо может быть
Есть ситуации, когда и shared_ptr неприменимы, tbh) Поэтому... Да... Я вообще сейчас в свободное время модель zig по работе с объектами пытаюсь в плюсы затащить) все классы POD, явная деинициализация через defer... Посмотрим, что получится)))
UtoECat
опять своё выдумывать
Там нечего выдумывать. Просто на всех стульях не получится усидеть, и всё тут)
Михаил
я наверно рассказывал уже здесь об идее, что общая память - не обязательно память непосредственно GC
Михаил
и опа - общий указатель
Михаил
мьютексы, все дела - и вот тебе объект общий для 2х независимых настоящих луашных потоков
UtoECat
и опа - общий указатель
Можно. Хотя и с нюансами.
Михаил
канеш с нюансами
Михаил
и тем более смотри
Михаил
вряд ли тебе понадобится что-то тяжелое, если это нельзя запихнуть в FFI
Михаил
это или моделька какая-нибудь для opengl, или текстура, или файл какой-то
Михаил
так что вполне кмк хорошее решение
Михаил
Можно. Хотя и с нюансами.
и мне нужны тестировщики которые посмотрят на яп и скажут чё говно а что нет всё что там есть - я выдумал в одну каску
Михаил
документация есть уже на англ, кусочек
UtoECat
так что вполне кмк хорошее решение
Явное управление памятью таких расшареных объектов правда) а так да, давно уже делают похожее. Даже дока луаджита по ффи где-то это упоминала помню.
Михаил
документация есть уже на англ, кусочек
кода пока особо нету но я его как раз пишу
Михаил
luarlibs
Михаил
там включена еще библиотека рантайм типов....
Михаил
UtoECat
Ну тут как получится... Языки, в целом, трудно объективно оценивать...
За исключением отдельных выдающихся случаев...
Михаил
вот так сейчас выглядит строчка "юзинг неймспейс бла бла"
Михаил
setfenv(1, namespace.use(getfenv(), ns));
Михаил
я уже вижу способ завернуть это в сахар но зачем хз
Михаил
могут быть решения получше
Михаил
А что они дают-то?
например жысоны перекладываешь
Михаил
и определяешь структуру жысона
Михаил
и по этой структуре валидируешь
UtoECat
могут быть решения получше
Слушай... Ну может всё-таки оставить операторов необходимость явно объявлять какие именно испольжуются они в конкретном модуле... Раз они тупо в вызов метода трансформируются и не более...
Михаил
я примерно об этом кажется и сказал
UtoECat
https://t.me/ProLuaSnooze/43428
Ну да, и забить на этот namespace.use()
UtoECat
А то это страшный комар какой-то...
Михаил
Ну да, и забить на этот namespace.use()
https://t.me/ProLuaSnooze/43431 ))))))))))))))
Михаил
дошла мысля
Михаил
как-то так получается
Михаил
щас я еще проверю что делает setfenv с require
Михаил
а неплохо он делает. даже внутри using namespace если либу подключать ее глобальные переменные никуда не теряются
Михаил
а определенные непосредственно в модуле в глобальный неймспейс не суются
Михаил
вообще имба, оставляю эту либу
Михаил
Михаил
barka.luar local namespace = require "luar/namespace"; local ns = {bar = print}; setfenv(1, namespace.use(getfenv(), ns)); require "kurwa"; kurwa2 = fn() {}; bar("kurwa:", kurwa);
UtoECat
вообще имба, оставляю эту либу
штош, мы пытались тебя отговорить...
Михаил
а что страшного если она работает?
Михаил
причем как задумано
Михаил
это же гениально, это просто шедевр
Михаил
да и setfenv() должен просто устанавливать окружение, а из документации ясно что окружение и так у каждой функции есть
Михаил
это как lookup of keys in __index
UtoECat
да и setfenv() должен просто устанавливать окружение, а из документации ясно что окружение и так у каждой функции есть
Это для дебага функционал... Как-никак... Мне кажется, что есть кейсы, где это может теоретически навернуться... namespace.use этот вот
UtoECat
Но у меня голова уже не варит совсем) пойду отдыхать
Михаил
но в дебаге отдельная функция
UtoECat
но в дебаге отдельная функция
Да, это в новой луашке, больше 5.1. До этого они были в _G
Михаил
а теперь тут _ENV
UtoECat
печально
Не, на самом деле может и можно, но очень осторожно
Михаил
и что _ENV уже не только для дебага?
Михаил
надо бенчмарки сделать
UtoECat
и что _ENV уже не только для дебага?
Им нельзя поломать другие функции. Только перед определением их и с другими нюансами.
Михаил
а, то есть меня ограничивают только санитары нежелающие чтоб я ногу отстрелил
Михаил
но не скорость
UtoECat
надо бенчмарки сделать
В твоём случае в новой луашке всё бы решилось переопределением local _ENV в начале, да.
Михаил
хм но у меня не новая луашка а луажит
UtoECat
а, то есть меня ограничивают только санитары нежелающие чтоб я ногу отстрелил
Jit может негодовать от нетривиального метаметода __index на env функции, но это только спекуляция.
Михаил
да это и так глобальные переменные...
Михаил
вот код на засыпку - реализация неймспейсов... local iter = require "luar/iterator"; local namespace = {}; local upper = {}; namespace.upper = upper; local operator<index> ~. = rawget; local operator<newindex> ~. = rawset; fn namespace.use(env, ns) { ns =~ or {}; if (rawget(env, upper)) { for k, v in pairs(ns) do env[k] = v; return env; } local newtab = {[upper] = env}; newtab._G = newtab; for k, v in pairs(ns) do { newtab[k] = v; } setmetatable(newtab, { __index = fn(self, k) { return rawget(self, k) or rawget(self, upper)~.(k); }, __pairs = fn(self) { // @todo not loop local tbls = {env}; local i = 1; while tbls[i]~.(upper) do { tbls[i + 1] = tbls[i]~.(upper); i = i + 1; } tbls.n = 0; return iter.mulnext, tbls; } }); return newtab; } return namespace;
Михаил
нет, циклы таки придется сделать, т.к. юзинг неймспейс может быть и внутри функции
Михаил
но зачем? а главное - ...
Михаил