Page 15 of 24

Ликбез по Lua

Posted: Mon 02 Jul, 2012 05:41
by John Doe
В данной теме задаём вопросы по Lua.

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

Ликбез по Lua

Posted: Thu 29 Dec, 2016 11:54
by Shmuel

Latest post of the previous page:

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

Ликбез по Lua

Posted: Thu 29 Dec, 2016 16:10
by Aidar
Нашёл полезную статью про некоторые особенности Lua:
Почему мы выбрали LUA, сюрпризы луа
Предлагаю добавить ссылку в первое сообщение темы.

Ликбез по Lua

Posted: Thu 29 Dec, 2016 18:51
by John Doe
Когда с этими особенностями сталкиваешься каждый день, то перестаёшь видеть что-то особенное

Ликбез по Lua

Posted: Fri 30 Dec, 2016 05:34
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?

Ликбез по Lua

Posted: Fri 30 Dec, 2016 08:19
by Shmuel
IgorZ wrote: Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует
Заходим на http://www.lua.org/manual/5.1/manual.html и видим, что ваше утверждение ложно.

Ликбез по Lua

Posted: Fri 13 Jan, 2017 05:30
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, как нетрудно заметить, в списке отсутствует.

Ликбез по Lua

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

Ликбез по Lua

Posted: Thu 19 Jan, 2017 10:00
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".
Тут даже не знаю, что сказать. Почему-то всегда воспринимал это как пример использования метаметода. И только сейчас вдруг дошло, что это следует рассматривать как текст метода по-умолчанию. Здесь мой косяк, однозначно. Жаль, пропадает очень интересная задумка.

Ликбез по Lua

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

Ликбез по Lua

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

Ликбез по Lua

Posted: Thu 19 Jan, 2017 10:28
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

Ликбез по Lua

Posted: Fri 23 Jun, 2017 19:22
by Dennis_Moore
Не пойму в чем отличие между \n и \r - и то и другое переводит строку. Или отличий нет только под Windows ? Мне казалось что \r вернет в начало текущей строки.

Ликбез по Lua

Posted: Fri 23 Jun, 2017 19:30
by HaRT
Dennis_Moore wrote: Fri 23 Jun, 2017 19:22в чем отличие между \n и \r
Lua тут ни при чём. Почитайте в Википедии про CR и LF.

Ликбез по Lua

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

Ликбез по Lua

Posted: Sat 09 Sep, 2017 22:25
by John Doe
1. Нет. И fml не поможет
2. require

Ликбез по Lua

Posted: Thu 14 Sep, 2017 06:06
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. А для указания пробела надо как-то включать кавычки... Да и вообще - как-то странно...