Antontsue
еще хотел спросить как реквайры работают?
Antontsue
они просто код встраивают?
Snusmumriken
Почти. main.lua: module = require'module' print(module.foo()) --> 'bar' module.lua: return {foo = function() return 'bar' end}
Antontsue
а стражи включения какието есть?
Antontsue
чтобы небыло дублекатов и рекурсивных включений
Tverd
дубликатов не будет если ты делаешь require 'module'
Tverd
Он выполняется и прописывается в package, при повторном require берется оттуда
Tverd
насчет рекурсии не помню, походу просто вываливается в ошибку
Antontsue
я модули руками гружу сам
Tverd
интересно, для чего это?
Antontsue
на разных платформах лучше разными методами читать
Tverd
ага, понятно, прикольно
Antontsue
на иосе сендбокс, там надо посылать полный путь
Antontsue
а на винде например лучше относительный - потмоучто если в имени папки будет кириллица то может не найти
Snusmumriken
Если грузишь руками - можешь сделать свой require: local cache = {} function load(path) if cache[path] then return cache[path] end local file = io.open(path) cache[path] = loadstring(file:read'*all')() file:close() return cache[path] end
Antontsue
да там уже все сделано
Antontsue
там смысл был подключиться к файлменеджеру общему
Antontsue
это проще из с++ сделать чем его биндить в луа
Snusmumriken
Оки. Просто с подобной штукой можно баловаться по прямым/относительным путям.
Snusmumriken
Кстати, require умеет грузить dll/so-либы.
Antontsue
на иосе это запрещено)
Snusmumriken
Есть еще функция dofile, но она не кеширует и грузит только lua-код. И работает с абсолютными путями. Что с айосом? Все можно же, я проверял.
Antontsue
нельзя выкладывать код который может самомодифицироваться, в обход аппстора
Snusmumriken
Как so-библиотеки самомодифицируются?
Antontsue
это не технической орагничение а пункт в девелопер лисенс агридмент
Snusmumriken
Это же бинари.
Antontsue
ну ты их типа можешь закачать и загрузить другую
Antontsue
тоесть линковать можно только статически
Antontsue
не динмаически
Snusmumriken
Ну, просто тогда стоит запретить вообще все библиотеки.
Antontsue
ну так и есть)
Snusmumriken
Ох. Луа-код вообще стрёмный. Я делал загрузчик кода с сайта. Ну, как обычный require, только забирает модуль с гитхаба-пастбина.
Snusmumriken
И это без библиотек кроме сокетов.
Snusmumriken
Но и сокеты не нужны, ведь есть os.execute
Snusmumriken
А на тему so-либ - это и правда очень странно.
Snusmumriken
Я раскапывал кучу сурцов игр на айос, и там есть динамические либы.
Antontsue
они все были подключены на момент компиляции
Antontsue
ты можешь например сделать #include "dlfcn.h" и вызвать dlopen чтобы загрущить чтото но вот уже выгрузить через dlclose нельзя
Snusmumriken
Это да. Офигеть. Кошмар.
Antontsue
но даже если ты dlopen сделаешь то скорее всего тебя реджектнут при ревьюве
Antontsue
тоесть допускается только линковка средставами хкода
Snusmumriken
Я просто все подключаю к лав2д динамически, чтобы ядро не пересобрать. И еще FFI использую, для подключения библиотек, которые не предназначены для встраивания в луа.
Snusmumriken
Теперь понятно что путь на айос мне заказан :3
Antontsue
это ты сверху смотришь
Antontsue
а под капотом стандартные иосо-вещи
Antontsue
нет почему - если тебе в рунтайме не надо либы переключать то можно собрать и туда
Snusmumriken
У меня в рунтайме подключается вообще всё.
Antontsue
неа
Antontsue
просто укажешь в билд конфиге что подключить вот эти либы. в коде у себя обмажешь #ifnef PLATFORM_IOS
Snusmumriken
Примерно так: https://github.com/britzl/steamworks-ffi/blob/master/steamworks/steamworks.lua
Snusmumriken
Ты не понял, я особо не пишу на плюсах, только крошечные библиотеки, которые потом подгребаются луями. Весь код игр - на луа, за исключением фреймворка, который я не хотел бы пересобирать. И сторонние библиотеки я тоже загребаю луями. Все. Динамически. Даже те которые не предназначены для загребания.
Antontsue
ну ктото же пишет вам энвайр, это его задача будет обеспечить доступность этих либ
Antontsue
юнити так и работает
Antontsue
там тоже все на пакетах построено
Antontsue
просто под иос все сразу зашивается в билд
Snusmumriken
Кароч, я и так думал что не буду особо писать на айос, теперь уверен больше. Да, конечно, я пишу жутко опасные игрушки, которые динамически грузят либы, все методы в которых приводят к sendAllDataFromPhone(bad_guy_ip, 666) И sudo rm -rf
Snusmumriken
Ну ладно. А ты чего на иос пишешь? :3
Snusmumriken
Типа, расширяем ца до максимума?
Antontsue
я пишу в основном всякие приложения а игру так для души делаю
Snusmumriken
Ладысь :3 Если приспичит писать на иос, заюзаю юнити тогда. Хоть шарп и избыточен чудовищно, там удобный бридж в луа. Вывешиваем все методы двигла в луа и пишем на луа.
Tverd
кокос как вариант
B
а в луне имеет место перегрузка функций?
Snusmumriken
List = {} List.__index = List function List:new(t) return setmetatable(t, self) end function List:__add(other) local t = List() for i, v in ipairs(self) do table.insert(t, v) end for i, v in ipairs(other) do table.insert(t, v) end end a = List{0, 1, 2, 3, 4} b = List{5, 6, 7, 8, 9} c = a + b print(table.concat(c)) > 0123456789 d = b + a print(table.concat(c)) > 5678901234
Anonymous
это перегрузка операций, а не функций
Snusmumriken
Хм. local oldprint = print function print(...) oldprint('Yoyoyo!', ...) end
Anonymous
а это переопределение
B
foo() foo(string) foo(int, string) и тд
Snusmumriken
Ты хочешь функцию, которая в зависимости от аргументов подставляет другую функцию? Такое бывает только при статической типизации.
B
одну но которая работает в зависимости от аргументов по своем
Anonymous
if же
B
ну можно, но просто интересно можт есть воможности перегрузки
Snusmumriken
Ок. function foo(a, b, c) if type('a') == 'string' then if b then return a..b else return a + b end end
Snusmumriken
Ну, карочи проверка на твоей совести.
B
тогда ужи через таблицу если будет много всего и разного и там уже проверять как то в зависимости от личной извращености
Snusmumriken
Во https://pastebin.com/i7qC1aKn
Snusmumriken
Тут не самое оптимальное с точки зрения самокопирования, но самое быстрое в плане производительности.
Anonymous
делай так: fn func(a) if string then doString(a) if integer then doInt(a) ...
Snusmumriken
function mt.__mul(a, b) a, b = switchVec(a, b) return isVec(b) and vector(a.x*b.x, a.y*b.y) or isNum(b) and vector(a.x*b, a.y*b) or error('Vector: two vectors or vector and scalar expected, got vector and '..type(b), lvl) end
Antontsue
Antontsue
и у этого объекта сделать несколкьо наследников в зависимости от набора параметров