.titleBar { margin-bottom: 5px!important; }

Asterisk AEL: Return Value beim Macro funktioniert nicht?

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von donfaustino, 24 März 2012.

  1. donfaustino

    donfaustino Neuer User

    Registriert seit:
    28 Nov. 2004
    Beiträge:
    143
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #1 donfaustino, 24 März 2012
    Zuletzt bearbeitet: 24 März 2012
    Hi,
    ich habe meinen Dialplan komplett in AEL. Jetzt bin ich dabei mehrfach verwendeten Code in Macros zu modularisieren. Klappt auch soweit, nur wenn ich im Macro einen Rückgabewert ausgeben will gibt es einen Fehler.
    Ich habe aber gelesen dass dieses Feature Anfang letzten Jahres mit in den AEL-Code geflossen sein soll.

    Code:
    macro repair_callnumber ( mycallnumber ) {
       callnumber=${mycallnumber};
    
       if ("${callnumber:0:1}" = "+") {
         callnumber=00${callnumber:1};
       }
    
       if ("${callnumber:0:2}" != "00" & "${callnumber:0:1}" = "0" ) {
         callnumber=0049${callnumber:1};
       }
       return(${callnumber});
    }
    
    Code:
    [Mar 24 13:35:32] ERROR[1161]: ael.y:840 ael_yyerror: ==== File: /etc/asterisk/extensions.ael, Line 105, Cols: 10-10: Error: syntax error, unexpected '(', expecting ';'
    Ich habe diese Asterisk Version:
    Code:
    Iconnect*CLI> core show version
    Asterisk 1.6.2.9-2+squeeze4 built by buildd @ alwyn on a armv5tel running Linux on 2011-12-18 21:54:01 UTC
    Iconnect*CLI> 
    Mache ich was falsch? Oder ist meine Version zu alt? System ist aber up-to-date....
     
  2. rentier-s

    rentier-s Guest

    Verwende statt Macro besser gleich Gosub, da funktioniert return(value) seit 1.6.
     
  3. donfaustino

    donfaustino Neuer User

    Registriert seit:
    28 Nov. 2004
    Beiträge:
    143
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    danke für die Info. Funktioniert GoSub auch in AEL?
     
  4. rentier-s

    rentier-s Guest

    Äh ja natürlich. Es ist sogar anders rum, in AEL gibt es eigentlich gar kein Macro.
     
  5. donfaustino

    donfaustino Neuer User

    Registriert seit:
    28 Nov. 2004
    Beiträge:
    143
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    hmm, sorry, ich find kein Beispiel wie ich GoSub in der extension.ael einbauen kann...
    So gehts zb. nicht:
    Code:
    sub_test {
       NoOp(Test);
    }
    .....
    .....
    context test {
      _X. => {
          gosub(sub_test);
       }
    }
     
  6. rentier-s

    rentier-s Guest

    Aus dem Kopf geschrieben:

    Code:
    [COLOR="#FF0000"]context[/COLOR] sub_test {
      [COLOR="#FF0000"]s =>[/COLOR] {
        NoOp(Test);
        Return(noch mehr Test);
      }
    }
    
    context test {
      _X. => {
        gosub(sub_test[COLOR="#FF0000"],s,1[/COLOR]);
        NoOp(${GOSUB_RESULT});
      }
    }
     
  7. noway0815

    noway0815 Neuer User

    Registriert seit:
    12 Mai 2006
    Beiträge:
    117
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Informatiker
    #7 noway0815, 21 Dez. 2012
    Zuletzt bearbeitet: 21 Dez. 2012
    Es ist besser macros zu benutzen, da mann parameter übergeben kann.

    Aufruf:
    Code:
    &getGateway(${CalledNum}, gw);
    
    macro getGateway(Number, *gw){
    	gw="";
    	switch (${Number}){
    		pattern 00201X.: gw=thisAccount; break;
    		pattern 0020NX.: gw=ThatAccount; break;
    		pattern 001X.  :
    		pattern 0086X. :
    		pattern 00971X.: gw=orThisAccount; break;
    		        default: gw=thisAccount;
    	}
    
    	return;
    }
    Gruß
    Noway
     
  8. rentier-s

    rentier-s Guest

    Dann schau mal, was der AEL Parser aus dem Macro macht ;-)
     
  9. noway0815

    noway0815 Neuer User

    Registriert seit:
    12 Mai 2006
    Beiträge:
    117
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Informatiker
    was der Parser daraus macht ist völlig egal. Es geht so und funktioniert sehr zuverlässig seit Jahren bei mir.
     
  10. abw1oim

    abw1oim Aktives Mitglied

    Registriert seit:
    26 März 2007
    Beiträge:
    946
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    Ort:
    Bonn
    Nur dass die Annahme, an Gosub könnten keine Parameter übergeben werden, falsch ist ...

    Code:
    Gosub(<context>,<exten>,<prio>[(ARG1,ARG2,...,ARGn)])
    Und: Macro ist ab 1.8 deprecated - wird zwar nicht zurückgebaut -, soll aber ausdrücklich nur im Zusammenhang mit der features.conf verwendet werden, wenn eine komplexere Funktion benötigt wird!

    Und: AEL und Macro sind inkompatibel, der Parser übersetzt das in einen "normalen" Kontext (interessanterweise eben ein Gosub). "Echte" Macros können in AEL nicht formuliert werden, sie lassen sich nur über die "klassische" extensions.conf abbilden (und sind und bleiben dann auch "echte" Macros).