1

Тема: VBS: Игнорирование Option Explicit внутри Execute

Добрый день, уважаемые.

Обнаружил особенность: внутри Execute не действует Option Explicit, то есть можно использовать не декларированные явно переменные. Пример:

Option Explicit
Dim B

A = "some" : B = "thing" ' будет ошибка, переменная A не декларирована 

Execute "A = ""some"" : B = ""thing""" ' а это отработает нормально
Msgbox A & B

A = "same" : B = "thing" ' теперь А декларирована неявно ранее, несмотря на Option Explicit, поэтому ошибки нет
Msgbox A & B

Option Explicit, применённая внутри Execute, действует. Пример:

Option Explicit
Dim B

Execute "Option Explicit : A = ""some"" : B = ""thing""" ' теперь будет ошибка

Согласно документации, Execute исполняет код в контексте места вызова, то есть Option Explicit должна действовать для кода, исполняемого Execute.
Кроме этого, Option Explicit не имеет понятия области действия, а всегда действует на весь скрипт.

Хочу попросить у вас комментария: это баг или фича?

2 (изменено: Xameleon, 2017-01-30 21:45:51)

Re: VBS: Игнорирование Option Explicit внутри Execute

Михаил Орлов, хм... Назвать это "багом" или "фичей" язык не поворачивается.

ВасилийП уже сделал для себя открытие в объявлении функций с одинаковым именем - ссылка. Он тоже поинтересовался "баг" это или "фича".

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

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: VBS: Игнорирование Option Explicit внутри Execute

Xameleon
Если так рассуждать, получится, что нет ни "багов", ни "фич", а есть одни лишь "особенности" .
По-моему, в первом приближении, если "особенность" задумана разработчиками, то она - фича, если "само получилось" - баг. В мысли программистов Microsoft мы, конечно, не залезем, но их касательно продукта положено отражать в документации. То есть: нет в документации - баг. (Критерий не чёткий, т. к. программист может и знать об "особенности" своего продукта, но не документировать и не устранять её, сочтя несущественной.)
Другой критерий - потенциальный вред/польза/безвредность особенности, добавит она программисту возможности или проблемы.
По обоим критериям получается, что и Execute("A=1"), и дублирование имён функций - баги, т. к. в документации их нет,   польза сомнительна, а потенциальный вред понятен. Но я могу ошибаться, поэтому решил узнать, что об этом думают гуру VBScript.
Оказалось, гуру VBScript о такой ерунде не думают .

4

Re: VBS: Игнорирование Option Explicit внутри Execute

Михаил Орлов
Текст ошибки-то читали? Так чего ждать от скрипта, если одна из переменных не объявлена (хоть в Execute, без разницы)?

5

Re: VBS: Игнорирование Option Explicit внутри Execute

Flasher пишет:

Текст ошибки-то читали?

Нет, ввиду отсутствия оного.

Flasher пишет:

Так чего ждать от скрипта, если одна из переменных не объявлена (хоть в Execute, без разницы)?

Я бы ждал сообщения об ошибке во время выполнения. К сожалению, его нет, про это и тема.

Или вы имеете ввиду часть кода:

A = "some" : B = "thing" ' будет ошибка, переменная A не декларирована

Так речь не о ней.

6 (изменено: Xameleon, 2017-01-31 15:58:48)

Re: VBS: Игнорирование Option Explicit внутри Execute

Михаил Орлов, не хочется разводить оффтоп, но не могу согласиться по некоторым моментам, поэтому поясню свою позицию. В моём понимании "баг" это что либо приводящее к сбою в работе. К примеру некорректное подключение скриптовых интерпретаторов к событиям объекта WinHttpRequest, которое приводит к краху процесса. Давнишний баг, который так и не пофиксили. Но опять же считать это багом интерпретатора тоже, наверное, не совсем верно. Так как там беда кроется в нестандартной организации интерфейса обработчика событий. На некоторых билдах 10-ки были замечены "баги" при работе с объектом InternetExplorer.Application Связь с объектом отваливалась после вызова метода Navigate. Хотя в VB6 объект продолжал работать стабильно. К чему я веду ? К тому что если бы объявление переменной "Dim a" или ,к примеру, функция деления работала в половине случаев правильно, а в половине нет, то такой вариант я бы посчитал "багом". Кстати не так давно видел обсуждение на каком-то форуме, о том, что функции FormatCurrency и FormatDateTime возвращают разные результаты на системах с разным языком. Разработчик был не в курсе, что эти функции региональнозависимые от функции SetLocale. Считать это "багом" ? Не думаю. Считать "фичей"... Тоже как-то странно.

По обоим критериям получается, что и Execute("A=1"), и дублирование имён функций - баги, т. к. в документации их нет,   польза сомнительна, а потенциальный вред понятен

Не поверите, но иногда возникает необходимость в подмене функций в готовом модуле. И тогда такая возможность оказывается очень полезна. По поводу документации, сразу вспомнилась история про американскую пенсионерку, которая "посушила" кота в СВЧ печке, а потом предъявила иск страховой компании за то, что получила жаркое вместо кота и выиграла суд. С тех пор инструкции к забугорной бытовой технике по толщине с небольшую книгу. Потому что компании приходится расписывать, что их прибор нельзя засовывать в .... ковырять им в ...., а не то .... и ой ой ой
Я к тому, что - ну нельзя ж всё расписывать. Поэтому исходят из логики - что не запрещено, то разрешено. Например ни кто не запрещает в именах переменных и функций в VBS использовать не только латиницу,

Dim [переменная]: [переменная] = 1

но сказать, что это сплошь и рядом написано - не видел.

Вообще по поводу "feature" в английском переводе "feature" переводится как "особенность". Я не против "американизмов", но слово "особенность", лично мне - ближе.

P.S Сейчас по работе приходится иметь дело с USB токенами, устройствами криптографии. Работа с ними осуществляется через Сишные библиотеки с функциями написанными по стандарту PKCS11. В этом стандарте расписано какие функции и с какими именами должна содержать библиотека, какие данные должны возвращать и какие параметры получать на вход каждая функция. НО ! У меня сейчас на столе лежит 3 класса устройств и 3 библиотеки для работы с ними. И У КАЖДОЙ есть своя "багофича" при реализации функций ПО ОБЩЕМУ стандарту PKCS11, будь он не ладен ! )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7

Re: VBS: Игнорирование Option Explicit внутри Execute

Михаил Орлов пишет:

Согласно документации, Execute исполняет код в контексте места вызова

Как оказывается, кроме игнорирования Option Explicit, он создает незадекларированные переменные не в контексте вызова, а в глобальном. Однажды я писал про это и еще про кое-какую "багофичу" Execute.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

8 (изменено: Xameleon, 2017-02-01 21:14:16)

Re: VBS: Игнорирование Option Explicit внутри Execute

В тему багов...


Execute "Sub echo(text):" & _
			"MsgBox(text):" & _
		"End Sub"
	
Dim echo

MsgBox "VarType: " & VarType(echo)

MsgBox TypeName(echo)

VarType: 76 ??

TypeName:

Ошибка: Переменная использует не поддерживаемый в VBScript тип программирования объектов: 'TypeName'

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

Re: VBS: Игнорирование Option Explicit внутри Execute

Xameleon пишет:

В тему багов...

Попробую продолжить. Переписал до рабочего состояния. (Или до вменяемого сообщения об ошибке, если раскомментировать DIM echo.)

Execute "Function echo(text):" & _
			"MsgBox(text):" & _
		"End Function"
' Dim echo
MsgBox "VarType: " & VarType(echo("some text"))
MsgBox TypeName(echo("some text"))

По теме - да, баг. Наверно, сложно было обнаружить.

10 (изменено: Xameleon, 2017-02-21 13:44:15)

Re: VBS: Игнорирование Option Explicit внутри Execute

Михаил Орлов, не понял. А в чём баг ?
После выполнения строки "Dim echo", указатель с ссылки на функцию становится ссылкой на переменную. Логично, что следующий вызов echo("some text") генерит ошибку несоответствия типа. Вроде бы всё верно ? O_o

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: VBS: Игнорирование Option Explicit внутри Execute

Xameleon
В моём примере нет бага, конечно.

12

Re: VBS: Игнорирование Option Explicit внутри Execute

Михаил Орлов,

Переписал до рабочего состояния. (Или до вменяемого сообщения об ошибке, если раскомментировать DIM echo.)

В моём примере нет бага, конечно.

Просто не понял - для чего ? Т.е какова цель ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !