w standardowym formacie:
;
[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
Oto jak ten sam kontekst wygląda w składni ael:
context internal {
s=> {
Answer;
Background(someivr);
Read(intgroup,,3);
Goto(${intgroup},1);
}
XXX => {
Dial(SIP/${EXTEN});
HangUp;
}
}
Różnice są więc oczywiste. Dla mnie jedną z głównych zalet ael jest wygoda czytania pliku konfiguracyjnego: nawet na tym małym, abstrakcyjnym przykładzie widać, że konfigurację czyta się i rozumie łatwiej. Przyznaję jednak, że jest to subiektywne. Drugą rzeczą, która od razu rzuca się w oczy, jest brak priorytetów (s,n w powyższym kodzie; choć, jak zauważono w komentarzach, priorytety nie są już konieczne również w tym przypadku) w opisie dialplan'a.
Dlaczego ich nie ma? A właściwie dlaczego istnieją one w opisie zwykłego dialplan'a?
Jeśli wcześniej nie miałeś do czynienia z Asteriskiem i jego standardowym dialplan'em, będziesz zaskoczony, dowiadując się, że nie zawiera on pętli ani warunków. Występuje tylko instrukcja warunkowego przejścia (gotoif), która teoretycznie pozwala na zaimplementowanie nawet pętli, ale wygoda takiego podejścia jest bardzo wątpliwa. Rozważmy najprostszy kod ael, który wypisuje w konsoli Asteriska wartość true lub false:
if(${var}=foo) {
NoOp(true);
}
else {
NoOp(false);
}
W standardowej formie warunek ten wyglądałby tak:
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),...
Nie tylko tracimy „czytelność”, ale także musimy albo statycznie wpisywać priorytety wszędzie (co daje kod całkowicie nie rozszerzalny), albo wymyślać etykiety przy każdej okazji. Tak, w ael również istnieją etykiety, ale potrzeba ich użycia praktycznie znika, ponieważ składnia pozwala uniknąć samego goto.
s=> {
Answer;
somelabel:
HangUp;
}
Oprócz bezpośrednich warunków (if/else) w ael możesz również użyć operatora switch ze znajomym składnią:
_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!);
};
