Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Lua

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lua


 
Скриптовый язык программирования, распространяется свободно, с открытыми исходными текстами на языке С. В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования (игры, SciTE, Vim, Wireshark, VLC, Far Manager, Double Commander и др.)
 
Страница с документацией (руководства, книги, статьи)
Wiki
Перевод руководства Lua 5.1 на русский


Для задач, критичных по времени, имеется JIT-компилятор: проект LuaJIT. Помимо полной совместимости с Lua, имеет библиотеку FFI, позволяющую использовать внешние функции С и С-подобную структуру данных и обращаться к WinAPI напрямую:

Код:
local ffi = require("ffi")
ffi.cdef[[
int MessageBoxA(void *w, const char *txt, const char *cap, int type);
]]
ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)



Специализированные среды разработки:
  • ZeroBrane Studio: кроссплатформенное ПО, проект активен, поддерживаются Lua 5.1, Lua 5.2, Lua 5.3, LuaJIT и другие ВМ.
  • Lua Development Tools (LDT): кроссплатформенное ПО, поддерживаемые ВМ.
  • Decoda: только Windows, поддержка Lua 5.2 появилась только в бета-версии 1.17.
    Неспециализированные:
  • Geany: кроссплатформенное ПО, проект активен.
  • Расширение для Visual Studio: только Windows.
     
    Подсветку синтаксиса Lua имеют практически все текстовые редакторы.

  • Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 13:55 21-11-2016 | Исправлено: Skif_off, 00:53 23-11-2016
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В Double Commander встроена поддержка Lua 5.1, скрипты можно использовать как wdx-плагины и, с недавних пор, как способ автоматизации. Для первого есть такой скрипт для поиска папок, содержащих файлы определённых расширений, (или создания колонок), но есть проблема с листингом каталога (FileName - имя каталога) в цикле for

    Код:
    for f in io.popen("dir \"" .. FileName .. "\" /b /s /l /x"):lines() do

    при каждом запуске вылезает окно командной строки. Так понял, дело в io.popen, можно ли как-то подавить появление окна? Другого способа получить листинг каталога не нашёл и, видимо, перенаправить вывод dir в файл не поможет (к тому же - замедлит).

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 08:37 22-11-2016 | Исправлено: Skif_off, 08:40 22-11-2016
    Daniyar91

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    eclipse.org/ldt
    Еще от MS есть - https://visualstudiogallery.msdn.microsoft.com/46e33dfd-c2bd-4903-99b3-94ab0f6847e9

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 21:40 22-11-2016
    mozers



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    Избавиться от мигающего окошка (io.popen, os.execute) нельзя. Вот тут поподробнее. А своих средств для получения листинга каталога у голого Lua нету.
    Но можно подключить дополнительный модуль и получить желаемое.
     
     

    Всего записей: 2187 | Зарегистр. 03-01-2002 | Отправлено: 23:10 30-11-2016 | Исправлено: mozers, 23:15 30-11-2016
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mozers
    Надеялся, что есть какой-то грязный хак, без дополнительных модулей На Linux не мелькает. В принципе, с листингом каталогов вопрос, можно сказать, решён, но io.popen и os.execute могут пригодиться и в иных случаях.
     
    shell.dll не совсем подходит, т.к. помимо своей сторонности она только под Win и только х32. А почему у неё в зависимостях SciTE.exe?

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 21:52 01-12-2016
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста:
    на AutoIt могу добавить к переменной текст так

    Код:
    $var = "некий"
    $var &= " текст"

    и получить в итоге значение "некий текст", можно ли сделать подобное с Lua (5.1)? Не нагугливается, а дополнительные переменнык использовать не хочется.
     
    Добавлено:
    Увидел пример, похоже, так:

    Код:
    local var = "некий"
    var = var .. " текст"

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 05:38 13-12-2016 | Исправлено: Skif_off, 07:32 13-12-2016
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, что не так: скрипт Lua 5.1 ругается на строку 5 "attempt to call global 'srch' (a nil value)".

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 01:06 09-08-2017 | Исправлено: Skif_off, 01:07 09-08-2017
    tsr



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго!
    Сначала нужно объявить функцию local function srch(x), а потом уже ее вызывать.

    Всего записей: 11 | Зарегистр. 14-04-2003 | Отправлено: 16:10 16-08-2017
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    tsr
    Да, в итоге получилось, спасибо
     
    2All
    Подскажите, пожалуйста, есть ли готовый пример для приведения строки из кодов символов юникода вида \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f к удобоваримому тексту? Что-то не выходит каменный цветок... И нагуглить не удаётся.

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 02:55 24-08-2017
    Alex_Qwerty

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Код:
    str:gsub('\\u(%x%x%x%x)', function(u) u = tonumber(u, 16) ...  end)

    Потом можно перекодировать в 1251 по табличке и string.char(code)

    Код:
    unicodeToAnsi = {[1025]=168, [1105]=184, [1040]=192, [1041]=193, [1042]=194, [1043]=195, [1044]=196, [1045]=197, [1046]=198, [1047]=199, [1048]=200, [1049]=201, [1050]=202, [1051]=203, [1052]=204, [1053]=205, [1054]=206, [1055]=207, [1056]=208, [1057]=209, [1058]=210, [1059]=211, [1060]=212, [1061]=213, [1062]=214, [1063]=215, [1064]=216, [1065]=217, [1066]=218, [1067]=219, [1068]=220, [1069]=221, [1070]=222, [1071]=223, [1072]=224, [1073]=225, [1074]=226, [1075]=227, [1076]=228, [1077]=229, [1078]=230, [1079]=231, [1080]=232, [1081]=233, [1082]=234, [1083]=235, [1084]=236, [1085]=237, [1086]=238, [1087]=239, [1088]=240, [1089]=241, [1090]=242, [1091]=243, [1092]=244, [1093]=245, [1094]=246, [1095]=247, [1096]=248, [1097]=249, [1098]=250, [1099]=251, [1100]=252, [1101]=253, [1102]=254, [1103]=255}


    Всего записей: 2069 | Зарегистр. 09-09-2006 | Отправлено: 08:57 27-08-2017
    zedxxx

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    Для работы с настоящим юникодом в lua существует библиотека icu4lua. И там, среди прочих, есть такая функция:
     

    Цитата:
     
    icu.convert (text, current_encoding, new_encoding)
     
    Convert a Lua string, text, from one encoding (current_encoding) to another (new_encoding).
     
    If either of the encoding parameters are passed as nil, the default encoding is used for that end of the conversion.


    Всего записей: 1356 | Зарегистр. 14-07-2008 | Отправлено: 09:24 27-08-2017
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Qwerty
    Спасибо за таблицу, как-то не пришло в голову, сделал проще (или нет), без tonumber, забил всё в таблицу

    Код:
    local function f4u2a(s)
      local u2a = {["\\u0410"]="А", ["\\u0411"]="Б", ["\\u0412"]="В", ["\\u0413"]="Г", ["\\u0414"]="Д", ["\\u0415"]="Е", ["\\u0416"]="Ж", ["\\u0417"]="З", ["\\u0418"]="И", ["\\u0419"]="Й", ["\\u041a"]="К", ["\\u041b"]="Л", ["\\u041c"]="М", ["\\u041d"]="Н", ["\\u041e"]="О", ["\\u041f"]="П", ["\\u0420"]="Р", ["\\u0421"]="С", ["\\u0422"]="Т", ["\\u0423"]="У", ["\\u0424"]="Ф", ["\\u0425"]="Х", ["\\u0426"]="Ц", ["\\u0427"]="Ч", ["\\u0428"]="Ш", ["\\u0429"]="Щ", ["\\u042a"]="Ъ", ["\\u042b"]="Ы", ["\\u042c"]="Ь", ["\\u042d"]="Э", ["\\u042e"]="Ю", ["\\u042f"]="Я", ["\\u0430"]="а", ["\\u0431"]="б", ["\\u0432"]="в", ["\\u0433"]="г", ["\\u0434"]="д", ["\\u0435"]="е", ["\\u0436"]="ж", ["\\u0437"]="з", ["\\u0438"]="и", ["\\u0439"]="й", ["\\u043a"]="к", ["\\u043b"]="л", ["\\u043c"]="м", ["\\u043d"]="н", ["\\u043e"]="о", ["\\u043f"]="п", ["\\u0440"]="р", ["\\u0441"]="с", ["\\u0442"]="т", ["\\u0443"]="у", ["\\u0444"]="ф", ["\\u0445"]="х", ["\\u0446"]="ц", ["\\u0447"]="ч", ["\\u0448"]="ш", ["\\u0449"]="щ", ["\\u044a"]="ъ", ["\\u044b"]="ы", ["\\u044c"]="ь", ["\\u044d"]="э", ["\\u044e"]="ю", ["\\u044f"]="я", ["\\u0401"]="Ё", ["\\u0451"]="ё"}
      for key, val in pairs(u2a) do
        s = string.gsub(s, key, val);
      end
      return s;
    end

    чтобы не зависеть от локали при получении букв из ASCII-кода. Наверное, придётся её расширить, нашёл такую страничку, по идее можно регэкспами (или Calc+регэкспы) загнать в таблицу.
     
    Тут ещё наткнулся на строку "телефон/zusätzliche" в виде \x442\x435\x43b\x435\x444\x43e\x43d/zus\xe4tzliche. Можно пройтись заменами "\x" на "\u", только пока не понял, как добавить нолей до четырёх значащих цифр и вообще, начинает казаться, что не по Сеньке шапка...
     
    zedxxx
    Спасибо, нагуглил библиотеку с Makefile под Linux, но пока не пробовал. А что нужно подставлять в icu.convert в моём случае? Всю строку не получится, ведь в ней каша: первые 128 символов идут как есть.
     
    P.S. Это всё делается пытаюсь сделать для плагина GeanyLua, иногда есть необходимость ручками залезть в файлы конфигурации.

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 13:59 27-08-2017 | Исправлено: Skif_off, 14:01 27-08-2017
    Alex_Qwerty

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Собираешься рисовать табличку на весь юникод? :-D
     
    Можно использовать числовые ключи, заменять на '\u0' (кстати, как тут определяют количество цифр - в примере есть \x43d и \xe4 ?) или
     

    Код:
    function pad(str, len, symb, right)
        str = tostring(str)
        symb = symb or '0'
        if right then return str..symb:rep(len-#str) end
        return symb:rep(len-#str) .. str
    end


    Всего записей: 2069 | Зарегистр. 09-09-2006 | Отправлено: 14:40 27-08-2017
    zedxxx

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    А что нужно подставлять в icu.convert в моём случае?

    Строку надо перевести в бинарный вид, в качестве исходной кодировки указать "UTF-8", в качестве целевой - "cp1251".
     
    Если что, я с этой библиотекой не работал, просто знаю о такой возможности. Подсказал направление, так сказать, а дальше уже экспериментируйте и читайте доки/сорцы.
     
    Добавлено:
    Возможно, вам подойдёт какая-та другая функция из icu4lua, например, там можно прочитать строку из файла в нужной кодировке. Есть так же функции для работы прямо с utf-8 и т.д.

    Всего записей: 1356 | Зарегистр. 14-07-2008 | Отправлено: 16:40 27-08-2017
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Qwerty

    Цитата:
    Собираешься рисовать табличку на весь юникод? :-D

    Это да, начал было, но почти всю базовую плоскость и загнал (чуть больше 60ти тысяч) Только cp1250-cp1257 вытянула на почти 600 строк, оставлю пока так и буду думать.

    Цитата:
    кстати, как тут определяют количество цифр - в примере есть \x43d и \xe4 ?

    Не знаю, это из XnViewMP - код закрыт, не подглядеть. В данном случае паттерн "%x%x%x%x" не захватит - 3й символ "t".
     
    zedxxx
    Не получается скомпилить, попробую попозже разобраться.

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 09:51 28-08-2017
    Alex_Qwerty

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Тогда лучше поискать другие библиотеки или взять какую-нибудь FFI библиотеку (в шапке, http://alien.luaforge.net/ ) и перекодировать средствами операционки. https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd374130(v=vs.85).aspx

    Всего записей: 2069 | Зарегистр. 09-09-2006 | Отправлено: 11:49 28-08-2017
    zedxxx

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Qwerty
    У товарища Linux. И если привязываться к системе, то тогда уже лучше смотреть в сторону lua-iconv.

    Всего записей: 1356 | Зарегистр. 14-07-2008 | Отправлено: 15:09 28-08-2017
    VitRom

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос общего плана: есть ли варианты удобной отладки "embedded" варианта, встроенного в прикладное ПО?
     
    Может быть, что-то типа phpdbg, который одним include подключается в любой сырец, или ещё что-то подобное.
     
    Есть софтина для ЧПУ Vectric Aspire, и в ней под капотом есть LUA. Искаропки идут несколько т.н. "гаджетов", на картинке в ветке как раз один из них в работе, ещё кучка есть на форуме, и – главное – можно делать свои. Версия Луа явно нигде не указана, в описухе просто "написано на Луа" со ссылкой на луа.орг, без уточнений.
     
    Работа с "внешним миром" сводится к выбору/чтению/записи файлов, и то не всегда. Остальное разные внутренние переменные и инклюды. Общение с юзером организовано проще некуда: в АппДате лежат гаджеты (сам(и) скрипт(ы) + вспомогательные хтмл, картинки и текстовики с параметрами), они показаны списком в отдельном подменю главного меню, при запуске или просто что-то делают, или выводят диалог (на основе тех самых вспомогательных хтмл и картинок) для указания параметров, после чего опять-таки что-то делают.
     
    Вот как бы этак с ЭТИМ удобно и интерактивно поработать?

    Всего записей: 2964 | Зарегистр. 18-06-2006 | Отправлено: 17:22 14-07-2018
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, можно ли (и как, если да ) провернуть подобное: есть пачка таблиц ключ=значение и чтобы не инициализировать сразу все, вынес их в отдельные функции, для экономии, теперь хотелось бы подсократить, чтобы избежать кучи if-elseif. Например, что-то типа: таблица с функциями

    Код:
    local a = {
      function1,
      function2,
      ...
      functionN
    }

    и зову как-то так

    Код:
    local s = "some string"
    local p = 2
    if (a[p] ~= nil) then
      local r = функция_a[p](s)
    end

    Или пусть функции functionN будут без параметров и просто будут возвращать соответствующую таблицу, типа

    Код:
    if (a[p] ~= nil) then
      local t = функция_a[p]()
      for k, v in pairs(t) do
        s = string.gsub(s, k, v);
      end
      break;
    end

    Такое возможно?

    Всего записей: 6191 | Зарегистр. 28-01-2008 | Отправлено: 12:30 26-12-2018
    DarkMasterW

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off,

    Код:
    local f_array = {}
    f_array.func1 = function(params)
        ....
    end
     
    f_array.func2 = function(params)
        ....
    end
     
    -- выполняем:
    f_array.func1(params)
    f_array.func2(params)

     
     
    Господа, задолбался с lua socket. Никак не получается скомпилить свежий под винду. Крайне желательно статически прилинковать все либы, чтобы зависимостей не было. Можно через mingw - там с этим вроде проще.

    Всего записей: 284 | Зарегистр. 17-04-2010 | Отправлено: 07:22 30-12-2018 | Исправлено: DarkMasterW, 07:50 30-12-2018
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Lua


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru