Ликбез по Lua

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

Ликбез по Lua

Post by John Doe »

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

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

Ликбез по Lua

Post by Aidar »

Latest post of the previous page:

Нашёл полезную статью про некоторые особенности Lua:
Почему мы выбрали LUA, сюрпризы луа
Предлагаю добавить ссылку в первое сообщение темы.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Ликбез по Lua

Post by John Doe »

Когда с этими особенностями сталкиваешься каждый день, то перестаёшь видеть что-то особенное
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Ликбез по Lua

Post by IgorZ »

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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ликбез по Lua

Post by Shmuel »

IgorZ wrote: Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует
Заходим на http://www.lua.org/manual/5.1/manual.html и видим, что ваше утверждение ложно.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Ликбез по Lua

Post by IgorZ »

Извиняюсь за задержку: праздники, да и почему-то перестали приходить уведомления на почту.
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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ликбез по Lua

Post by Shmuel »

IgorZ wrote: Захожу на http://www.lua.org/manual/5.1/manual.html, раздел 2.8 – Metatables, вижу такие метаметоды:
Ну допустим в этом разделе __tostring не указан, что мешает сделать поиск его на всей странице? Разве ваш браузер не имеет функции поиска в загруженной странице?
IgorZ wrote: Как видно, len есть, из примера к нему видно, что для таблиц он должен работать, но не работает.
Из примера как раз видно, что для таблиц он не должен работать, там даже прокомментировано, что возвращается "primitive table length".
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Ликбез по Lua

Post by IgorZ »

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: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Ликбез по Lua

Post by John Doe »

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: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Ликбез по Lua

Post by IgorZ »

John Doe wrote:В 5.1 тоже наверно можно извратиться используя в качестве объектов userdata (newproxy)
Спасибо за совет. Может, попробую.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Ликбез по Lua

Post by John Doe »

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: 295
Joined: Tue 03 Mar, 2015 19:54
Location: Kiev
Has thanked: 6 times
Been thanked: 17 times

Ликбез по Lua

Post by Dennis_Moore »

Не пойму в чем отличие между \n и \r - и то и другое переводит строку. Или отличий нет только под Windows ? Мне казалось что \r вернет в начало текущей строки.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Ликбез по Lua

Post by HaRT »

Dennis_Moore wrote: Fri 23 Jun, 2017 19:22в чем отличие между \n и \r
Lua тут ни при чём. Почитайте в Википедии про CR и LF.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Уважаемы знатоки!
Извините, если вопросы покажутся вам глупыми. Быстро ответов не нашёл, решил спрсить напрямую - вам же не много времени потребуется чтоб ответить.
1. Есть ли в lua директивы компиляции? Конкретно интересуют аналоги #define, #ifdef и #include. Что в fml есть - я нашёл, но пока не понял, как эти библиотеки использовать. Да и ссылка на пример использования в форуме - "висячая".
2. Если нет #include, то как можно подключать однажды написанную функцию(чтобы не копипастить)? Видел, вроде, нечто в папке modules, но терминология для меня совершенно незнакомая; попробовал вызывать таким образом функции из tableview.lua (авторов Maxim Gonchar и Shmuel Zeigerman) - для просмотра локальных таблиц. Делал, вроде по аналогии, но не вызвались.
--
Вы только напишите. Если через modules, буду дальше рыть require...
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Ликбез по Lua

Post by John Doe »

1. Нет. И fml не поможет
2. require
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

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

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: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Ликбез по Lua

Post by John Doe »

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

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 “Нужна помощь”