вычисление логического выражения в операторах if, while и repeat

Страницы: 1
RSS
вычисление логического выражения в операторах if, while и repeat, вопрос разработчикам
 
Здравствуйте!
Хотелось бы узнать, всегда ли интерпретатор Lua (и в частности QLua) вычисляет логические выражения полностью в операторах if, while и repeat, или же он прерывает их вычисление в том случае, когда результат уже заведомо известен?
В качестве примера можно привести такой оператор:
if (t_id ~= nil) and not IsWindowClosed(t_id) then ...
Если t_id == nil, то будет ли в данном случае осуществляться вызов функции IsWindowClosed(t_id)? Ведь и без этого ясно, что данное выражение будет равно false.
В компиляторах языков программирования типа Pascal или C (уже не помню точно какого из них) для управления поведением программы в таком случае была опция, которая называлась кажется "complete boolean eval", поскольку иногда этот вопрос имеет большое значение.
А как с этим обстоят дела в (Q)Lua?
 
Цитата
Дмитрий пишет:
Здравствуйте!
Хотелось бы узнать, всегда ли интерпретатор Lua (и в частности QLua) вычисляет логические выражения полностью в операторах if, while и repeat, или же он прерывает их вычисление в том случае, когда результат уже заведомо известен?
В качестве примера можно привести такой оператор:
if (t_id ~= nil) and not IsWindowClosed(t_id) then ...
Если t_id == nil, то будет ли в данном случае осуществляться вызов функции IsWindowClosed(t_id)? Ведь и без этого ясно, что данное выражение будет равно false.
В компиляторах языков программирования типа Pascal или C (уже не помню точно какого из них) для управления поведением программы в таком случае была опция, которая называлась кажется "complete boolean eval", поскольку иногда этот вопрос имеет большое значение.
А как с этим обстоят дела в (Q)Lua?
Добрый день.
проверить можно самому:

Код
function foo1()
   print("in foo1")
   return false
end

function foo2()
   print("in foo2")
   return false
end
print("--- OR")
if (foo1() or foo2())   then
end
print("--- AND")
if (foo1() and foo2())   then
end
 
результат:

Код
--- OR
in foo1
in foo2
--- AND
in foo1
 
 
Дмитрий, полностью не вычисляет. Останавливает вычисление как только понятен результат.
 
Спасибо!
Я правильно понимаю, что это стандартное поведение для Lua?
Или все же не исключено, что в разных версиях/реализациях языка поведение в данном случае может быть различным?
 
Цитата
Дмитрий пишет:
Спасибо!
Я правильно понимаю, что это стандартное поведение для Lua?
Или все же не исключено, что в разных версиях/реализациях языка поведение в данном случае может быть различным?
Это всего лишь оптимизация на уровне виртуальной машины, не рекомендуется использовать подобные тонкости как часть своего алгоритма.
 
Michael Bulychev, не согласен. Это стандарт языка, а не оптимизация. Можно смело полагаться на такое поведение.
 
Цитата
Constantin Constantin пишет:
Это стандарт языка, а не оптимизация
А почему я не нашел ничего на эту тему в официальной документации?
Или я плохо искал? Если не трудно, можете дать ссылку на упоминание об этом?
 
Цитата
Constantin Constantin пишет:
Это стандарт языка, а не оптимизация. Можно смело полагаться на такое поведение.
Вы правы, судя по тому, что написано в книге Programming in Lua (first edition) by Roberto Ierusalimschy:
The operator and returns its first argument if it is false; otherwise, it returns its second argument. The operator or returns its first argument if it is not false; otherwise, it returns its second argument.
Both and and or use short-cut evaluation, that is, they evaluate their second operand only when necessary.

http://www.lua.org/pil/3.3.html
 
То же самое написано и в официальном описании языка.

Lua 5.1 Reference Manual :
The conjunction operator and returns its first argument if this value is false or nil; otherwise, and returns its second argument. The disjunction operator or returns its first argument if this value is different from nil and false; otherwise, or returns its second argument. Both and and or use short-cut evaluation; that is, the second operand is evaluated only if necessary.
http://www.lua.org/manual/5.1/manual.html#2.5.3

Lua 5.3 Reference Manual :
The conjunction operator and returns its first argument if this value is false or nil; otherwise, and returns its second argument. The disjunction operator or returns its first argument if this value is different from nil and false; otherwise, or returns its second argument. Both and and or use short-circuit evaluation; that is, the second operand is evaluated only if necessary.
http://www.lua.org/manual/5.3/manual.html#3.4.5
 
Цитата
Дмитрий пишет:
В компиляторах языков программирования типа Pascal или C (уже не помню точно какого из них) для управления поведением программы в таком случае была опция, которая называлась кажется "complete boolean eval", поскольку иногда этот вопрос имеет большое значение.
http://www.freepascal.org/docs-html/prog/progsu4.html

Я, конечно, не спорю но, если можно, приведите примеры когда это имеет большое значение?

p.s. во многих компиляторах это работает уже по умолчанию в случае режима оптимизации по быстродействию. а разработчики компиляторов - далеко не дураки, чтоб делать так, чтоб результат работы программы (по критерию правильности) от этого зависел.
это лишь влияет на конечное быстродействие.
 
Цитата
sam063rus пишет:
Я, конечно, не спорю но, если можно, приведите примеры когда это имеет большое значение?
Цитата
Дмитрий пишет:
В качестве примера можно привести такой оператор:
if (t_id ~= nil) and not IsWindowClosed(t_id) then ...
Например, я подумал, а что если в результате вызова IsWindowClosed(t_id) или какой-нибудь другой функции (в том числе самописной) в таком же условном операторе при обработке ею значения параметра, равного nil, возникнет ошибка, которая приведет к аварийной остановке работы скрипта.
 
Цитата

sam063rus пишет:

Я, конечно, не спорю но, если можно, приведите примеры когда это имеет большое значение?

p.s. во многих компиляторах это работает уже по умолчанию в случае режима оптимизации по быстродействию. а разработчики компиляторов - далеко не дураки, чтоб делать так, чтоб результат работы программы (по критерию правильности) от этого зависел.
это лишь влияет на конечное быстродействие.
Ничего подобного. Это влияет на логику. Стандартный пример:

if (p != NULL && *p == value)
   return true;

и т.п.

Поэтому такое поведение и закладывают в стандарт языка.
 
Цитата
Constantin Constantin пишет:
if (p != NULL && *p == value)
да, вот теперь, наверно, соглашусь.
Страницы: 1
Читают тему
Наверх