Snusmumriken
Кстати, в примере 2 (да и в первом) — оно не сработает. Определяй local function b() до того как её используешь.
Andrey
а разве в луа нет сначала прохода по функциям а потом по коду ?
Dika
имей ввиду, что во втором случае создается замыкание с локальными переменными внутри a
Dika
т.е. b будет видеть все что относится к a
local function a() local cc = 3 local function b() print(cc) end b() end здесь a выведет 3, то есть b видит cc.
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.
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
Ты когда реквайришь файл, оно же видит все локальные функции
.. Которые были объявлены до того момента, как код начал что-то исполнять.
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
Сами имена функций — можно узнать если открыть дллку хекс-редактором, а вот аргументы к этим функциям — так просто не узнаешь. Особенно если они требуют каких-то структур. Лучше напиши длл-библиотеку-враппер, который берёт содержимое той библиотеки и переводит в луа-варимый вид.
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
Программисты делятся на тех, кто пишет комментарии и тех, кто теперь пишет комментарии.
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
Да, на слеши под вендой должно быть пофигу, вроде.
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
Ага. Если разрядность норм
Anatoliy
Ага. Если разрядность норм
То есть в луа 5.3 юзать ))))
Snusmumriken
То есть в луа 5.3 юзать ))))
Я что-то сказал про 5.3? Где твои глаза?
Anatoliy
Я что-то сказал про 5.3? Где твои глаза?
Ну я ошибся - если из того интерпретатора ссылку на который ты мне дал, он же 5.1, взять libcurl.dll и юзать потом его в 5.3, будет работать?
Snusmumriken
Наверное. Но проверь _разрядность_
Saphire
Uhh
Saphire
У тебя библиотека сама не прилинковалась
Anatoliy
У тебя библиотека сама не прилинковалась
А почему он не прилинковалась? Луарокс вроде все сам должен делать, я же незнаю что у него прилинковалось что нет и почему
Snusmumriken
Луарокс не умеет читать мысли, вдруг ты собрался линковать конкретную версию конкретной библиотеки, которая у тебя лучше всего идёт. Да и откуда он просто так возьмёт эту статическую библиотеку (.lib)? Из интернета скачает?
Anatoliy
я ничего не собрался, на сайте https://luarocks.org/modules/luarocks/luacurl сказано - ввести luarocks install luacurl для установки и все, больше ничего не сказано
Snusmumriken
С биндингами всегда так. Эх.
Snusmumriken
Ну там инструкции для линуксов. Под линуксами либы в конкретных местах лежат, а под виндовсами надо ещё пути писать.
Anatoliy
И какие мне пути написать?
Snusmumriken
Ты компилировал когда-нибудь что-нибудь сам, руками? Знаешь что такое .h и .c файлы, зачем нужны .lib и чем они отличаются от .dll(.so)?
Snusmumriken
Мне проще дать тебе учебник по сишке, просто. Это должно быть продуктивнее. Без понимания, это выглядит как "сделайте всё за меня".
Snusmumriken
Кстати, ты своровал бинарь либы в luaforwindows? Попробовал подцепить?
Anatoliy
Кстати, ты своровал бинарь либы в luaforwindows? Попробовал подцепить?
Нет, еслиб я в этом всем шарил как следует то и вопросов бы не возникло бы ))
Snusmumriken
Нет, еслиб я в этом всем шарил как следует то и вопросов бы не возникло бы ))
Бинарь своровал? Влепил себе? Подцепить попробовал? Знаешь как это делается?
Anatoliy
Бинарь своровал? Влепил себе? Подцепить попробовал? Знаешь как это делается?
Ну как, просто - require "бинарь" потом попробую, это я буду luacurl изучать
Snusmumriken
Ты попробовал? Получилось?
Anatoliy
Нет еще
Snusmumriken
А почему?
Snusmumriken
Тебе что нужнее, решить проблему или компилировать?
Anatoliy
Ну просто скомпиленная либа она вроде как самая новая будет, lua-curl и libcurl самые последние, а тот бинарь из luaforwindows он вроде как староватый уже
Snusmumriken
В чём разница? Скажи мне конкретные пункты, которые тебе нужны из "новой версии". Ну там, поддержка какого-то протокола, или ещё что. Которые отсутствуют в версии от luaforwindows.
Anatoliy
В чём разница? Скажи мне конкретные пункты, которые тебе нужны из "новой версии". Ну там, поддержка какого-то протокола, или ещё что. Которые отсутствуют в версии от luaforwindows.
Я ещё что хотел спросить - я изучить luacurl хотел и вообще и ещё в частности потому что некоторые сайты предоставляют некоторый API по протоколу wss, чтобы по этому протоколу работать и нужен luacurl, правильно?