Snusmumriken
Кстати, в примере 2 (да и в первом) — оно не сработает. Определяй local function b() до того как её используешь.
Andrey
а разве в луа нет сначала прохода по функциям а потом по коду ?
Dika
имей ввиду, что во втором случае создается замыкание с локальными переменными внутри a
Andrey
Andrey
понял. главное что бы оно ее не запускало без надобности :)
Snusmumriken
Фактически, единственное где стоит использовать функции-в-функциях — там, где нужны какие-то upvalue.
Ну например:
local function replace(str, t_rep)
local function rep(c) return t_rep[c] or c end
return str:gsub('%%(%w+)%%', rep)
end
Ну и на выходе получать примерно:
local template = 'Hello %username%, you are in %place%!'
print(replace(template, {username = 'Snus', place = 'weird chat'}))
Ну ты понял, за один gsub заменили всё что можно, используя для gsub — функцию, использующую таблицу замен в upvalue.
Вне той функции определять нельзя, потому что потеряется upvalue.
Snusmumriken
А, и ещё итераторы, но там те же причины — использование upvalue.
Saphire
Фактически, единственное где стоит использовать функции-в-функциях — там, где нужны какие-то upvalue.
Ну например:
local function replace(str, t_rep)
local function rep(c) return t_rep[c] or c end
return str:gsub('%%(%w+)%%', rep)
end
Ну и на выходе получать примерно:
local template = 'Hello %username%, you are in %place%!'
print(replace(template, {username = 'Snus', place = 'weird chat'}))
Ну ты понял, за один gsub заменили всё что можно, используя для gsub — функцию, использующую таблицу замен в upvalue.
Вне той функции определять нельзя, потому что потеряется upvalue.
Создаём шарп за 3 дня..
Snusmumriken
Anonymous
Почему вы думаете, что функция будет создаваться при каждом вызове? Вл всех нормальных языках локальные функции предусмотрены и работают без просадки производительности
Anonymous
Даже если это замыкания
Anonymous
Помню как то писал компилятор для схемы в х86
Anonymous
Там всегда проходил по всем функциям, в т.ч. локальным и лямбдам и пушил их в глобавльный 'неймспейс'
Anonymous
Никакой просадки
Snusmumriken
Тут разница как между
for i = 1, #list do ... end и
for i, v in ipairs(list) do ... end
Ну, почти.
Snusmumriken
Кстати, пардон, но ты писал компилятор. Луа — интерпретирует, если что, она не знает "что там будет дальше", не может предсказывать будущее.
Anonymous
Ты когда реквайришь файл, оно же видит все локальные функции
Anonymous
Проще конечно в тексте интерпретатора посмотреть
Snusmumriken
Попробуй исполнить такой скрипт:
local function foo()
return bar()
end
local function bar()
return 5
end
print(foo())
И скажи, почему он реагирует именно так а не иначе.
А потом добавь перед объявлением foo — local bar, и убрери local у объявления функции bar.
Anonymous
Понятно
Snusmumriken
Даже луажыт — всё равно мало оптимизирует, он, в основном, собирает трассу. Оптимизации там идут, в основном, по поиску скоупов, он такой видит трассу, и исключает из неё элементы поиска всякой фигни в разных скоупах, сразу переходя к тому что находил в последний раз.
Anatoliy
Ребята всем привет, а подскажите, мне вот стало интересно но я ещё чайниковат в этом, скажем у некоторой проги из винды есть свои dll библиотечки которые она использует в своей работе, никакой документации по ним нет, возможно ли как то узнать все функции используемые в этих библиотечках чтобы потом подключить их в своём луа скрипте через require и юзать их непосредственно в скрипте, без этой программы
Snusmumriken
Можно. Через документацию к библиотеке.
Подключать — только через ffi/alien, так просто луа не умеет дёргать dll-функции библиотек, написанных _не для неё_.
Snusmumriken
Сами имена функций — можно узнать если открыть дллку хекс-редактором, а вот аргументы к этим функциям — так просто не узнаешь. Особенно если они требуют каких-то структур.
Лучше напиши длл-библиотеку-враппер, который берёт содержимое той библиотеки и переводит в луа-варимый вид.
fgntfg
Snusmumriken
Snusmumriken
Это вызывает привыкание
fgntfg
fgntfg
Тернарки потом дебажить тяжело
fgntfg
Хуже только регэкспы
Snusmumriken
Да не, короткие регекспы — норм. Тут, как и во всём остальном, сильно помогает упрощение и форматирование. Например:
local v = a and b and a + b
or a and a + 10
or 10
Если отформатировать так чтобы всё было на виду — просто и разобраться.
Аналогично и с регекспами, только лучше подать закомментированный пример, типа:
-- "(word).12345.(54321)"
local a, b = str:match('(%w+)%.%d+%.(%d+)')
Ну ты понел. Форматирование, комментарии и все прочие способы сделать то что нужно понятным. Чем короче и доходчивее — тем лучше.
fgntfg
Жизнь слишком коротка чтобы писать комментарии
Snusmumriken
Жизнь слишком короткая чтобы писать.
Жизнь слишком короткая.
Жизнь слишком.
Ж.
Lucky
Программисты делятся на тех, кто пишет комментарии и тех, кто теперь пишет комментарии.
Dika
Lucky
А кто не пишет комментарии, помните - ребята из саппорта очень крепкие и знают, где вы живёте.
Anatoliy
Ребяты всем привет, подскажите в чем может быть проблема - пытаюсь установить luacurl для винды из luarocks, командой luarocks install luacurl, установка luacurl требует наличия libcurl, скачал libcurl отсюда https://curl.haxx.se/libcurl/ для винды 64-бит, luarocks install luacurl при установке ищет файлики libcurl - curl.h и прочие там где компилятор, или же по пути указанному в системной переменной CURL_DIR, я закинул папки из скачанного архива libcurl - lib, include, bin, внутрь папки с компилятором mingw - c:\mingw все норм при запуске luarocks install luacurl теперь все находит и начинает компилиться но тут фэйл
Anatoliy
Anatoliy
Anatoliy
Snusmumriken
Кто бы мог подумать
Snusmumriken
Посмотри на первую строчку вывода компилятора, первого скриншота.
Что там написано?
Saphire
Пути он неправильно указал
Saphire
Слеш не тот..
Snusmumriken
Тоже может быть. Но меня больше напрягает mingw32.
Если собирается с 64-битными lib-ами — не удивительно.
Snusmumriken
Да, на слеши под вендой должно быть пофигу, вроде.
Snusmumriken
Ребяты всем привет, подскажите в чем может быть проблема - пытаюсь установить luacurl для винды из luarocks, командой luarocks install luacurl, установка luacurl требует наличия libcurl, скачал libcurl отсюда https://curl.haxx.se/libcurl/ для винды 64-бит, luarocks install luacurl при установке ищет файлики libcurl - curl.h и прочие там где компилятор, или же по пути указанному в системной переменной CURL_DIR, я закинул папки из скачанного архива libcurl - lib, include, bin, внутрь папки с компилятором mingw - c:\mingw все норм при запуске luarocks install luacurl теперь все находит и начинает компилиться но тут фэйл
Слушай, скажи мне пожалуйста, где ты собрался использовать libcurl?
В чистом интерпретаторе или в какой-то софтине, где используются луа-скрипты?
Ты можешь выбирать интерпретатор? Просто я бы на твоём месте взял готовую сборку бинарей, типа https://github.com/rjpcomputing/luaforwindows, и не морочился бы.
mva
Ребяты всем привет, подскажите в чем может быть проблема - пытаюсь установить luacurl для винды из luarocks, командой luarocks install luacurl, установка luacurl требует наличия libcurl, скачал libcurl отсюда https://curl.haxx.se/libcurl/ для винды 64-бит, luarocks install luacurl при установке ищет файлики libcurl - curl.h и прочие там где компилятор, или же по пути указанному в системной переменной CURL_DIR, я закинул папки из скачанного архива libcurl - lib, include, bin, внутрь папки с компилятором mingw - c:\mingw все норм при запуске luarocks install luacurl теперь все находит и начинает компилиться но тут фэйл
А почему luacurl, а не Lua-cURL?
mva
А. На скриншоте-то правильно
Anatoliy
А почему luacurl, а не Lua-cURL?
Да на скриншоте как раз правильно - lua-curl, это я потом еще и luacurl попробовал, но lua-curl уже получилось установить - скачал libcurl для винды 32 бит закинул в папку с mingw и все скомпилировалось без ошибок, а вот luacurl что с 32 бит что с 64 бит libcurl выдает все время ошибку
Anatoliy
Anatoliy
Кто бы мог подумать
" я бы на твоём месте взял готовую сборку бинарей, типа " - сборка вроде только под lua 5.1, а если из неё libcurl.dll взять и потом в луа 5.1 юзать, пойдет?
Snusmumriken
Ага. Если разрядность норм
Snusmumriken
Наверное. Но проверь _разрядность_
Saphire
Uhh
Saphire
У тебя библиотека сама не прилинковалась
Snusmumriken
Луарокс не умеет читать мысли, вдруг ты собрался линковать конкретную версию конкретной библиотеки, которая у тебя лучше всего идёт. Да и откуда он просто так возьмёт эту статическую библиотеку (.lib)? Из интернета скачает?
Anatoliy
я ничего не собрался, на сайте https://luarocks.org/modules/luarocks/luacurl сказано - ввести luarocks install luacurl для установки и все, больше ничего не сказано
Snusmumriken
С биндингами всегда так. Эх.
Snusmumriken
Ну там инструкции для линуксов. Под линуксами либы в конкретных местах лежат, а под виндовсами надо ещё пути писать.
Anatoliy
И какие мне пути написать?
Snusmumriken
Ты компилировал когда-нибудь что-нибудь сам, руками?
Знаешь что такое .h и .c файлы, зачем нужны .lib и чем они отличаются от .dll(.so)?
Snusmumriken
Мне проще дать тебе учебник по сишке, просто. Это должно быть продуктивнее. Без понимания, это выглядит как "сделайте всё за меня".
Snusmumriken
Кстати, ты своровал бинарь либы в luaforwindows? Попробовал подцепить?
Snusmumriken
Ты попробовал? Получилось?
Anatoliy
Нет еще
Snusmumriken
А почему?
Snusmumriken
Тебе что нужнее, решить проблему или компилировать?
Anatoliy
Ну просто скомпиленная либа она вроде как самая новая будет, lua-curl и libcurl самые последние, а тот бинарь из luaforwindows он вроде как староватый уже
Snusmumriken
В чём разница? Скажи мне конкретные пункты, которые тебе нужны из "новой версии". Ну там, поддержка какого-то протокола, или ещё что. Которые отсутствуют в версии от luaforwindows.