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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 имеют практически все текстовые редакторы.

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

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

    Всего записей: 6489 | Зарегистр. 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 к удобоваримому тексту? Что-то не выходит каменный цветок... И нагуглить не удаётся.

    Всего записей: 6489 | Зарегистр. 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}


    Всего записей: 2289 | Зарегистр. 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.


    Всего записей: 1505 | Зарегистр. 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, иногда есть необходимость ручками залезть в файлы конфигурации.

    Всего записей: 6489 | Зарегистр. 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


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

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

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

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

    Всего записей: 1505 | Зарегистр. 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
    Не получается скомпилить, попробую попозже разобраться.

    Всего записей: 6489 | Зарегистр. 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

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

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

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

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

    Всего записей: 3098 | Зарегистр. 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

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

    Всего записей: 6489 | Зарегистр. 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
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DarkMasterW
    Не понял, как можно вызвать функцию по её номеру в таблице f_array? И не будет ли таблица заполнена результатами этих функций до вызова любой из них?

    Цитата:
    lua socket

    Тут автор пишет про 2017ю студию. (Хотя если программист пишет "it builds fine on my machine", это совсем не значит, что получится у кого-то ещё )

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

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

    Цитата:
    Не понял, как можно вызвать функцию по её номеру в таблице f_array?

    Для луа таблиц абсолютно нет никакой разницы, что в ней содержится. Строка/число/функция/другая_таблица/bool. Работа с ними полнотью аналогична.
    Вам нужен массив или таблица? Вызов должен быть по имени или по номеру? Это несколько разные вещи. Я вам выше написал вызов по имени. Если задача именно по номеру, то вместо имени используйте:
    f_array[НОМЕР] = function...
     

    Цитата:
    Тут автор пишет про 2017ю студию.

    Угадайте, кто автор тикета и чем все кончилось.

    Всего записей: 284 | Зарегистр. 17-04-2010 | Отправлено: 03:13 31-12-2018
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DarkMasterW
    Спасибо, попробую разобраться. Это как-то странно и непривычно: в других языках строка типа f_array[НОМЕР] = function... приводит к тому, что в f_array[НОМЕР] попадает результат работы функции, а не её имя.

    Цитата:
    Вам нужен массив или таблица? Вызов должен быть по имени или по номеру?

    Пока не решил, изучаю вопрос (и поисковики выдают много ненужного).
     
    Тикет закрыт, лога сборки с ошибками не было - подумал, таки удалось

    Всего записей: 6489 | Зарегистр. 28-01-2008 | Отправлено: 10:43 31-12-2018
    DarkMasterW

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

    Цитата:
    в других языках строка типа f_array[НОМЕР] = function... приводит к тому, что в f_array[НОМЕР] попадает результат работы функции, а не её имя.  

    Возмжно я мог вас ввести в заблуждение из-за того, что опустил значимые части.
    f_array[НОМЕР] = function name_of_function(params) ... end
     
    Вообще в lua:
    local function name (params)
    абсолютно эквивалентно:
    local name = function (params)
     
    Первый вариант не более чем синтаксический сахар для более привычной записи.

    Всего записей: 284 | Зарегистр. 17-04-2010 | Отправлено: 19:02 31-12-2018
    zedxxx

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

    Цитата:
    в других языках

    В чужой монастырь со своим уставом не ходят, вот и в Lua сделано так, как сделано. Вообще, не стоит думать в контексте синтаксиса "других языков", когда пишешь на каком-то конкретном языке. Иначе, ничего хорошего не выйдет.

    Всего записей: 1505 | Зарегистр. 14-07-2008 | Отправлено: 20:52 31-12-2018
    DarkMasterW

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zedxxx
    Скорее на 5.1 ссылки давать нужно. Дефакто эталон на данный момент хотя бы потом, что стабильный luajit полностью совместим именно с 5.1, а luajit имхо сейчас более распространен, чем оригинальный lua ввиду гигантской разницы в скорости выполенения и возможности создавать биндинги для dll'ок, без модификации самих dll'ок (при этом и скорость вызова выше существенно).

    Всего записей: 284 | Зарегистр. 17-04-2010 | Отправлено: 23:42 31-12-2018
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2

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


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru