o аналогично на JavaScript коментарен ред се въвежда с //, а многоредов коментар се загражда с /* ..... */
o вписани коментари не се допускат
o примери
// this is a single-row comment either in WMLScript or in JavaScript
/*
This is a multiple-row comment.
Nested comments are not allowed in here.
*/
7. Типове променливи в WMLScript
o съгл. т. 2. типовете не се декларират, а се разрешават при интерпретацията, като стойностите са булеви, цели, плаващи стойности и символни низове
o обобщения тип invalid се присвоява на променливата когато нейния тип не може да се определи – напр. при неизпълнима конверсия или нулев знаменател
o целите стойности имат три представяния: осмично, десетично и шeстнадесетично
o стойности с плаваща запетая могат да се представят с десетична точка или в експоненциален вид
Стр. 3 от 9
WAP/WML 7
o символните низове съдържат нула и повече символи, заградени в кавички (“...”) или апострофи (‘...’); специални символи в низа се въвеждат с \: напр. в комбинациите
\’, \”, \\ и \/ стойност има само втория символ, а \n и \t се интерпретират като нов ред и табулация
8. Идентификатори в WMLScript
o идентификаторите на променливи, функции и директиви (в последния случай етикети) са буквено-цифрови низове, стартиращи с буква или “_” и несъвпадащи със служебните думи на езика
o кодирането им е по стандарта Unicode (16 бита) и употребата на кирилица е допустима
o малки и главни букви се интерпретират като различни
o еднакви идентификатори на различни елементи от една категория естествено са недопустими в рамките на един компилационен модул, но се допускат еднакви идентификатори на различини категории елементи – напр. функция, променлива и директива (което не е признак на добър програмен стил)
o служебни (запазени) думи в езика са: access, agent, break, continue, div, div=, domain, else, equiv, extern, for, function, header, http, if, invalid, meta, name, path, return, typeof, url, use, user, var и while
o допълнителни запазени думи за бъдещо разширение на езика са: case, catch, class, const, debugger, default, delete, do, enum, export, extends, finally, import, in, lib, new, null, private, public, sizeof, struct, super, switch, this, throw, try, void и with
9. Променливи в WMLScript
o променливите се декларират явно преди обръщение към тях в програмата, като се ползва служебната дума var, последвана от [eдин] идентификатор и евентуално стойността на променливата, въведена със знак “=”
o имплицитната стойност на декларирана, но неинициализирана променлива е празен символен низ: “”
o типа на променливата се установява при интерпретацията
o обхвата на променливата е до края на функцията, в която е декларирана
o пример: обръщение към WMLScript функция root(varName,number), която извиква библиотечна функция за изчисляване на квадратен корен; резултатът се връща към викащия код с използване на променливата sqr_rt:
newcontext="true">
Number:
title="Number:"/>
Square Root: $nbsp $(result)
Стр. 4 от 9
WAP/WML 7
съдържание на WMLScript файла ex5-07_09.wmls extern function root(varName,number) {
o променливите с целочислените стойности се кодират с 32 бита, т.е. могат да варират от -231 до +231 (или по-точно [-2 147 483 648, 2 147 483 647] които граници са също така резултат на библиотечните функции съответно Lang.minInt() и Lang.maxInt())
o променливите с плаваща запетая също се кодират с 32 бита и тяхната област може да се получи с библиотечните функции Float.minFloat() и Float.maxFloat())
o променливите-низове имат произволна дължина и съдържание, като текущата дължина на низа може да се получи с библиотечната функция String.length(string_Id)
o стойността на булевите променливи е true или false
o пример – приложение на библиотечни функции за проверка на области и мощност:
"http://www.wapforum.org/DTD/wml_1.1.xml">
newcontext="true">
name="1">
name="3">
Your name: $nbsp
name="my_str" title="User string"/>
The smallest integer: $(int1) The biggest integer: $(int2) The smallest F.P. value:
$(float1)
Стр. 5 от 9
WAP/WML 7
The biggest F.P. value:
$(float2)
Your string has $nbsp $(result)
$nbsp char/s
съдържание на WMLScript файла ex5-07_10.wmls extern function Isize(varName1,varName2) { WMLBrowser.setVar(varName1,Lang.minInt()); WMLBrowser.setVar(varName2,Lang.maxInt()); WMLBrowser.refresh();
}
extern function Fsize(varName1,varName2) { WMLBrowser.setVar(varName1,Float.minFloat()); WMLBrowser.setVar(varName2,Float.maxFloat()); WMLBrowser.refresh();
}
extern function Ssize(varName,string) {
// Declaration of variable result:
var result = String.length(string);
// Substituting the result: WMLBrowser.setVar(varName,result);
// Refreshing WML document: WMLBrowser.refresh();
}
11. Конверсия на типовете в WMLScript
o при установяване стойността на променливите – напр. чрез форма за потребителско въвеждане – ако новата стойност на променливата е извън нейната област (напр. по- голяма от maxInt или по-малка от minInt), интерпретаторът генерира събитие-грешка и типа на променливата се конвертира в invalid
o специално за променливите с плаваща запетая при по-малка абсолютна стойност от допустимата конверсията се извършва към стойност 0.0
o при булева операция върху не-булеви изрази/променливи последните се конвертират до булеви стойности
12. Оператори за присвояване на стойности и аритметика в WMLScript
o операторът “=” се използва за присвояване на стойности на променливите; той е бинарен оператор т.е. изисква два операнда, като присвояването става отдясно наляво
o присвояваните стойностите могат да бъдат и във формата на изрази от променливи
(вкл. модифицираната променлива) и оператори
o допуска се и съкратен запис на изразите за присвояване, когато в тях участва модифицираната променлива
o примери за присвояване с аритметични изрази в разширена и съкратена форма
var x = 3;
x = x + 6; x += 6; // събиране и присвояване x = x – 6; x -= 6; // изваждане и присвояване x = x * 6; x *= 6; // умножение и присвояване x = x / 6; x /= 6; // деление и присвояване
x = x div 6; x div= 6; // деление по модул и присвояване на цялата част
x = x % 6; x %= 6; // деление по модул и присвояване на остатъка
13. Побитови оператори върху числови аргументи в WMLScript
o тези операторите се използват за побитови операции върху числови аргументи (които се разглеждат като низ от битове) и имат следната форма:
<< преместване наляво (умножение по степените на 2)
Стр. 6 от 9
WAP/WML 7
>> преместване надясно със запазване на знака (деление по степените на 2)
>>> преместване надясно с конверсия към положителна стойност
& конюнкция
| дизюнкция
^ сума по модул 2
~ отрицание (унарен оператор)
<<= преместване наляво и присвояване
>>= преместване надясно и присвояване
>>>= преместване надясно с положителна конверсия и присвояване
o пример:
a = a << 2 //преместване 2 позиции наляво т.е. умножение по 4
14. Унарни оператори върху числови аргументи в WMLScript
o това са оператори, които изискват един операнд и имат префиксен и постфиксен запис
o при прификсна операция операторът се записва преди операнда и операцията върху аргумента се извършва преди изчисляване стойноста на израза
o при постфиксна операция операторът се записва след операнда и операцията върху аргумента се извършва след изчисляване стойноста на израза
var index1 = ++i // стойността на i се инкрементира преди присвояването
var index1 = i++ // стойността на i се инкрементира след присвояването
15. Логически оператори в WMLScript
o операторите “!”, “&&” и “||” се използват за логически операции върху булеви променливи и имат следната форма:
! отрицание
&& конюнкция (логически И)
|| дизюнкция (логическо ИЛИ)
o последните два оператора са условни, т.е. при определено условие оценката на израза може да се извърши само на базата на първия оператор – напр. при конюнкция между два булеви изрази, от които първият има стойност false, не е необходимо да се изчислява втория, тъй като резултатът от операцията е false
16. Оператор с три аргумента в WMLScript
o този оператор “?:” (означаван като tertiary operation) се използва за кратка форма на
if-else израз със следния синтаксис:
var a, b = 6, c = 7;
if (b
a = c; }
else {
a = b; }
// кратка форма със същата семантика
a = (b < c ? c : b)
17. Оператор за конкатенация на символни низове в WMLScript
o символни низове се конкатенират с оператор “+”, който има и форма за конкатениарне с присвояване “+=”
Стр. 7 от 9
WAP/WML 7
o за по-сложни операции върху низове се използват функциите на стандартна библиотека String
18. Оператори за сравнение в WMLScript
o тези оператори сравняват стойностите на два аргумента от еднакъв тип и изразът има булева стойност
o освен числови аргуманти могат да се сравняват булеви, като true се приема за по- голямо от false, и низове, при които низ, предхождащ по азбучен ред се приема, че има по-голяма стойност
съдържание на WMLScript файла ex5-07_18.wmls extern function compare(varName,number) {
// This function compares user argument
// to 10, if input is numerical.
// Otherwise input is compared to string
// "lion".
// Intialize local variables, to which
// the comparison is done:
var myNumber = 10;
var myString = "lion";
// Result is saved into this variable:
var result;
// Type of input:
if (Lang.isInt(number)) { // Input can
//be converted into integer
// Conversion:
number = Lang.parseInt(number);
Стр. 8 от 9
WAP/WML 7
if (number < myNumber) { // Comparison of numbers result = "New number is smaller.";
}
else if (number == myNumber) {
result = "New number is equal to basic number.";
}
else {
result = "New number is bigger.";
}
}
else { // Input is not integer
// Input should be handled as string:
number = String.toString(number);
// Comparison of two strings:
if (number < myString) {
result = "Alphabetically before.";
}
else if (number == myString) {
result = "Alphabetically identical.";
}
else {
result = "Alphabetically after.";
//
}
}
}
// Refreshing the result into the document: WMLBrowser.setVar(varName,result); WMLBrowser.refresh();
19. Оператор за валиденост на типа isvalid
o този оператор връща true ако неговия аргумент (литерална стойност или израз) е (или може да се конвертира до) някой от валидните типове – цял, плаващ, низ или булев
o пример
var i = 5;
var str = “FMI”;
var isItValid = isvalid i; //true var isItValid = isvalid str; //true var isItValid = isvalid (10/0); //false
Стр. 9 от 9
VIІI. Функции и изрази в WMLScript 1. Синтаксис на WMLScript функциите
WAP/WML 8
o функциите в WMLScript представляват адресируеми блокове код в рамките на компилационния модул, които изпълняват определени задачи и евентуално връщат стойност към викащия код
o декларацията на функция съдържа нейния идентификатор и списък от параметри
o когато декларацията на функция се въвежда с ключ extern, тя е достъпна за външни обръщения (извън компилационния модул) – напр. от WML документ или от външна скрипт функция
o списъкът параметри задава интерфейса на функцията; той може да бъде и празен, като в такъв случай обмен на стойности може да се извърши с помощтта на функции от библиотеката WMLBrowser – вж. примера от т. 3., лекция 7.
o програмният код (т. нар. програмен блок) на функцията следва нейната декларация и се загражда с фигурни скоби - { и }
o не се допуска вписване на функция във функция – т.е. декларация на функция не може да присъства в програмния блок на друга функция
o идентификаторите на функции са уникални в рамките на един компилационен модул,
но могат да съвпадат с идентификатори на променливи или етикети на директиви
2. Интерфейс на WMLScript функциите
o обръщението към функция съдържа и списък с реални параметри, съответстващ по брой и ред на списъка формални параметри от декларацията на функцията; параметрите се разделят със запетая и списъка им е в кръгли скоби независимо дали съдържа елементи или е празен
o външно обръщение към функция винаги съдържа и URL на компилационния модул
(което дава възможност за разграничаване на едноименни функции в различни файлове); URL адреса – абсолютен или относителен – предхожда иденитфикатора на функцията и се отделя с диез #
o обръщението към стандартна библиотечна функция съдържа идентификаторите на библиотеката и на функцията, разделени с точка
o при често обръщение към дълги URL може да се ползва директивата url, която декларира конвенция за обръщението към даден адрес по следния синтакисис:
use url My_URL http://courses.fmi.uni-sofia.bg/WAP_WML/ex_files/sample.wmls
// Reference to the script notation My_URL
var a = My_URL#fact(6);
o обръщение към вътрешна функция (в същия компилационен модул) съдържа само идентификатора й (и списъка параметри), като се допуска рекурсия и обръщение към функция преди нейната декларация
o параметрите се обработват от програмния блок на функцията като локални променливи – с разликата че локалните променливи се инициализират от кода на функцията
o освен чрез стойностите на параметрите, всяка функция връща стойност също и чрез своя идентификатор, на който се присвоява стойността на дадена променлива с израза
return variable_identifier;
а когато return не е включен в програмния блок, на идентификатора на функцията се присвоява стойност празен низ; допуска се повече от един return за функция
Стр. 1 от 7
WAP/WML 8
o пример
"http://www.wapforum.org/DTD/wml_1.1.xml">
newcontext="true">
Number:
$(result)
WMLScript код във файла ex6-08_02.wmls:
extern function testReturns(number, result) {
// calls to functions that are not yet declared
var result1 = dummyFunc(number);
var result2 = fact(number);
var c = number;
var answer = "Dummy function returns: " + result1 +
"||| The factorial of " + c + " is: " + result2; WMLBrowser.setVar(result,answer); WMLBrowser.refresh();
}
function dummyFunc(someNumber) {
var a = someNumber;
var b = fact(a);
// The function returns an empty string
// as there is no return statement
}
function fact(nmbr) {
var fact = 1; // return value when nmbr <= 0
//variable and function with the same identifier (not recommended)
return fact; // Function returns the value of the variable fact
}
3. Изрази в WMLScript
o изразите представляват операции върху променливи и се разделят с “;”
o празните изрази се състоят само от “;” и се ползват за създаване на безкрайни цикли или изчакване на събитие:
for (;;) { // do something in eternal loop
}
while (!signal(device)); // wait here until signal(device) becomes true
o програмният код, заграден във фигурни скоби, образува блок; програмен блок е тялото на функцията, както и блоковете на команди за цикъл и условно изпълнение на блок
o блоковете са прозрачни по отношение на декларираните променливи – обхвата на променливата е от нейната декларация до края на функцията (независимо от границите на блоковете)
Стр. 2 от 7
WAP/WML 8
4. Условно изпълнение в WMLScript
o реализира се с команда if-then-else, като клаузата else e опция
o допуска се йерархично включване на if-блокове, което се използва за избор между няколко алтернативи (тъй като в WMLScript няма case команда)
o пример – вж. т. 18., лекция 7. и ex5-07_18.wmls
5. Условен цикъл while
o блокът на цикъла се изпълнява след предварителна проверка на условието на цикъла, при което е възможно цикълът изобщо да не бъде изпълнен или пък да се изпълнява безкрайно:
while (0.1 > 0) { // block statements of this eternal loop
}
o проверка на условието се изпълнява след всяко изпълнение на блока на цикъла
o блокът на цикъла се изпълнява за последователни стойности на управляващата променлива, която може да бъде декларирана в самата команда на цикъла (отново с обхват до края на цялата функция)
o условието за край на цикъла се проверява преди всяко изпълнение на вложения блок и не е обичайно управляващата променлива да бъде модифицирана в тялото на блока
(но тъй като това е допустимо, цикълът for може да се счита за безусловен само при определени условия :)
o префиксните и постфиксните записи на операции върху управляващата променлива в командната декларация на цикъла се изпълняват респективно преди и след изпълнението на целия блок
o последователността на записите в условната част на командата е: начална стойност на управляващата променлива, условие за край и итеративна операция:
Стр. 3 от 7
WAP/WML 8
for (initial value; condition; increment)
o пример
"http://www.wapforum.org/DTD/wml_1.1.xml">
$(result)
WMLScript код във файла ex6-08_06.wmls:
extern function forStatement(result) {
var c
var c
var p
//
}
var counterplus = 0;
var counterminus = 0;
var plus, minus;
var answer = "";
// Variable i can be declared also inside the
// for condition!
for (var i = 1; i <= 4; i++) {
plus = counterplus++;
minus = --counterminus;
answer += "Iteration " + i + ": " + plus + " | " + minus + " *\n";
o тази команда прекратява изпълнението на цикъл – for или while – като управлението се предава към командата (или операцията) непосредствено след блока на цикъла
o използването й е допустимо само в блока на for или while цикъл