Лишние функции macro api

Здесь обсуждается всё, что касается макросов.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

Latest post of the previous page:

John Doe wrote:Это не стандартная функция.
??? http://www.lua.org/manual/5.1/manual.html#pdf-print
Так в апи плагинов. Или я не понял вопрос.
Будем считать вопрос риторическим. Как назвали, так назвали...
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13860
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Лишние функции macro api

Post by John Doe »

Smitis wrote:
John Doe wrote:Это не стандартная функция.
??? http://www.lua.org/manual/5.1/manual.html#pdf-print
Вот именно, теперь запустите lua.exe и сравните поведение.
Например, попробуйте задать несколько параметров, параметр-таблицу, и т.п.

Да и зачем бы стандартную функцию определять в api.lua и помещать в таблицу mf.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

mf.env ~ win.GetEnv (т.е, не точное соответствие)
Для несуществующей переменной mf.env возвращает пустую строку, а win.GetEnv должна возвращать nil (на самом деле возвращает не понятно что, во всяком случае lua: far.Message(type(win.GetEnv("abrakadabra"))) вылетает с ошибкой. Похоже, баг)
Разум когда-нибудь победит.
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Лишние функции macro api

Post by Shmuel »

Нету там бага. Сделайте lua:type() - получите то же самое.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

Shmuel wrote:Нету там бага. Сделайте lua:type() - получите то же самое.
Если функция для несуществующей переменной возвращает nil, то в результате lua: far.Message(type(win.GetEnv("abrakadabra"))) должны получить тоже, что и при lua: far.Message(type(nil)). Нет?

П.С.
Вот так lua: far.Message(type(os.getenv("abrakadabra"))) как надо. И даже так: lua: far.Message(os.getenv("abrakadabra"))
Разум когда-нибудь победит.
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Лишние функции macro api

Post by Shmuel »

Это не баг, а несоответствие с доками. Функция в случае отсутствия переменной окружения ничего не возвращает. Таких мест в LuaFAR немало. Однако, во всех случаях, кроме type() и assert() всё будет работать правильно. Не вызывайте type и assert напрямую, они требуют аргумента.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Лишние функции macro api

Post by zg »

Smitis wrote:Если функция для несуществующей переменной возвращает nil
с чего вы взяли, что win.GetEnv для несуществующей переменной возвращает nil?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

zg wrote:
Smitis wrote:Если функция для несуществующей переменной возвращает nil
с чего вы взяли, что win.GetEnv для несуществующей переменной возвращает nil?
Во-первых, документация

Code: Select all

win.GetEnv

result = win.GetEnv (var)

Parameters:
  var:  string

Returns:
  result: string, or nil

Description:
  Use this instead of os.getenv, since the latter
  does not always work correctly. 
Напрямую об этом не сказано, но в каких-то случаях nil всё-таки возвращается.
Во-вторых, любая функция должна возвратить данные одного из существующих типов string, number... или nil в конце концов. И type должен вернуть строковое название этого типа. Разве не так? Во всяком случае, не падать.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

Shmuel wrote:Функция в случае отсутствия переменной окружения ничего не возвращает
Думал такое невозможно...
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13860
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Лишние функции macro api

Post by John Doe »

> Во всяком случае, не падать.
Ничего и не упало
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Лишние функции macro api

Post by Shmuel »

Smitis wrote:Во всяком случае, не падать.
Это не падение, это прерывание выполнения макроса, с выдачей сообщения об ошибке. Падение - это нечто другое.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

Однако, во всех случаях, кроме type() и assert() всё будет работать правильно.
Не только в этих случаях, хотя, допустим, тот же far.Message где-то использует type.

Получается что кроме функций, которые ничего не возвращают, и под этим "ничего" подразумевается nil, есть ещё функции, которые совсем ничего не возвращают, даже не nil...
Тогда far.Message( win.GetEnv("abrakadabra") ) эквивалентно far.Message() и поэтому выдаёт ошибку. Понятно.
Но far.Message( win.GetEnv("abrakadabra") or "env var not exist" ) работает, т.е. выражение win.GetEnv("abrakadabra") or "env var not exist" не то же самое, что or "env var not exist"

Я то уже обошёл эту странность win.GetEnv, но где логика?
Разум когда-нибудь победит.
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Лишние функции macro api

Post by Shmuel »

Кажущееся отсутствие логики проистекает от недостаточного знания Lua.

Тем не менее, во избежание повторения подобных тем, я собираюсь сделать, чтобы действительно везде возвращался nil в подобных функциях.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Лишние функции macro api

Post by zg »

Smitis wrote:Во-первых, документация
значит несоответствие между документацией и реализацией.
Smitis wrote:Напрямую об этом не сказано, но в каких-то случаях nil всё-таки возвращается.
можно вернуть одно значение со значением nil, можно вернуть ноль значений. очевидно, это разные вещи.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Лишние функции macro api

Post by Smitis »

Shmuel wrote:Тем не менее, во избежание повторения подобных тем, я собираюсь сделать, чтобы действительно везде возвращался nil в подобных функциях.
Во всяком случае это будет логичным поведением, чем отсутствие возвращаемых значений, которое иногда интерпретируется как nil, а иногда вызывает ошибку.
Разум когда-нибудь победит.
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Лишние функции macro api

Post by Shmuel »

Smitis wrote:Во всяком случае это будет логичным поведением, чем отсутствие возвращаемых значений, которое иногда интерпретируется как nil, а иногда вызывает ошибку.
Внимательно читаем здесь (от 2.5 до 2.5.1). Обращаем особое внимание на слово "adjusted".
Если не поможет, я не виноват.
Post Reply

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