Would it be possible to extend current with statement's expressiveness by two lowerings:

1) Alias expression/symbol and replace in macro fashion:
with (a : exprA) { /* use a. will be replaced by exprA by compiler. */ } 2) Accept a list of arguments: with (a, b : expr , ...) {} gets lowered to
   with (a) with (b : expr) ... {}

As a result, the following would be allowed:

with (aSymb, anExpr, aTempInst, a: symbA, b: exprB, c: tempInstC)
{
    // - current rules for aSymb, anExpr, aTempInst.
// - a, b and c are replaced by symbA, exprB and tempInstC, respectively.
}

For example:

foreach (ref el; elements) with (
    M   : el.aMatrix,
    Ex  : el.someProperties.someModulusX,
    Ey  : el.someProperties.someModulusY,
    G   : el.someProperties.anotherModulus,
    vxy : el.someProperties.aRatio,
    vyx : el.someProperties.anotherRatio)
{
    M = [[1/Ex,    -vyx/Ey,   0],
         [-vxy/Ex,    1/Ey,   0],
         [0,             0, 1/G]];
}

struct SomeProperties (T) {
    T someModulusX;
    T someModulusY;
    T anotherModulus;
    T aRatio;
    T anotherRatio;
    ...
}

struct Element (T) {
    T aMatrix;
    SomeProperties!T someProperties;
    ...
}

Element!float[] elements; elements.length = N;

Reply via email to