в обычном формате:
;
[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
А вот так этот же контекст будет выглядеть в синтаксисе ael:
context internal {
s=> {
Answer;
Background(someivr);
Read(intgroup,,3);
Goto(${intgroup},1);
}
XXX => {
Dial(SIP/${EXTEN});
HangUp;
}
}
Итак, различия налицо. Для меня одним из главных плюсов ael является удобство чтения конфига: даже на этом маленьком абстрактном примере видно, что читать и понимать конфиг проще. Хотя, допускаю, что это субъективно. Второе что сразу бросается в глаза — это отсутствие приоритета (s,n в коде выше, правда, как заметили в комментариях, приоритет и там уже не обязателен) в описании dialplan'a.
Почему их нет? Вернее, почему они есть в описании обычного dialplan'a?
Если вы не имели до этого дела с астериском и с его обычным dialplan'ом, то вы будете удивлены, узнав что в нем нет ни циклов, ни условий. Есть только лишь условный переход (gotoif), с помощью которого, в принципе, можно организовать даже циклы, но удобство этого подхода весьма сомнительно. Давайте представим себе простейший ael код, который будет выводить в консоль астериска true или false:
if(${var}=foo) {
NoOp(true);
}
else {
NoOp(false);
}
В обычном виде это условие будет выглядеть так:
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),...
Мало того, что мы потеряли «читаемость», так еще и вынуждены либо статически прописывать везде приоритеты (и получить абсолютно нерасширяемый код), либо придумывать метки на каждый чих. Да, в ael тоже есть метки, только надобность в них практически пропадает, так как синтаксис позволяет уйти от goto как такового.
s=> {
Answer;
somelabel:
HangUp;
}
Кроме непосредственно условий (if/else) в ael вы можете использовать и оператор switch с привычным синтаксисом:
_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!);
};
