Аналог браузера таблиц Lua с доп возможностями

Здесь обсуждается всё, что касается макросов.
Post Reply
buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 00:46

Навеяноэтим макросом .
Чего мне не хватало в исходном:
1. Фильтр (ну очень не хватает!)
2. Возможность просматривать результаты вызова функций в таблице, если либо функция возвращает несколько значений, либо одно, но таблицу.
3. Взять текущий элемент в буфер
4. Если макрос запущен из редактора, возможности "подхватывать" стартовую строку из редактора
-----
Т.к. всякими "красивостями" для себя любимого заниматься не хочется, то скрипт сделан с минимальными трудозатратами. Просто вызов far.Menu в цикле.

Как-то так… Если тема кому-нить покажется полезной, можно попробовать "облагородить" (хелп, регистрация, локализация…)
TableBrowser.lua.7z
(2.54 KiB) Downloaded 17 times
Last edited by buniak_a_h on Mon 04 Nov, 2019 02:06, edited 1 time in total.

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

Аналог браузера таблиц Lua с доп возможностями

Post by John Doe » Mon 04 Nov, 2019 07:49

Больше напоминает LuaExplorer.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 10:08

John Doe wrote:
Mon 04 Nov, 2019 07:49
Больше напоминает LuaExplorer.
Изначально хотел просто подправить TableView. Конкретно - подправить функцию просмотра результатов вызова функций так, чтоб можно было продолжить работу с результатами-таблицами. А потом получилось, что вроде как всё остальное в TableView - лишнее. В результате из здоровенного проекта с модулем и объектами получился один макрос из 200 строчек. Заодно он втянул в себя функционал того, что мы с Вами обсуждали здесь. Дополнить поиском по всем таблицам - и вуа-ля. :-)
О! Точно! Доделаю...

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 10:48

John Doe wrote:
Mon 04 Nov, 2019 07:49
Больше напоминает LuaExplorer.
Да, точно! Практически тоже самое.
Что-то у меня Ваш le вылетел... Как получилось:
1.

Code: Select all

local le=require"le"
le(panel, 'panel')
Ищу GetPanelInfo, Enter
Ввожу параметры: nil, 0 (вполне себе валидные; из командной строки lua:=panel.GetPanelInfo(nil, 0) прекрасно отрабатывает)
Получаю:

Code: Select all

╔════════════════════════ Error ═════════════════════════╗
║ function:  panel.GetPanelInfo                          ║
║ arguments: nil, 0                                      ║
║ values:    nil                                         ║
║                                                        ║
║ bad argument #2 to '?' (number expected, got no value) ║
╟────────────────────────────────────────────────────────╢
║                         { OK }                         ║
╚════════════════════════════════════════════════════════╝
ЧЯДНТ?

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

Аналог браузера таблиц Lua с доп возможностями

Post by John Doe » Mon 04 Nov, 2019 12:40

У меня не воспроизводится.

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

Аналог браузера таблиц Lua с доп возможностями

Post by John Doe » Mon 04 Nov, 2019 12:50

Я когда-та намеревался реализовать апи для luaexplorer, и вроде бы что-то даже успел сделать.

Т.е. если какой-то функциональности не хватает, используя апи можно было бы добавить, не изобретая новый le 'но немного другой'.

Например, что если бы можно было добавлять свои действия в виде breakkeys?

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 17:25

John Doe wrote:
Mon 04 Nov, 2019 12:40
У меня не воспроизводится.
Прямо в командной строке ввёл:
lua:_G.BB_Deb={deb=function(...) return ... end}
lua:require"le"(_G)
Перешёл на BB_Deb, вызвал deb с параметрами 1,nil,3, в ответе только «1»:

Code: Select all

╔═════════════════════ .BB_Deb.deb(1,nil,3)  (1) ═════════════════════╗
║  0x00000001 (1)                │number   │0x00000001 (1)            ║
╚══════════════════════ F1, F3, F4, Del, Ctrl+M ══════════════════════╝
Если из моего скрипта вызывать, то все три параметра возвращаются. Выглядит это так:

Code: Select all

╔═══════════════════ _G.BB_Deb.deb(1,nil,3) ════════════════════╗
║  001║ n │ 1                      ║ n │ 1                      ║
║  002║ n │ 3                      ║ n │ 3                      ║
╚════════════════════ Total: 2; checked: 0 ═════════════════════╝
(т.е. 2-го элемента нет. Ну, недочёт в выводе, но всё же правильно.
Вызов из командной строки lua:=_G.BB_Deb.deb(1,nil,3) возвращает правильно:

Code: Select all

╔════════════════╗
║  1│ 1          ║
║  2│ nil        ║
║  3│ 3          ║
╚═ 3 arguments ══╝
Вызов из скрипта TableView от maxdrfl & Shmuel выдаёт такое:

Code: Select all

╔═ Function call results ══╗
║  1. number           1   ║
║  2. nil              nil ║
║  3. number           3   ║
╚═══════ 3 results ════════╝
Передаваемые параметры "отсекаются" по nil.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 17:36

Совершенно точно функция luaexp_prompt возвращает массив из одного элемента. Во всяком случае для 1,nil,3 сразу после вызова этой функции вызов far.Show('args[3]=', args[3]) печатает nil !!!

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 19:13

John Doe, фантастика какая-то.
Смотрю модуль <…>\modules\le.lua, в нём функцию luaexp_prompt. Список параметров - 1, nil, 3
До вызова table.remove массив res = {true,1,nil,3} (правильный)
Вызываю table.remove(res,1)
Смотрю res - там {1,nil,nil, 3} -- это как ??? Куда писать?

User avatar
zg
zero-gravity
Posts: 5610
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 100 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by zg » Mon 04 Nov, 2019 19:30

Most functions in the table library assume that the table represents an array or a list. For these functions, when we talk about the "length" of a table we mean the result of the length operator.
The length of a table t is defined to be any integer index n such that t[n] is not nil and t[n+1] is nil
Last edited by zg on Mon 04 Nov, 2019 19:32, edited 1 time in total.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 20:45

John Doe, я понял, в чём Ваша ошибка.
Поясню для удобства для случая когда аргументы заданы [c]1, nil, 3[/c](назову эту строку ArgString); для такой таблицы unpack({1,nil,3}) возвращает одно значение: «1».
В Вашем скрипте вы компилируете строку return 1,nil,3 через pcall в виде: args={pcall('return '..Argstring)}; в результате этого вызова получаем таблицу {true, 1, nil, 3}. Далее Вы проверяете и удаляете первый элемент (в args остаётся {1,nil,3} и затем вызываете функцию, передавая ей unpack(args) - вот на этом этапе теряется всё после nil-а.
На самом деле не надо составлять список аргументов. Скомпилировали ArgFunc = loadstring('return '..ArgString), проdерили, что не нуль, а запускать не надо. Запускать -только при вызове самой функции в виде:
pcall(func, ArgFunc()) - и всё будет работать.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 20:47

zg, я не понял, при чём тут "длина" таблицы. Описание ошибки я представил в предыдущем сообщении. Странно, что у автора "не повторяется". Ошибка устойчивая и объяснимая. Ну, или у меня le старой системы.

User avatar
zg
zero-gravity
Posts: 5610
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 100 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by zg » Mon 04 Nov, 2019 21:12

buniak_a_h wrote:
Mon 04 Nov, 2019 20:47
zg, я не понял, при чём тут "длина" таблицы.
для того, чтобы выполнить операцию remove, нужно удалить указанный элемент и после этого сдвинуть все последующие элементы влево. вот эти все последующие и определяются длиной таблицы, а она в вашем случае может быть и 2 и 4. и то и то — правильно.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

Аналог браузера таблиц Lua с доп возможностями

Post by buniak_a_h » Mon 04 Nov, 2019 21:35

zg wrote:
Mon 04 Nov, 2019 21:12
buniak_a_h wrote:
Mon 04 Nov, 2019 20:47
zg, я не понял, при чём тут "длина" таблицы.
для того, чтобы выполнить операцию remove, нужно удалить указанный элемент и после этого сдвинуть все последующие элементы влево. вот эти все последующие и определяются длиной таблицы, а она в вашем случае может быть и 2 и 4. и то и то — правильно.
Ну...
  1. на самом деле как выяснилось ошибается не только remove (может ошибиться, а может и нет; во всяком случае бельше не ошибается), а unpack - вот он точно ошибается. В частности, table.remove({true,1,nil,3},1) у меня всё время приводит в tab={1,nil,3}. И это правильно.
  2. вообще-то это не у меня. Я просто нарвался на вылет при вызове функции. А там в параметрах вполне частая ситуация с nil-ом

Post Reply

Return to “Обсуждение макросов”