13
13
compliance with the License. You should have received a copy of the
14
14
Erlang Public License along with this software. If not, it can be
15
15
retrieved online at http://www.erlang.org/.
17
17
Software distributed under the License is distributed on an "AS IS"
18
18
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
19
19
the License for the specific language governing rights and limitations
24
24
<title>Match specifications in Erlang</title>
117
117
<c><![CDATA[display]]></c> | <c><![CDATA[caller]]></c> | <c><![CDATA[set_tcw]]></c> |
118
118
<c><![CDATA[silent]]></c></item>
121
<p>A match_spec used in ets can be described in this <em>informal</em> grammar:</p>
122
<list type="bulleted">
123
<item>MatchExpression ::= [ MatchFunction, ... ]
125
<item>MatchFunction ::= { MatchHead, MatchConditions, MatchBody }
127
<item>MatchHead ::= MatchVariable | <c><![CDATA['_']]></c> | { MatchHeadPart, ... }
129
<item>MatchHeadPart ::= term() | MatchVariable | <c><![CDATA['_']]></c></item>
130
<item>MatchVariable ::= '$<number>'
132
<item>MatchConditions ::= [ MatchCondition, ...] | <c><![CDATA[[]]]></c></item>
133
<item>MatchCondition ::= { GuardFunction } |
134
{ GuardFunction, ConditionExpression, ... }
136
<item>BoolFunction ::= <c><![CDATA[is_atom]]></c> | <c><![CDATA[is_constant]]></c> |
137
<c><![CDATA[is_float]]></c> | <c><![CDATA[is_integer]]></c> | <c><![CDATA[is_list]]></c> |
138
<c><![CDATA[is_number]]></c> | <c><![CDATA[is_pid]]></c> | <c><![CDATA[is_port]]></c> |
139
<c><![CDATA[is_reference]]></c> | <c><![CDATA[is_tuple]]></c> | <c><![CDATA[is_binary]]></c> |
140
<c><![CDATA[is_function]]></c> | <c><![CDATA[is_record]]></c> | <c><![CDATA[is_seq_trace]]></c> |
141
<c><![CDATA['and']]></c> | <c><![CDATA['or']]></c> | <c><![CDATA['not']]></c> | <c><![CDATA['xor']]></c> |
142
<c><![CDATA[andalso]]></c> | <c><![CDATA[orelse]]></c></item>
143
<item>ConditionExpression ::= ExprMatchVariable | { GuardFunction } |
144
{ GuardFunction, ConditionExpression, ... } | TermConstruct
146
<item>ExprMatchVariable ::= MatchVariable (bound in the MatchHead) |
147
<c><![CDATA['$_']]></c> | <c><![CDATA['$$']]></c></item>
148
<item>TermConstruct = {{}} | {{ ConditionExpression, ... }} |
149
<c><![CDATA[[]]]></c> | [ConditionExpression, ...] | NonCompositeTerm | Constant
151
<item>NonCompositeTerm ::= term() (not list or tuple)
153
<item>Constant ::= {<c><![CDATA[const]]></c>, term()}
155
<item>GuardFunction ::= BoolFunction | <c><![CDATA[abs]]></c> |
156
<c><![CDATA[element]]></c> | <c><![CDATA[hd]]></c> | <c><![CDATA[length]]></c> | <c><![CDATA[node]]></c> |
157
<c><![CDATA[round]]></c> | <c><![CDATA[size]]></c> | <c><![CDATA[tl]]></c> | <c><![CDATA[trunc]]></c> |
158
<c><![CDATA['+']]></c> | <c><![CDATA['-']]></c> | <c><![CDATA['*']]></c> | <c><![CDATA['div']]></c> |
159
<c><![CDATA['rem']]></c> | <c><![CDATA['band']]></c> | <c><![CDATA['bor']]></c> | <c><![CDATA['bxor']]></c> |
160
<c><![CDATA['bnot']]></c> | <c><![CDATA['bsl']]></c> | <c><![CDATA['bsr']]></c> | <c><![CDATA['>']]></c> |
161
<c><![CDATA['>=']]></c> | <c><![CDATA['<']]></c> | <c><![CDATA['=<']]></c> | <c><![CDATA['=:=']]></c> |
162
<c><![CDATA['==']]></c> | <c><![CDATA['=/=']]></c> | <c><![CDATA['/=']]></c> | <c><![CDATA[self]]></c> |
163
<c><![CDATA[get_tcw]]></c></item>
164
<item>MatchBody ::= [ ConditionExpression, ... ]</item>
363
<cell align="left" valign="middle">Expression\011\011</cell>
364
<cell align="left" valign="middle">Variable bindings\011\011</cell>
365
<cell align="left" valign="middle">Result\011</cell>
409
<cell align="left" valign="middle">Expression </cell>
410
<cell align="left" valign="middle">Variable bindings </cell>
411
<cell align="left" valign="middle">Result </cell>
368
<cell align="left" valign="middle">{{'$1','$2'}}\011\011</cell>
414
<cell align="left" valign="middle">{{'$1','$2'}} </cell>
369
415
<cell align="left" valign="middle">'$1' = a, '$2' = b</cell>
370
416
<cell align="left" valign="middle">{a,b}</cell>
373
<cell align="left" valign="middle">{const, {'$1', '$2'}}\011</cell>
419
<cell align="left" valign="middle">{const, {'$1', '$2'}} </cell>
374
420
<cell align="left" valign="middle">doesn't matter</cell>
375
421
<cell align="left" valign="middle">{'$1', '$2'}</cell>
378
<cell align="left" valign="middle">a\011\011\011</cell>
379
<cell align="left" valign="middle">doesn't matter\011\011\011</cell>
424
<cell align="left" valign="middle">a </cell>
425
<cell align="left" valign="middle">doesn't matter </cell>
380
426
<cell align="left" valign="middle">a</cell>
383
<cell align="left" valign="middle">'$1'\011\011\011</cell>
384
<cell align="left" valign="middle">'$1' = []\011\011\011</cell>
429
<cell align="left" valign="middle">'$1' </cell>
430
<cell align="left" valign="middle">'$1' = [] </cell>
385
431
<cell align="left" valign="middle">[]</cell>
388
<cell align="left" valign="middle">['$1']\011\011\011</cell>
389
<cell align="left" valign="middle">'$1' = []\011\011\011</cell>
434
<cell align="left" valign="middle">['$1'] </cell>
435
<cell align="left" valign="middle">'$1' = [] </cell>
390
436
<cell align="left" valign="middle">[[]]</cell>
393
<cell align="left" valign="middle">[{{a}}]\011\011\011</cell>
439
<cell align="left" valign="middle">[{{a}}] </cell>
394
440
<cell align="left" valign="middle">doesn't matter</cell>
395
441
<cell align="left" valign="middle">[{a}]</cell>
398
<cell align="left" valign="middle">42\011\011\011</cell>
444
<cell align="left" valign="middle">42 </cell>
399
445
<cell align="left" valign="middle">doesn't matter</cell>
400
446
<cell align="left" valign="middle">42</cell>
403
<cell align="left" valign="middle">"hello"\011\011\011</cell>
449
<cell align="left" valign="middle">"hello" </cell>
404
450
<cell align="left" valign="middle">doesn't matter</cell>
405
451
<cell align="left" valign="middle">"hello"</cell>
408
<cell align="left" valign="middle">$1\011\011\011</cell>
454
<cell align="left" valign="middle">$1 </cell>
409
455
<cell align="left" valign="middle">doesn't matter</cell>
410
456
<cell align="left" valign="middle">49 (the ASCII value for the character '1')</cell>
454
500
<title>Differences between match specifications in ETS and tracing</title>
455
501
<p>ETS match specifications are there to produce a return
456
value. Usually the expression contains one single
457
<c><![CDATA[ActionTerm]]></c> which defines the return value without having
502
value. Usually the <c><![CDATA[MatchBody]]></c> contains one single
503
<c><![CDATA[ConditionExpression]]></c> which defines the return value without having
458
504
any side effects. Calls with side effects are not allowed in the
460
506
<p>When tracing there is no return value to produce, the
507
553
a list which in turn begins with the second argument times
508
554
two (i. e. [{[4,x],y},2] or [{[8], y, z},4])</p>
509
555
<code type="none"><![CDATA[
510
[{['$1', '$2'],\011[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
556
[{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
513
559
<p>Match three arguments. When all three are equal and are
514
560
numbers, append the process dump to the trace message, else