По поводу того, что «Call» в VB/VBA — атавизм

Хакер дает советы, раскрывает секреты и делится своими мыслями по поводу программирования.

Модератор: Хакер

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 24.05.2012 (Чт) 15:20

— Думаете в VB ключевое слово Call — атавизм? Думаете его можно убрать из языка?
— Никак нет! Не атавизм, и убрать нельзя.

Зачем же оно тогда нужно, если можно всегда обойтись без него?
А вот не всегда. Это фича 8)

Код: Выделить всё
Public Sub Name()
    MsgBox "Я процедура Name"
End Sub

Private Sub Main()
    On Error Resume Next
    Call Name
    Name "c:\pagefile.sys" As "c:\swapfile.sys"
End Sub

А теперь попробуйте убрать Call и посмотрите, что получится. Или попробуйте придумать, как здесь обойтись без Call.

В VB есть два семейства ключевых слов: ключевые слова из одного никогда не могут быть использованы в качестве имён процедур/функций/переменных и т.п. Кл. слова из вторых — могут.

В частности, вы можете создать свойство с именем «Property»:
Код: Выделить всё
Public Property Get Property()
End Property

Public Property Let Property(ByVal vNewValue)
End Property


Зачем это может быть нужно? В таком виде, вряд ли это полезно, но если вспомнить про параметрические свойства:
Код: Выделить всё
Public Property Get Property(Property_Id_Or_Name)
    ' Какой-нибудь мудрёный код
End Property

Public Property Let Property(Property_Id_Or_Name, ByVal vNewValue)
   ' Какой-нибудь мудрёный код
End Property


даёт вам возможность делать так:
Код: Выделить всё
SomeObject.Property("Color") = xyz
SomeObject.Property("Width") = abc
SomeObject.Property("Style") = 123
Ivan.Property("Имя второй жены") = "Мария"


Или даже так:

Код: Выделить всё
SomeObject!Color = xyz
SomeObject!Width = abc
SomeObject!Style = 123
Ivan![Имя второй жены] = "Мария"



Ну в каком ещё языке возможны такие трюки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1906
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение ger_kar » 24.05.2012 (Чт) 22:28

Хакер писал(а):— Думаете в VB ключевое слово Call — атавизм? Думаете его можно убрать из языка? — Никак нет! Не атавизм, и убрать нельзя.
Согласен, и кроме описанного случая, когда в принципе без Call обойтись невозможно, есть случаи, когда применение Call значительно улучшает понятность и читаемость кода, особенно если имена переменных по наименованию схожи с именами процедур. А по поводу
Хакер писал(а):В VB есть два семейства ключевых слов: ключевые слова из одного никогда не могут быть использованы в качестве имён процедур/функций/переменных и т.п. Кл. слова из вторых — могут.
Благодаря этому практически все встроенные функции можно заменить на пользовательские.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 24.05.2012 (Чт) 22:31

ger_kar писал(а):Благодаря этому практически все встроенные функции можно заменить на пользовательские.

Сказано абсолютно не к месту. Глупо. Встроенные функции и так не используют в своих именах ключевые слова. Так что связи — ноль.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Proxy » 25.05.2012 (Пт) 18:21

А кому и почему call не угодил? Удобно же, call msgbox вообще часто использовал, когда поравну что она возвращает, но нужна именно не одноимённая процедура, которая несколько урезана в vb6
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 25.05.2012 (Пт) 18:28

Proxy писал(а):но нужна именно не одноимённая процедура

Не одноимённая процедура, а что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1906
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение ger_kar » 25.05.2012 (Пт) 18:44

А вообще какие ключевые слова можно использовать для наименования пользовательских функций? Т.е. есть ли четкий список или может определенный критерий или надо делать эксперименты и проверять получится или нет?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 25.05.2012 (Пт) 18:51

ger_kar писал(а):Т.е. есть ли четкий список или может определенный критерий или надо делать эксперименты и проверять получится или нет?

Вряд ли кто-то составлял подобный список.

Да и вообще вопрос, что считать ключевым словом? Например Access и Read — это ключевые слова?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1906
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение ger_kar » 25.05.2012 (Пт) 18:59

Хакер писал(а):Да и вообще вопрос, что считать ключевым словом?
Да четкого критерия по сути и нет, наверное вместо термина "ключевое слово" лучше использовать "зарезервированное слово".
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 25.05.2012 (Пт) 19:46

Являются ли Access, Read и BF таковыми?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1906
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение ger_kar » 25.05.2012 (Пт) 20:03

Ну Access и Lock да, а что до BF, то я такого ключевого или даже зарезервированного слова вообще не знаю.

PS: А кстати что это? Имеется ввиду BF.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 25.05.2012 (Пт) 20:37

Речь о Read, а не о Lock
Почему же я могу объявить переменные Read, Access и BF?

ger_kar писал(а):S: А кстати что это? Имеется ввиду BF.

Border-Filled.
Код: Выделить всё
Me.Line (500, 500)-(1500, 1000), vbRed, BF
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.05.2012 (Пт) 21:55

Хакер писал(а):А теперь попробуйте убрать Call и посмотрите, что получится. Или попробуйте придумать, как здесь обойтись без Call.

А почему квадратные скобки не помогают?

Хакер писал(а):Border-Filled.
Код: Выделить всё
Me.Line (500, 500)-(1500, 1000), vbRed, BF

Ну ты вспомнил :)

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Proxy » 25.05.2012 (Пт) 22:19

Хакер писал(а):Не одноимённая процедура, а что?

Если мне не изменяет память, то в vb6 есть ещё функция msgbox, которая возвращает код нажатой пользователем кнопки. И вроде с помощью неё можно было указать заголовок окна. Сейчас не могу проверить.
Follow the white rabbit.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.05.2012 (Пт) 22:37

Proxy писал(а):функция msgbox, которая возвращает код нажатой пользователем кнопки.

По-твоему Call вызывает не её?

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Proxy » 25.05.2012 (Пт) 22:51

Я всегда считал, что там отдельная встроенная процедура и отдельная встроенная функция, одно вызывается как процедура, втрое как функция (синтаксически должно требоваться её значение, либо значение должно возвращаться call как в некоторых языках с void, в противном случае используется процедура). Может быть я изначально с чем-то перепутал call в vb6.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 25.05.2012 (Пт) 22:54

Где ты вычитал такую ересь?
Есть всего одна функция MsgBox, обяъвленная в TLB-шке, подключенной к проекту. В библиотеке она называется rtcMsgBox, а в пространстве имён VB появляется под именем просто MsgBox. Она одна. И она возвращает номер нажатой кнопки. И она позволяет указать заголовок, конечно же.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Proxy » 26.05.2012 (Сб) 1:31

Проверил. Действительно перепутал с чем-то, мне казалось там и всплывающие подсказки разные были, с разным количеством параметров.
Follow the white rabbit.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1906
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение ger_kar » 26.05.2012 (Сб) 9:34

Я вот могу припомнить, что из встроенных процедур/функций, только под одним именем Mid прячется парочка процедура/функция. Т.е. есть и функция Mid и процедура Mid.
Бороться и искать, найти и перепрятать

NashRus
Постоялец
Постоялец
 
Сообщения: 363
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение NashRus » 27.05.2012 (Вс) 19:04

ger_kar писал(а):Я вот могу припомнить, что из встроенных процедур/функций, только под одним именем Mid прячется парочка процедура/функция. Т.е. есть и функция Mid и процедура Mid.


Во как.
А еще есть оператор Mid.
Или правду думаешь, что процедуре можно присвоить значение.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 27.05.2012 (Вс) 19:06

NashRus писал(а):Во как.
А еще есть оператор Mid.
Или правду думаешь, что процедуре можно присвоить значение.


Хватит вам придумывать.

Mid$ — с точки зрения механики языка, это обычное параметрическое property. У параметрического Property, как и у обычного, непараметрического, можно получать знечение и присваивать ему новое.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 27.05.2012 (Вс) 19:25

Полноценная обёртка над Mid$, полностью сохраняющая «синтаксис» оригинала:
Код: Выделить всё
Public Property Get MyOwnMid$(ByRef Strng As String, ByVal Start As Long, Optional Length)
    MyOwnMid = Mid$(Strng, Start, Length)
End Property

Public Property Let MyOwnMid(ByRef Strng As String, ByVal Start As Long, Optional Length, ByVal vNewValue As String)
    Mid$(Strng, Start, Length) = vNewValue
End Property


Public Sub Main()
    Dim hw As String
    hw = "Hello World"
   
    MsgBox MyOwnMid$(hw, 4, 5)
    MyOwnMid$(hw, 3, 9) = "y NashRus!"
    MsgBox hw
End Sub

Вызови и оцени. Или ты вправду думает, что процедуре можно присвоить значение свойству нельзя присвоить значение?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 363
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение NashRus » 27.05.2012 (Вс) 19:28

Я про то, что нет такой процедуры Mid.

А насчет property, как вариант, может там внутри, а снаружи видно, что он:
- подсвечивается в IDE как statement, а Property не подсвечиваются так,
- в MSDN описывается как statement (mk:@MSITStore:C:\Program%20Files%20(x86)\Microsoft%20Visual%20Studio%206\MSDN\2001JAN\1033\vbenlr98.chm::/html/vakeyMid.htm),
- не показывается в Object Browser, а Property показываеются.

Насчет обертки, ну да, конечно можно так. Кто же спорит.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 27.05.2012 (Вс) 19:40

Я специально сказал «в соответствии с механикой языка». А изнутри оно да, обрабатывается как особый случай.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.05.2012 (Вс) 21:42

Хакер писал(а):Полноценная обёртка над Mid$, полностью сохраняющая «синтаксис» оригинала:

Хм... А этот код действительно работает? Мне казалось, что Optional в свойставах не допускается...
Сейчас нет времени проверить.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: По поводу того, что «Call» в VB/VBA — атавизм

Сообщение Хакер » 27.05.2012 (Вс) 21:45

Ещё как допускается и работает. Но более корректная реализация свойства-обёртки была бы такой:
Код: Выделить всё
Public Property Let MyOwnMid(ByRef Strng As String, ByVal Start As Long, Optional ByVal Length, ByVal vNewValue As String)
    If IsMissing(Length) Then
        Mid$(Strng, Start) = vNewValue
    Else
        Mid$(Strng, Start, Length) = vNewValue       
    End If
End Property
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в МануAll

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList