Тема: Особенности VBScript

Есть, например, такой код

Function CheckA(a)
    CheckA = (a = 2)
    MsgBox "Function executed!"
End Function

Dim a
a = 2
If (a = 1) And CheckA(a) Then
    MsgBox "TRUE"
Else
    MsgBox "FALSE"
End If

Его выполнение вполне закономерно приводит к появлению сообщения "FALSE", однако, перед этим появляется сообщение "Function executed!".
Т.е. VBScript производит полное вычисление логического выражения.
Можно ли отказаться от полного вычисления логических выражениий?
А то вместо лаконичной записи

If (Not Obj Is Nothing) And (Obj.Attributes(...).Value = "...") Then
  ...
End If

Приходится писать громоздкое

If Not Obj Is Nothing Then
  If Obj.Attributes(...).Value = "..." Then
    ...
  End If
End If

Re: Особенности VBScript

Его выполнение вполне закономерно приводит к появлению сообщения "FALSE", однако, перед этим появляется сообщение "Function executed!".

Function executed! будет выводится в любом случае, судя из первого кода.
Смотрим второй код: CheckA(a) равно true, a=1 равно false.
Тогда условие примет вид:

Если ЛОЖЬ и ИСТИНА тогда
Вывести "ИСТИНА"
иначе
Вывести "ЛОЖЬ"

Т.е. появление сообщения с "false" вполне правильное.

Что касается замены "длинной" записи на более "короткую", то это вряд ли.. Как я понимаю если написать

If (Not Obj Is Nothing) And (Obj.Attributes(...).Value = "...") Then
  ...
End If

и объект Obj будет "пустым", то выдастся ошибка.
Но ведь это особенность не только VBScript, но и других языков. Например, C++ Builder в коде

TButton *b;

        if (b!=NULL && b->Caption=="Caption")
                ShowMessage("123");

так же при выполнении выдаст ошибку, т.к. объекта b не существует..

Может быть попробовать что то вроде этого:

On Error Resume Next
If (Not Obj Is Nothing) And (Obj.Attributes(...).Value = "...") Then
On Error GoTo 0
  ...
End If
On Error GoTo 0

Хотя это получается совсем не короче.. :)

(изменено: Slava.Coder.Vrn, 2 апреля 2007г. 09:40:25)

Re: Особенности VBScript

Да это и понятно, что выполнение этого кода ДОЛЖНО приводить к появлению сообщения "FALSE".
Вопрос в том, что большинство трансляторов языков программирования имеют опцию - "Полное вычисление логических выражений". Эта опция означает следующее:
1. "Полное вычисление логических выражений" включено - выражение считается целиком, как у нас в VBScript;
2. "Полное вычисление логических выражений" выключено - выражение считается до тех пор, пока не станет очевиден конечный результат. Т.е. если вычисляется выражение "a AND b", и если результатом вычисления "подвыражения" "а" будет "ложь", то выражение "b" просто не будет вычисляться, потому как вне зависимости от результата вычисления "подвыражения" "b" результат всего выражения все равно будет "ложь".
Это свойство как раз часто используется для написания конструкций вида

If (Not Obj Is Nothing) And (Obj.Attributes(...).Value = "...") Then
  ...
End If

В С-Билдере 100% где-то есть пимпочка, позволяющая выбирать "полное вычисление"/"не полное вычисление". Просто у вас эта пимпа поставлена в положение "полное вычисление". Но чаще всего эту опцию отключают, потому как очень удобно писать код со сцылками на объекты.

Вообще, вопрос мой в том, есть ли такая пимпа в VBScript? Очень хотелось бы ее установить в положение "не полное вычисление логических выражений"

Re: Особенности VBScript

Slava.Coder.Vrn пишет:

В С-Билдере 100% где-то есть пимпочка, позволяющая выбирать "полное вычисление"/"не полное вычисление". Просто у вас эта пимпа поставлена в положение "полное вычисление". Но чаще всего эту опцию отключают, потому как очень удобно писать код со сцылками на объекты.

Сэр, есть такое понятие как стандарт. Язык С выжил до сих пор и произвел толпу клонов только благодаря тому, что в отличие от других языков легко подчинялся стандартам и остается стандартизованным по сию пору. Благодаря этому приложения на С/С++, несмотря на сильную платформо-зависимость языка, остаются переносимыми.

Ровно по этому пимпочка/не пимпочка - это абсурд. Компилируемый код на С должен одиново отработать на Alpha, x86, Power, Windows, Linux и пр.

Самое важное правило, которого должен придерживаться программист (особенно на С) - пиши как можно более просто и однозначно. Длинное логическое выражение возможно говорит о вашем могучем нтелекте, но увы... плохо читается, и вдобавок, будет выполнено по правилам, которых вы не знаете.

Что касается VBScript, то это собственность Microsoft, стандартов нет, есть правила употребления в пищу и некоторое количество забавных фич. Тем паче надо быть предельно аккуратным. Не подставлейте свой код на растерзание интерпретатора и все будет ОК.

(изменено: Anatoly, 2 апреля 2007г. 14:15:02)

Re: Особенности VBScript

Slava.Coder.Vrn пишет:

Приходится писать громоздкое

If Not Obj Is Nothing Then
  If Obj.Attributes(...).Value = "..." Then
    ...
  End If
End If

Угу, только если совсем правильно, то еще более громоздкое:

If Not Obj Is Nothing Then
  If Obj.Attributes.Has ("SysID атрибута") = True Then
    If Obj.Attributes(SysID атрибута).Value = "..." Then
    End If
  End If
End If

  :D  :D  :D  :D  :D  :D  :D

(изменено: Anatoly, 2 апреля 2007г. 15:14:04)

Re: Особенности VBScript

Да, еще... идея:
Можно написать функцию

Function AskObj(Obj, Attr, Value)
  AskObj = False
  If Not Obj Is Nothing Then
    If Obj.Attributes.Has ("Attr") = True Then
      If Obj.Attributes(Attr).Value = Value Then
         AskObj = True
      End If
    End If
  End If
End Function

Потом просто в скрипте писать:

Use SysId команды/библиотеки
и, к примеру:

If AskObj(ThisObject, "SysId атрибута", "12345") Then
  msgbox "да, равняется :)"
Else
  msgbox "фиг, не равняется :)"
End If

(изменено: Slava.Coder.Vrn, 2 апреля 2007г. 16:23:40)

Re: Особенности VBScript

Сэр, есть такое понятие как стандарт...

Но тем не менее, это есть стандартная опция каждого уважающего себя транслятора  :). Я на самом деле не знаю, есть такая пимпа в Билдере или нет. Но в Делфи она есть (поэтому я и решил, что в билдере она тоже есть). И в VisualStudio есть такая пимпа. Даже в QuickBasic она есть!

Ровно по этому пимпочка/не пимпочка - это абсурд. Компилируемый код на С должен одиново отработать на Alpha, x86, Power, Windows, Linux и пр.

Эта пимпочка не как не влияет на переносимость с платформы на платформу. Это опция компилятора. Очень удобная опция. Если кто-то под какой-нибудь Alpha написал корявый компилятор, не поддерживающий эту опцию - это не есть проблема программиста. имхо.

Можно написать функцию
...
Потом просто в скрипте писать

Ужос. До сих пор не могу понять, как я сознательно согласился кодать на VB и ему подобных!

Re: Особенности VBScript

Хммм, а где ты нашел у VBScript (вернее, у его модификации CScript для TDMS) компилятор?  :D

Даже у стандартного интерпретатора CScript нет никаких подобных функций (убил полдня на поиски документации, он слабо документирован Microsoft).

(изменено: Slava.Coder.Vrn, 2 апреля 2007г. 19:00:50)

Re: Особенности VBScript

Даже у стандартного интерпретатора CScript нет никаких подобных функций

Если честно, я без понятия, как устроен этот CScript. Но подозреваю, что это некий программный модуль, который суть есть интерпретатор, т.е. ему можно скормить текст на его языке программирования, а он либо будет вызывать внешние функции, на которые ему укажут, либо просто возвернет некий результат. Почему же у него не может быть каких-нибудь опций? Вон, PHP тоже является интерпретатором скриптов. Так у него параметров и опций... такая куча, фик запомнишь  :)

убил полдня на поиски документации, он слабо документирован Microsoft

Извините, я не хотел...   -_- Ох уж этот Билл...

Re: Особенности VBScript

Slava.Coder.Vrn пишет:

Но тем не менее, это есть стандартная опция каждого уважающего себя транслятора  :). Я на самом деле не знаю, есть такая пимпа в Билдере или нет. Но в Делфи она есть (поэтому я и решил, что в билдере она тоже есть). И в VisualStudio есть такая пимпа. Даже в QuickBasic она есть!
---
Эта пимпочка не как не влияет на переносимость с платформы на платформу. Это опция компилятора. Очень удобная опция. Если кто-то под какой-нибудь Alpha написал корявый компилятор, не поддерживающий эту опцию - это не есть проблема программиста. имхо.
---
Ужос. До сих пор не могу понять, как я сознательно согласился кодать на VB и ему подобных!

RTFM.

1. Есть принципиальные отличия в правилах трансляции логических выражений практически во всех парах применяемых ныне языков. Наиболее яркий пример - "родственные" С# и С. Для С практически любая переменная может использоваться в условном выражении, для C# есть специальный тип bool.

2. Нельзя сравнивать или приводить в качестве контрпримера авторские языки (Дельфи, Турбо Пролог и т.д.). Они ни при каких условиях не могут претендовать на стандарты. На самом деле, "стандартных" языков программирования не так уж много. Это те языки, которые поддерживаются и развиваются сообществом разработчиков, а не одной компанией. Такие как С/С++, Fortran, Java, ... Ни Дельфи, ни какие-либо разновидности Бейсика к ним не относятся.

3. Все С-подобные языки в результате выполнения логического выражения получают либо false либо true. В логических выражениях VB (как и в выражениях SQL)  также используется Null. Поэтому ВСЕГДА вычисляются обе части логического выражения. И результатом логического выражения может быть Null, True, False.

Re: Особенности VBScript

Для С практически любая переменная может использоваться в условном выражении, для C# есть специальный тип bool.

Насколько я знаю, как раз-таки в стандартном С есть только bool. А вот Билл сделал еще BOOL и константу FALSE = 0 и TRUE <> 0, что дает возможность в условном операторе использовать переменные практически любого типа.

В логических выражениях VB (как и в выражениях SQL) также используется Null. Поэтому ВСЕГДА вычисляются обе части логического выражения. И результатом логического выражения может быть Null, True, False.

А вот про это я забыл свсем... Блин, идиотизм. Все еще никак не пойму, зачем в VB помимо NULL есть еще Empty и Nothing... C Empty еще более-менее ясно. Но чем идеологически отличается NULL от Empty я совсем не понимаю. В общем,

Ужос. До сих пор не могу понять, как я сознательно согласился кодать на VB и ему подобных!

...  :)
Пойду еще покурю маны по VBS...

Re: Особенности VBScript

Кстати, можете кинуть мне нормальную документацию по VBS типа "Для продвинутых чайников", в которой есть объяснение идеологии VBS и были бы рассмотрены вопросы навроде "зачем нужен Empty" и "Зачем в логических выражениях используется Null"?
А то я в рунете ничего подобного не нашел.

(изменено: McZag, 3 апреля 2007г. 13:46:33)

Re: Особенности VBScript

Slava.Coder.Vrn пишет:

Насколько я знаю, как раз-таки в стандартном С есть только bool. А вот Билл сделал еще BOOL и константу FALSE = 0 и TRUE <> 0, что дает возможность в условном операторе использовать переменные практически любого типа.

В стандартном С нет типа данных bool. Т.е. нет вообще и никогда не было.
Тип данных bool появился в С++. И "Билл", насколько я знаю, тут совершенно не причем. А BOOL - это не базовый тип данных, а производная, определенная в windef.h как обыкновенное 32-битное знаковое целое:
typedef int BOOL;

Slava.Coder.Vrn пишет:

Кстати, можете кинуть мне нормальную документацию по VBS типа "Для продвинутых чайников", в которой есть объяснение идеологии VBS и были бы рассмотрены вопросы навроде "зачем нужен Empty" и "Зачем в логических выражениях используется Null"?
А то я в рунете ничего подобного не нашел.

Наиболее полное описание VBScript на русском языке идет... в комплекте с TDMS.

Re: Особенности VBScript

Порылся по закладкам и нашел:
http://msdn.microsoft.com/library/default....70296ced968.asp

И примеры с советами на сайтах вроде:
http://www.compress.ru/Archive/CP/2001/5/61/
http://www.vbcity.com

Спасибо сказали: KudrjashovAI1

Re: Особенности VBScript

BOOL - это не базовый тип данных, а производная, определенная в windef.h как обыкновенное 32-битное знаковое целое

Я поэтому и подумал, что это исключительно билловых рук дело. Впрочем, "чистого" С я не застал... В те времена я еще только на QuickBasic'е кодал  :)

Наиболее полное описание VBScript на русском языке идет... в комплекте с TDMS

Ага. Поэтому меня сильно расстроил факт отсутствия справки в 3-й TDMS. Пришлось копировать файл справки из установленной 2-ки  :)
А на англиском есть доки? Я б почитал.

Re: Особенности VBScript

А на англиском есть доки? Я б почитал.

Ага, моя первая ссылка в предыдущем посте  :)

(изменено: Slava.Coder.Vrn, 3 апреля 2007г. 14:32:44)

Re: Особенности VBScript

PolyMorph, не  :) мне бы книжечку какую в електронном виде. Потому как всякие форумы/факи плохо способствуют улучшению общего понимания языка. А мне нужно разобраться именно в идеологии программирования на VBS.
Вот, разьве что в МСДН покопаться стоит. Но опять же, в МСДН, насколько я знаю, идеологических вещей редко когда найдешь.

Re: Особенности VBScript

Простая http://www.webf1.com/scriptdoc/vbscript/VBSTUTOR.HTM
МСДНовская http://msdn2.microsoft.com/en-us/library/0ad0dkea.aspx
Концептуальная http://docs.rinet.ru/VB/ch2.htm
"Примерная" http://www.activexperts.com/support/activm...nline/vbscript/
Сборная http://compdoc.ru/internet/vbscript/
...

Таких книг море. Но лучше искать "по факту", то есть определенные вопросы. И именно на MSDN/форумах, в книгах чаще всего пишут поверхностнее. Еще у меня валяется талмуд на страниц 600 по VBScript, уже вероятно раритетный  :)

Спасибо сказали: KudrjashovAI1

Re: Особенности VBScript

Но лучше искать "по факту", то есть определенные вопросы

Многие конкретные вопросы отпали бы сами собой после ознакомления с "идеологической" литературой. Напр, как вопрос, с которого началось это обсуждение  :)

И именно на MSDN/форумах, в книгах чаще всего пишут поверхностнее

Это смотря какие книги. Барахла среди книг, которые написаны только ради того, чтобы срубить немного денежек, конечно, очень много. Но из книги можно почерпнуть целостные знания сразу. А в форумах/мсднах придется собирать эту общую идеологическую картину по крупицам.
ЗЫ: Просмотрел МСДН. Ничего нового для себя не нашел.  :(
ЗЗЫ: Спасибо за ссылки, пойду смотреть дальше  :)