diff options
author | Björn Gustavsson <[email protected]> | 2016-03-01 06:23:36 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-03-01 13:59:22 +0100 |
commit | 205405f0bf1d2fa37d4c8170c11689a2937f5d9c (patch) | |
tree | a55b2a94a43ecf521db5c06a41be2af0a0eda44b /system | |
parent | 156aea75186fe9de64b87c2c6919db9abf4a0d60 (diff) | |
download | otp-205405f0bf1d2fa37d4c8170c11689a2937f5d9c.tar.gz otp-205405f0bf1d2fa37d4c8170c11689a2937f5d9c.tar.bz2 otp-205405f0bf1d2fa37d4c8170c11689a2937f5d9c.zip |
Generalize bit string comprehensions
The expression in a bit string comprehension is limited to a
literal bit string expression. That is, the following code
is legal:
<< <<X>> || X <- List >>
but not this code:
<< foo(X) || X <- List >>
The limitation is annoying. For one thing, tools that transform
the abstract format must be careful not to produce code such as:
<< begin
%% Some instrumentation code.
<<X>>
end || X <- List >>
One reason for the limitation could be that we'll get
reduce/reduce conflicts if we try to allow an arbitrary
expression in a bit string comprehension:
binary_comprehension -> '<<' expr '||' lc_exprs '>>' :
{bc,?anno('$1'),'$2','$4'}.
Unfortunately, there does not seem to be an easy way to work
around that problem. The best we can do is to allow 'expr_max'
expressions (as in the binary syntax):
binary_comprehension -> '<<' expr_max '||' lc_exprs '>>' :
{bc,?anno('$1'),'$2','$4'}.
That will work, but functions calls must be enclosed in
parentheses:
<< (foo(X)) || X <- List >>
Diffstat (limited to 'system')
-rw-r--r-- | system/doc/reference_manual/expressions.xml | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/system/doc/reference_manual/expressions.xml b/system/doc/reference_manual/expressions.xml index e98fcbcbb9..75486488e9 100644 --- a/system/doc/reference_manual/expressions.xml +++ b/system/doc/reference_manual/expressions.xml @@ -1556,9 +1556,11 @@ end</pre> <p>Bit string comprehensions are written with the following syntax:</p> <pre> -<< BitString || Qualifier1,...,QualifierN >></pre> - <p>Here, <c>BitString</c> is a bit string expression and each - <c>Qualifier</c> is either a generator, a bit string generator or a filter.</p> +<< BitStringExpr || Qualifier1,...,QualifierN >></pre> + <p><c>BitStringExpr</c> is an expression that evalutes to a bit + string. If <c>BitStringExpr</c> is a function call, it must be + enclosed in parentheses. Each <c>Qualifier</c> is either a + generator, a bit string generator or a filter.</p> <list type="bulleted"> <item>A <em>generator</em> is written as: <br></br> <c><![CDATA[Pattern <- ListExpr]]></c>. <br></br> |