| | 1 | = Upgrade module interface = |
| | 2 | |
| | 3 | This transformation upgrades the calls of the old regular expression module regexp to the new re module. The transformation is based on a generic interface upgrade module, which is invoked with the right structural and semantic change descriptors. |
| | 4 | |
| | 5 | An example of upgrading regexp interface: |
| | 6 | |
| | 7 | {{{ |
| | 8 | case regexp:match(String, RE) of |
| | 9 | {error, Reason} -> throw("Error: " ++ lists:flatten( |
| | 10 | regexp:format_error(Reason))); |
| | 11 | {match, 1, Len} -> Len; |
| | 12 | {match, St, Len} -> use(St, Len); |
| | 13 | nomatch -> ok |
| | 14 | end |
| | 15 | }}} |
| | 16 | |
| | 17 | Result: |
| | 18 | |
| | 19 | {{{ |
| | 20 | try re:run(String, RE, [{capture, first}]) of |
| | 21 | {match, [{0, Len}]} -> Len; % [{1-1, Len}] works too |
| | 22 | {match, [{St, Len}]} -> use(St+1, Len); |
| | 23 | nomatch -> ok |
| | 24 | catch |
| | 25 | error:badarg -> throw("Error: " ++ lists:flatten( |
| | 26 | "Bad regular expression")) |
| | 27 | end |
| | 28 | }}} |
| | 29 | |
| | 30 | |
| | 31 | == Side conditions == |
| | 32 | |
| | 33 | * Patterns belong to applications to be updated should match at least one of the patterns written in the change descriptors. |
| | 34 | |
| | 35 | |
| | 36 | == Transformation steps and compensations == |
| | 37 | |
| | 38 | 1. Updating the function application: |
| | 39 | * Modifying the called function’s identifier {{{regexp:match ->re:run}}} |
| | 40 | * Matching the old function arguments and creating the new argument list {{{(String, RE) -> (String, RE, [capture, first])}}} |
| | 41 | |
| | 42 | 2. Finding the patterns to be updated and performing on them the matching and the replacing. Furthermore, applying the correction functions on the variable bindings or/and usages. |
| | 43 | * Pattern: {{{match, 1, Len -> match, [0, Len]}}} |
| | 44 | * Expression: {{{use(St, Len) -> use(St+1, Len)}}} |
| | 45 | |
| | 46 | 3. Turning the case expression to a try expression and moving error pattern to the catch block (error:badarg is moved to a catch block after we changed case expression to try expression). |