On 8/31/22 05:29, Antony Stone wrote:

What I am suggesting is that Tracker=${CDR(uniqueid)} should be converted
by AEL into Set(Tracker=${CDR(uniqueid)}) in order to avoid this sort of
surprise.
On the flip-side... anyone who currently relies on purely
numeric/boolean handling of the current implementation would be
incredibly surprised to find their AEL suddenly broken... so we need to
take that into account.
Indeed.

I realise that the better solution might be to wrap assignments (inside Set()
or MSet(), no matter) with $[..] *only* if the expressions contain arithmetic
operators + - * / and not if they are simple a=b assignments, including
a=${b}.

This would ensure that even if ${b} expanded to something containing a dash,
it would be interpreted as a mathematical minus sign in a=${b}



I would hesitate about making this happen as well.. without a migration-plan in place.

Typically:
1) Add a new option that would flip the behavior of var=val sets to auto-detect math and act accordingly on whether or not to use $[] (which comes with its own issues)

2) Warn about the change in the application: Ie: In Asterisk 20 there would be a warning stating in Asterisk 21 this will be the new default behavior


But, there's issues with auto-detecting math.  Because it's impossible for a compiler/transpiler to correctly assess *intent*. It can read the symbols and say, "Oh, I see you have some math symbols here, lets force this to math mode" in a purely search and replace context.  Here's the problem with that.  Variables can contain all kinds of (very unpredictable from a compiler perspective) stuff.

How is the compiler supposed to tell the difference between the following examples, for intent
var1 = ${a} + ${b} / ${c};
var2 = Hello World / Hello Bob / Hello Sue
var3 = *1*1*1* HEY THERE IS A PROBLEM *1*1*1
var4 = This-Is-Some-Dash-Separated-Data: 1-2-3-4-5-6

I'm not saying I personally write code like this, but there are some quick examples that can easily proof this to be the wrong approach

I think what you're looking for is quoted strings.
var1 = "This-Is-Some-Dash-Separated-Data: 1-2-3-4-5-6"
Which gets converted to an MSet(var1=$[ "This-Is-Some-Dash-Separated-Data: 1-2-3-4-5-6" ])

Which considering MSet actually has a desired behavior here of removing quotes, your value of var1 will be exactly what you expect it to be


AEL

  9999 => {

    var = "hi there - what's - up 0 * 1 / 4 not math";

    NoOp(${var});

  }


Dialplan:

vbox-markm-x64*CLI> dialplan show 9999@services

[ Context 'services' created by 'pbx_ael' ]

  '9999' =>         1. MSet(var=$[ "hi there - what's - up 0 * 1 / 4 not 
math"]) [pbx_ael]

                    2. NoOp(${var})                               [pbx_ael]



Execution:

MSet(var="hi there - what's - up 0 * 1 / 4 not math")

NoOp(hi there - what's - up 0 * 1 / 4 not math)


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

Check out the new Asterisk community forum at: https://community.asterisk.org/

New to Asterisk? Start here:
      https://wiki.asterisk.org/wiki/display/AST/Getting+Started

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to