Y
Yakov
Здравствуйте, уважаемые разработчики.
Краткая заметка о виртуальной машине LS и системе ее команд находится во вложении.
А здесь мы рассмотрим некоторые примеры.
Преобразования типов и встроенные функции
Встроенные функции, возвращающие строки, (Chr, Ucase, Lcase и другие) в зависимости от написания (Chr или Chr$) возвращают либо Variant of DataType 8 (String), либо String.
Посмотрим, как это выглядит "внутри".
После трансляции:
В первом присвоении выполняется лишнее преобразование типов, чего можно избежать, используя "$" в имени функции.
Select Case
Код
транслируется в
Что здесь происходит. Переменная x сравнивается с каждым из значений в операторе Select Case последовательно. Если есть совпадение, выполянется соответствующий код и происходит переход на следующую за End Select строчку. Таким образом, если в вашем коде одна из веток Case ... встречается чаще других, ее следует поставить на первое место.
Вычисление булевых значений (операторы And, Or)
Некоторые компиляторы языков высокого уровня допускают частичное вычисление булевых значений: вычисление прекращается, как только будет известно его значение. К примеру, значение выражения False And x = 0 известро еще до вычисления значения x = 0, оно равно False. Компилятор языка Lotus Script всегда выполняет полное вычисление булевых значений, поэтому в LS невозможна проверка вида
Если все таки document Is Nothing, то вычисление document.Created вызовет ошибку.
Переменного числа аргументов не существует
Компилятор подставляет пропущенные значения.
транслируется в
транслируется в
Расширенный синтаксис
Пришло время поставить все точки над ё в вопросе о расширенном синтаксисе. Сравним:
и
А теперь переходим к части, обозначенной подзаголовком. Ваши вопросы, господа и дамы.
Краткая заметка о виртуальной машине LS и системе ее команд находится во вложении.
А здесь мы рассмотрим некоторые примеры.
Преобразования типов и встроенные функции
Встроенные функции, возвращающие строки, (Chr, Ucase, Lcase и другие) в зависимости от написания (Chr или Chr$) возвращают либо Variant of DataType 8 (String), либо String.
Посмотрим, как это выглядит "внутри".
Код:
Dim s As String
s = Chr(13)
s = Chr$(13)
Код:
Dim S As String
line #
lvalue_l S
push_long 13
Chr
Cvar
Cstr
Let
line #
lvalue_l S
push_long 13
Chr
Cstr
Let
Select Case
Код
Код:
Public Sub printNumber(x As Integer)
Select Case x
Case 0: Print "zero"
Case 1: Print "one"
Case Else: Print "something else"
End Select
End Sub
Код:
Public Sub PRINTNUMBER(X As Integer)
line # 13
line #
goto label_3
label_0:
line # 14
stack_copy
push_int_0
=
if_false_goto label_1
pop
line #
push_str_const {zero}
Print
line #
goto label_4
label_1:
line # 15
stack_copy
push_int_1
=
if_false_goto label_2
pop
line #
push_str_const {one}
Print
line #
goto label_4
label_2:
pop
line # 16
push_str_const {something else}
Print
line #
goto label_4
label_3:
line #
rvalue_pi X
goto label_0
label_4:
line # 18
end_routine
End Sub
Вычисление булевых значений (операторы And, Or)
Некоторые компиляторы языков высокого уровня допускают частичное вычисление булевых значений: вычисление прекращается, как только будет известно его значение. К примеру, значение выражения False And x = 0 известро еще до вычисления значения x = 0, оно равно False. Компилятор языка Lotus Script всегда выполняет полное вычисление булевых значений, поэтому в LS невозможна проверка вида
Код:
If Not document Is Nothing And document.Created > cutOff Then
...
End If
Код:
rvalue_p DOCUMENT
push_Nothing
Is
Not
rvalue_object DOCUMENT
push_property CREATED
call_routine
rvalue_p CUTOFF
>=
And
if_false_goto label_0
...
label_0:
Переменного числа аргументов не существует
Компилятор подставляет пропущенные значения.
Код:
Print Instr(x, "a")
Код:
push_1
rvalue_l X
push_str_const {b}
push_int 0
Instr
Print
Код:
Dim uiWorkspace As New NotesUIWorkspace()
Call uiWorkspace.Prompt(PROMPT_OK, "Test", "OK")
Код:
line #
lvalue_l UIWORKSPACE
push_constructor NOTESUIWORKSPACE
сall_constructor
Set
line #
rvalue_object UIWORKSPACE
push_routine PROMPT
push_num_const PROMPT_OK = 1
push_str_const {Test}
push_str_const {OK}
push_int 0
push_int 0
call_routine
pop
Расширенный синтаксис
Пришло время поставить все точки над ё в вопросе о расширенном синтаксисе. Сравним:
Код:
Print document.GetItemValue("Form")(0)
Print document.Form(0)
Call document.ReplaceItemValue("Form", "test")
document.Form = "test"
Код:
line #
rvalue_object DOCUMENT
push_lsx_routine GETITEMVALUE
push_str_const {Form}
call_routine
push_int_0
rvalue_arr
Print
line #
rvalue_object DOCUMENT
push_notes_function FORM
push_int_0
call_notes_function
Print
line #
rvalue_object DOCUMENT
push_lsx_routine REPLACEITEMVALUE
push_str_const {Form}
push_str_const {test}
call_routine
pop
line #
rvalue_object DOCUMENT
lvalue_document_field FORM
push_str_const {test}
Let
А теперь переходим к части, обозначенной подзаголовком. Ваши вопросы, господа и дамы.