|   | 1 | == Matching == | 
          
          
            |   | 2 |   Prefer named arguments::  | 
          
          
            |   | 3 |     When matching a uniontype, prefer using named arguments to only match what is used. A match using named arguments only needs to be changed if the matched fields change in a uniontype, while a match using positional arguments will always have to be changed if the uniontype changes. | 
          
          
            |   | 4 |     {{{#!mo | 
          
          
            |   | 5 |     // Prefer this. | 
          
          
            |   | 6 |     case DAE.ARRAY(ty = array_ty)   | 
          
          
            |   | 7 |  | 
          
          
            |   | 8 |     // Not this. | 
          
          
            |   | 9 |     case DAE.ARRAY(array_ty, _, _)  | 
          
          
            |   | 10 |     }}} | 
          
          
            |   | 11 |     One exception is when matching all fields in a uniontype, doing some changes to them, and then constructing a new instance of the same type. In that case the code will need to be updated if the uniontype changes anyway, so using positional arguments will give cleaner code. | 
          
          
            |   | 12 |     {{{#!mo | 
          
          
            |   | 13 |     case DAE.ARRAY(array_ty, is_scalar, expl) | 
          
          
            |   | 14 |       equation | 
          
          
            |   | 15 |         expl = listRest(expl); | 
          
          
            |   | 16 |       then | 
          
          
            |   | 17 |         DAE.ARRAY(array_ty, is_scalar, expl) | 
          
          
            |   | 18 |     }}} | 
          
          
            |   | 19 |    | 
          
          
            |   | 20 |   Use {{{else}}} for catch-all:: | 
          
          
            |   | 21 |     Prefer using {{{else}}} when writing a catch-all case: | 
          
          
            |   | 22 |     {{{#!mo | 
          
          
            |   | 23 |     outValue := match(inExp1, inExp2) | 
          
          
            |   | 24 |       local | 
          
          
            |   | 25 |         Integer i1, i2; | 
          
          
            |   | 26 |  | 
          
          
            |   | 27 |       case (DAE.ICONST(integer = i1), DAE.ICONST(integer = i2)) then i1 + i2; | 
          
          
            |   | 28 |       else 0; | 
          
          
            |   | 29 |  | 
          
          
            |   | 30 |       // Avoid this: | 
          
          
            |   | 31 |       case (_, _) then 0; | 
          
          
            |   | 32 |       // And this (using 'then' is legal, but unnecessary): | 
          
          
            |   | 33 |       else then 0; | 
          
          
            |   | 34 |     end match; | 
          
          
            |   | 35 |     }}} | 
          
          
            |   | 36 |   Use {{{as}}} only for partial matches:: | 
          
          
            |   | 37 |     {{{as}}} is usually not necessary when matching a whole input argument, such as this: | 
          
          
            |   | 38 |     {{{#!mo | 
          
          
            |   | 39 |     _ := match(inExp, inStr) | 
          
          
            |   | 40 |       local | 
          
          
            |   | 41 |         DAE.Exp exp; | 
          
          
            |   | 42 |         String str; | 
          
          
            |   | 43 |  | 
          
          
            |   | 44 |       case (exp as DAE.CALL(path = Absyn.IDENT("sum")), _) then ExpressionDump.printExpStr(exp); | 
          
          
            |   | 45 |       case (_, str as "someString") then str; | 
          
          
            |   | 46 |     end match; | 
          
          
            |   | 47 |     }}} | 
          
          
            |   | 48 |     Prefer using the input parameters directly instead: | 
          
          
            |   | 49 |     {{{#!mo | 
          
          
            |   | 50 |     _ := match(inExp, inStr) | 
          
          
            |   | 51 |       case (DAE.CALL(path = Absyn.IDENT("sum")), _) then ExpressionDump.printExpStr(inExp); | 
          
          
            |   | 52 |       case (_, "someString") then inStr; | 
          
          
            |   | 53 |     end match; | 
          
          
            |   | 54 |     }}} |