Ликбез по Lua

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Ликбез по Lua

Post by John Doe » Mon 02 Jul, 2012 05:41

В данной теме задаём вопросы по Lua.

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

Ликбез по Lua

Post by Shmuel » Thu 29 Dec, 2016 11:54

Latest post of the previous page:

IgorZ wrote: А вот с __len, __ipairs, __pairs что-то, кажется, не так.
Перечисленные метаметоды не работают для таблиц в Lua 5.1, в чём легко убедиться из мануала. Последние два вообще отсутствуют в Lua 5.1.
Если скомпилировать LuaJIT с ключом -DLUAJIT_ENABLE_LUA52COMPAT, тогда эти метаметоды должны работать.

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

Ликбез по Lua

Post by Aidar » Thu 29 Dec, 2016 16:10

Нашёл полезную статью про некоторые особенности Lua:
Почему мы выбрали LUA, сюрпризы луа
Предлагаю добавить ссылку в первое сообщение темы.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Ликбез по Lua

Post by John Doe » Thu 29 Dec, 2016 18:51

Когда с этими особенностями сталкиваешься каждый день, то перестаёшь видеть что-то особенное

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Ликбез по Lua

Post by IgorZ » Fri 30 Dec, 2016 05:34

Shmuel wrote:
IgorZ wrote: А вот с __len, __ipairs, __pairs что-то, кажется, не так.
Перечисленные метаметоды не работают для таблиц в Lua 5.1, в чём легко убедиться из мануала.
Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует, однако, работает при этом. Так что до окончательного прояснения вопроса было (мной) решено ориентироваться на перечисленные в коде библиотеки имена.
Shmuel wrote:Последние два вообще отсутствуют в Lua 5.1.
А вот понадобились. Как раз эти три (ну и кое-что ещё неплохо бы, но эти важнее).
Shmuel wrote:Если скомпилировать LuaJIT с ключом -DLUAJIT_ENABLE_LUA52COMPAT, тогда эти метаметоды должны работать.
Может, сделать это для Far?

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

Ликбез по Lua

Post by Shmuel » Fri 30 Dec, 2016 08:19

IgorZ wrote: Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует
Заходим на http://www.lua.org/manual/5.1/manual.html и видим, что ваше утверждение ложно.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Ликбез по Lua

Post by IgorZ » Fri 13 Jan, 2017 05:30

Извиняюсь за задержку: праздники, да и почему-то перестали приходить уведомления на почту.
Shmuel wrote:
IgorZ wrote: Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует
Заходим на http://www.lua.org/manual/5.1/manual.html и видим, что ваше утверждение ложно.
Захожу на http://www.lua.org/manual/5.1/manual.html, раздел 2.8 – Metatables, вижу такие метаметоды:
  • add
  • sub
  • mul
  • div
  • mod
  • pow
  • unm
  • concat
  • len
  • eq
  • lt
  • le
  • index
  • newindex
  • call
Как видно, len есть, из видно, что для таблиц он должен работать, но не работает. tostring, как нетрудно заметить, в списке отсутствует.

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

Ликбез по Lua

Post by Shmuel » Fri 13 Jan, 2017 07:27

IgorZ wrote: Захожу на http://www.lua.org/manual/5.1/manual.html, раздел 2.8 – Metatables, вижу такие метаметоды:
Ну допустим в этом разделе __tostring не указан, что мешает сделать поиск его на всей странице? Разве ваш браузер не имеет функции поиска в загруженной странице?
IgorZ wrote: Как видно, len есть, из примера к нему видно, что для таблиц он должен работать, но не работает.
Из примера как раз видно, что для таблиц он не должен работать, там даже прокомментировано, что возвращается "primitive table length".

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Ликбез по Lua

Post by IgorZ » Thu 19 Jan, 2017 10:00

Shmuel wrote:
IgorZ wrote: Захожу на http://www.lua.org/manual/5.1/manual.html, раздел 2.8 – Metatables, вижу такие метаметоды:
Ну допустим в этом разделе __tostring не указан, что мешает сделать поиск его на всей странице? Разве ваш браузер не имеет функции поиска в загруженной странице?
Сделал. Был откровенно (и неприятно) удивлён результатом. В моём понимании, там, где в руководстве перечисляются метаметоды, они должны быть перечислены все. Так что даже и подумать не мог, что в официальной документации всё так странно.
Shmuel wrote:
IgorZ wrote: Как видно, len есть, из примера к нему видно, что для таблиц он должен работать, но не работает.
Из примера как раз видно, что для таблиц он не должен работать, там даже прокомментировано, что возвращается "primitive table length".
Тут даже не знаю, что сказать. Почему-то всегда воспринимал это как пример использования метаметода. И только сейчас вдруг дошло, что это следует рассматривать как текст метода по-умолчанию. Здесь мой косяк, однозначно. Жаль, пропадает очень интересная задумка.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Ликбез по Lua

Post by John Doe » Thu 19 Jan, 2017 10:16

IgorZ wrote: Жаль, пропадает очень интересная задумка.
В 5.2 работает и для таблиц.
В 5.1 тоже наверно можно извратиться используя в качестве объектов userdata (newproxy)
Last edited by John Doe on Thu 19 Jan, 2017 10:27, edited 1 time in total.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Ликбез по Lua

Post by IgorZ » Thu 19 Jan, 2017 10:23

John Doe wrote:В 5.1 тоже наверно можно извратиться используя в качестве объектов userdata (newproxy)
Спасибо за совет. Может, попробую.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Ликбез по Lua

Post by John Doe » Thu 19 Jan, 2017 10:28

IgorZ wrote: В моём понимании, там, где в руководстве перечисляются метаметоды, они должны быть перечислены все.
Because metatables are regular tables, they can contain arbitrary fields, not only the event names defined above. Some functions in the standard library (e.g., tostring) use other fields in metatables for their own purposes.

Это дописали в 5.3.
Аналогично и с __gc

User avatar
Dennis_Moore
Posts: 237
Joined: Tue 03 Mar, 2015 19:54
Location: Kiev
Has thanked: 5 times
Been thanked: 11 times

Ликбез по Lua

Post by Dennis_Moore » Fri 23 Jun, 2017 19:22

Не пойму в чем отличие между \n и \r - и то и другое переводит строку. Или отличий нет только под Windows ? Мне казалось что \r вернет в начало текущей строки.

User avatar
HaRT
Moderator
Posts: 8118
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 68 times
Been thanked: 107 times

Ликбез по Lua

Post by HaRT » Fri 23 Jun, 2017 19:30

Dennis_Moore wrote:
Fri 23 Jun, 2017 19:22
в чем отличие между \n и \r
Lua тут ни при чём. Почитайте в Википедии про CR и LF.
Фар есть инструмент, а не нянька. © 2009 DrKnS

buniak_a_h
Posts: 362
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 40 times
Been thanked: 5 times
Contact:

Ликбез по Lua

Post by buniak_a_h » Sat 09 Sep, 2017 22:06

Уважаемы знатоки!
Извините, если вопросы покажутся вам глупыми. Быстро ответов не нашёл, решил спрсить напрямую - вам же не много времени потребуется чтоб ответить.
1. Есть ли в lua директивы компиляции? Конкретно интересуют аналоги #define, #ifdef и #include. Что в fml есть - я нашёл, но пока не понял, как эти библиотеки использовать. Да и ссылка на пример использования в форуме - "висячая".
2. Если нет #include, то как можно подключать однажды написанную функцию(чтобы не копипастить)? Видел, вроде, нечто в папке modules, но терминология для меня совершенно незнакомая; попробовал вызывать таким образом функции из tableview.lua (авторов Maxim Gonchar и Shmuel Zeigerman) - для просмотра локальных таблиц. Делал, вроде по аналогии, но не вызвались.
--
Вы только напишите. Если через modules, буду дальше рыть require...

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Ликбез по Lua

Post by John Doe » Sat 09 Sep, 2017 22:25

1. Нет. И fml не поможет
2. require

buniak_a_h
Posts: 362
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 40 times
Been thanked: 5 times
Contact:

Ликбез по Lua

Post by buniak_a_h » Thu 14 Sep, 2017 06:06

Объясните пожалуйста, что я делаю не так?

Code: Select all

local cmdl={
            --[[good=]][[7z.exe e -so "H:\Program Files\Far Manager\Encyclopedia\FarEncyclopedia.ru.chm" *.hhk]],
            --[[bad =]][["7z.exe" e -so "H:\Program Files\Far Manager\Encyclopedia\FarEncyclopedia.ru.chm" *.hhk]] }
local choice=far.Message('Какой вариант пробовать будем?', nil, 'Без кавычек;С кавычками')
if choice>0 then
  local ff = io.popen(cmdl[choice])
  if ff then
    ff:seek('set',0)
    local iLine=0
    for _ in ff:lines() do
     iLine = iLine + 1
    end
    ff:close()
    far.Show('iLine='..iLine)
  end
end
В приведённом скрипте первая строка отличается от второй только наличием кавычек вокруг имени программы. Обе эти командные строки, будучи записанными в bat-файл (или введёнными в командной строке) действуют одинаково. Но при выполнении из этого скрипта первая строка работает нормально, а вторая приводит к сообщению "Синтаксическая ошибка в имени файла, имени папки или метке тома." . Это не было бы проблемой, если бы не возникло необходимости запускать программу с указанием полного пути, включающего (увы!) C:\Program files. А для указания пробела надо как-то включать кавычки... Да и вообще - как-то странно...

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Ликбез по Lua

Post by John Doe » Thu 14 Sep, 2017 07:00

Необходимо всю строку обрамить в дополнительные кавычки.

Code: Select all

[[bad =]][[""7z.exe" e -so "H:\Program Files\Far Manager\Encyclopedia\FarEncyclopedia.ru.chm" *.hhk"]] }
P.S.
Это общее правило, а не особенность lua.
В batch-файлах тоже, увидите если запишите команду как cmd /c дальше_ваша_комстрока

Post Reply

Return to “Нужна помощь”