u običnom formatu:
;
[internal]
exten => s,1,Answer
exten => s,n,Background(someivr)
exten => s,n,Read(intgroup,,3)
exten => s,n,Goto(${intgroup},1)
exten => XXX,1,Dial(SIP/${EXTEN})
exten => XXX,n,HangUp
Evo kako će isti kontekst izgledati u ael sintaksi:
context internal {
s=> {
Answer;
Background(someivr);
Read(intgroup,,3);
Goto(${intgroup},1);
}
XXX => {
Dial(SIP/${EXTEN});
HangUp;
}
}
Dakle, razlike su očigledne. Za mene je jedna od glavnih prednosti ael pogodnost čitanja konfiguracije: čak i na ovom malom apstraktnom primeru vidi se da je čitanje i razumevanje konfiguracije jednostavnije. Iako priznajem da je to subjektivno. Druga stvar koja odmah upada u oči je odsustvo prioriteta (s,n u gornjem kodu, mada su, kako su primetili u komentarisima, prioriteti već postali neobavezni) u opisu dialplan-a.
Zašto ih nema? Tačnije, zašto postoje u opisu običnog dialplan-a?
Ako do sada niste imali posla sa Asterisk-om i njegovim običnim dialplan-om, bićete iznenađeni saznajući da u njemu nema ni petlji ni uslova. Postoji samo uslovni skok (gotoif), pomoću kojeg se, u principu, mogu organizovati čak i petlje, ali je pogodnost ovog pristupa veoma upitna. Zamislimo najjednostavniji ael kod koji će u konzolu Asterisk-a ispisivati true ili false:
if(${var}=foo) {
NoOp(true);
}
else {
NoOp(false);
}
U običnom obliku ovaj uslov bi izgledao ovako:
exten=>1,1,GotoIf($[${var}=foo]?label1:label2)
exten=>1,n(label1),NoOp(true)
exten=>1,n,Goto(end_of_if)
exten=>1,n(label2),NoOp(false)
exten=>1,n(end_of_if),...
Ne samo da smo izgubili „čitljivost“, već smo prisiljeni da statički definišemo prioritete svuda (i dobijemo potpuno neekspanzibilan kod) ili da smišljamo oznake za svaku sitnicu. Da, u ael-u takođe postoje oznake, samo što je potreba za njima praktično nestala, jer sintaksa omogućava izbegavanje goto operacije kao takve.
s=> {
Answer;
somelabel:
HangUp;
}
Pored direktnih uslova (if/else) u ael-u možete koristiti i switch operator sa uobičajenom sintaksom:
_777X => {
switch (${EXTEN}) {
pattern N11:
NoOp(You called a N11 number-- ${EXTEN});
break;
case 7771:
NoOp(You called 7771!);
break;
case 7772:
NoOp(You called 7772!);
break;
case 7773:
NoOp(You called 7773!);
// fall thru-
default:
NoOp(In the default clause!);
};
