diff options
Diffstat (limited to 'lib/stdlib/doc/src')
| -rw-r--r-- | lib/stdlib/doc/src/notes.xml | 261 | 
1 files changed, 0 insertions, 261 deletions
| diff --git a/lib/stdlib/doc/src/notes.xml b/lib/stdlib/doc/src/notes.xml index 76d49e37c2..87f5335723 100644 --- a/lib/stdlib/doc/src/notes.xml +++ b/lib/stdlib/doc/src/notes.xml @@ -31,267 +31,6 @@    </header>    <p>This document describes the changes made to the STDLIB application.</p> -<section><title>STDLIB 3.0</title> - -    <section><title>Fixed Bugs and Malfunctions</title> -      <list> -        <item> -	    <p> Fix a race bug affecting <c>dets:open_file/2</c>. -	    </p> -          <p> -	    Own Id: OTP-13260 Aux Id: seq13002 </p> -        </item> -        <item> -	    <p>Don't search for non-existing Map keys twice</p> -	    <p>For <c>maps:get/2,3</c> and <c>maps:find/2</c>, -	    searching for an immediate key, e.g. an atom, in a small -	    map, the search was performed twice if the key did not -	    exist.</p> -          <p> -	    Own Id: OTP-13459</p> -        </item> -        <item> -          <p> -	    Avoid stray corner-case math errors on Solaris, e.g. an -	    error is thrown on undeflows in exp() and pow() when it -	    shouldn't be.</p> -          <p> -	    Own Id: OTP-13531</p> -        </item> -        <item> -	    <p>Fix linting of map key variables</p> -	    <p>Map keys cannot be unbound and then used in parallel -	    matching.</p> -	    <p>Example: <c> #{ K := V } = #{ k := K } = M.</c> This -	    is illegal if <c>'K'</c> is not bound.</p> -          <p> -	    Own Id: OTP-13534 Aux Id: ERL-135 </p> -        </item> -      </list> -    </section> - - -    <section><title>Improvements and New Features</title> -      <list> -        <item> -	    <p>The types of The Abstract Format in the -	    <c>erl_parse</c> module have been refined. </p> -          <p> -	    Own Id: OTP-10292</p> -        </item> -        <item> -	    <p> Undocumented syntax for function specifications, -	    <c>-spec F/A :: Domain -> Range</c>, has been removed -	    (without deprecation). </p> <p> Using the -	    <c>is_subtype(V, T)</c> syntax for constraints (in -	    function specifications) is no longer documented, and the -	    newer syntax <c>V :: T</c> should be used instead. The -	    Erlang Parser still recognizes the <c>is_subtype</c> -	    syntax, and will continue to do so for some time. </p> -          <p> -	    *** POTENTIAL INCOMPATIBILITY ***</p> -          <p> -	    Own Id: OTP-11879</p> -        </item> -        <item> -	    <p>The '<c>random</c>' module has been deprecated. Use -	    the '<c>rand</c>' module instead.</p> -          <p> -	    Own Id: OTP-12502 Aux Id: OTP-12501 </p> -        </item> -        <item> -	    <p>Background: In record fields with a type declaration -	    but without an initializer, the Erlang parser inserted -	    automatically the singleton type <c>'undefined'</c> to -	    the list of declared types, if that value was not present -	    there. That is, the record declaration:</p> -          <p> -	    -record(rec, {f1 :: float(), f2 = 42 :: integer(), f3 :: -	    some_mod:some_typ()}).</p> -	    <p>was translated by the parser to:</p> -          <p> -	    -record(rec, {f1 :: float() | 'undefined', f2 = 42 :: -	    integer(), f3 :: some_mod:some_typ() | 'undefined'}).</p> -	    <p>The rationale for this was that creation of a "dummy" -	    <c>#rec{}</c> record should not result in a warning from -	    dialyzer that, for example, the implicit initialization -	    of the <c>#rec.f1</c> field violates its type -	    declaration.</p> -	    <p>Problems: This seemingly innocent action has some -	    unforeseen consequences.</p> -	    <p>For starters, there is no way for programmers to -	    declare that e.g. only floats make sense for the -	    <c>f1</c> field of <c>#rec{}</c> records when there is no -	    "obvious" default initializer for this field. (This also -	    affects tools like PropEr that use these declarations -	    produced by the Erlang parser to generate random -	    instances of records for testing purposes.)</p> -	    <p>It also means that dialyzer does not warn if e.g. an -	    <c>is_atom/1</c> test or something more exotic like an -	    <c>atom_to_list/1</c> call is performed on the value of -	    the <c>f1</c> field.</p> -	    <p>Similarly, there is no way to extend dialyzer to warn -	    if it finds record constructions where <c>f1</c> is not -	    initialized to some float.</p> -	    <p>Last but not least, it is semantically problematic -	    when the type of the field is an opaque type: creating a -	    union of an opaque and a structured type is very -	    problematic for analysis because it fundamentally breaks -	    the opacity of the term at that point.</p> -	    <p>Change: To solve these problems the parser will not -	    automatically insert the <c>'undefined'</c> value -	    anymore; instead the user has the option to choose the -	    places where this value makes sense (for the field) and -	    where it does not and insert the <c>| 'undefined'</c> -	    there manually.</p> -	    <p>Consequences of this change: This change means that -	    dialyzer will issue a warning for all places where -	    records with uninitialized fields are created and those -	    fields have a declared type that is incompatible with -	    <c>'undefined'</c> (e.g. <c>float()</c>). This warning -	    can be suppressed easily by adding <c>| 'undefined'</c> -	    to the type of this field. This also adds documentation -	    that the user really intends to create records where this -	    field is uninitialized.</p> -          <p> -	    *** POTENTIAL INCOMPATIBILITY ***</p> -          <p> -	    Own Id: OTP-12719</p> -        </item> -        <item> -	    <p> Remove deprecated functions in the modules -	    <c>erl_scan</c> and <c>erl_parse</c>. </p> -          <p> -	    Own Id: OTP-12861</p> -        </item> -        <item> -	    <p>The pre-processor can now expand the ?FUNCTION_NAME -	    and ?FUNCTION_ARITY macros.</p> -          <p> -	    Own Id: OTP-13059</p> -        </item> -        <item> -	    <p> A new behaviour <c>gen_statem</c> has been -	    implemented. It has been thoroughly reviewed, is stable -	    enough to be used by at least two heavy OTP applications, -	    and is here to stay. But depending on user feedback, we -	    do not expect but might find it necessary to make minor -	    not backwards compatible changes into OTP-20.0, so its -	    state can be designated as "not quite experimental"... -	    </p> <p> The <c>gen_statem</c> behaviour is intended to -	    replace <c>gen_fsm</c> for new code. It has the same -	    features and add some really useful: </p> <list -	    type="bulleted"> <item>State code is gathered</item> -	    <item>The state can be any term</item> <item>Events can -	    be postponed</item> <item>Events can be self -	    generated</item> <item>A reply can be sent from a later -	    state</item> <item>There can be multiple sys traceable -	    replies</item> </list> <p> The callback model(s) for -	    <c>gen_statem</c> differs from the one for -	    <c>gen_fsm</c>, but it is still fairly easy to rewrite -	    from <c>gen_fsm</c> to <c>gen_statem</c>. </p> -          <p> -	    Own Id: OTP-13065 Aux Id: PR-960 </p> -        </item> -        <item> -          <p> -	    Optimize binary:split/2 and binary:split/3 with native -	    BIF implementation.</p> -          <p> -	    Own Id: OTP-13082</p> -        </item> -        <item> -	    <p>Background: The types of record fields have since R12B -	    been put in a separate form by <c>epp:parse_file()</c>, -	    leaving the record declaration form untyped. The separate -	    form, however, does not follow the syntax of type -	    declarations, and parse transforms inspecting -	    <c>-type()</c> attributes need to know about the special -	    syntax. Since the compiler stores the return value of -	    <c>epp:parse_file()</c> as debug information in the -	    abstract code chunk (<c>"Abst"</c> or -	    <c>abstract_code</c>), tools too need to know about the -	    special syntax, if they inspect <c>-type()</c> attributes -	    in abstract code.</p> -	    <p>Change: No separate type form is created by -	    <c>epp:parse_file()</c>, but the type information is kept -	    in the record fields. This means that all parse -	    transforms and all tools inspecting <c>-record()</c> -	    declarations need to recognize <c>{typed_record_field, -	    Field, Type}</c>.</p> -          <p> -	    *** POTENTIAL INCOMPATIBILITY ***</p> -          <p> -	    Own Id: OTP-13148</p> -        </item> -        <item> -          <p> -	    Unsized fields of the type <c>bytes</c> in binary -	    generators are now forbidden. (The other ways of writing -	    unsized fields, such as <c>binary</c>, are already -	    forbidden.)</p> -          <p> -	    Own Id: OTP-13152</p> -        </item> -        <item> -	    <p> The type <c>map()</c> is built-in, and cannot be -	    redefined. </p> -          <p> -	    Own Id: OTP-13153</p> -        </item> -        <item> -	    <p> Let <c>dets:open_file()</c> exit with a <c>badarg</c> -	    message if given a raw file name (a binary). </p> -          <p> -	    Own Id: OTP-13229 Aux Id: ERL-55 </p> -        </item> -        <item> -	    <p> Add <c>filename:basedir/2,3</c></p> <p>basedir -	    returns suitable path(s) for 'user_cache', 'user_config', -	    'user_data', 'user_log', 'site_config' and 'site_data'. -	    On linux and linux like systems the paths will respect -	    the XDG environment variables.</p> -          <p> -	    Own Id: OTP-13392</p> -        </item> -        <item> -	    <p>There are new preprocessor directives -	    <c>-error(Term)</c> and <c>-warning(Term)</c> to cause a -	    compilation error or a compilation warning, -	    respectively.</p> -          <p> -	    Own Id: OTP-13476</p> -        </item> -        <item> -          <p> -	    Optimize <c>'++'</c> operator and <c>lists:append/2</c> -	    by using a single pass to build a new list while checking -	    for properness.</p> -          <p> -	    Own Id: OTP-13487</p> -        </item> -        <item> -          <p> -	    Add <c>maps:update_with/3,4</c> and <c>maps:take/2</c></p> -          <p> -	    Own Id: OTP-13522 Aux Id: PR-1025 </p> -        </item> -        <item> -	    <p><c>lists:join/2</c> has been added. Similar to -	    <c>string:join/2</c> but works with arbitrary lists.</p> -          <p> -	    Own Id: OTP-13523</p> -        </item> -        <item> -	    <p>Obfuscate asserts to make Dialyzer shut up.</p> -          <p> -	    Own Id: OTP-13524 Aux Id: PR-1002 </p> -        </item> -      </list> -    </section> - -</section> -  <section><title>STDLIB 2.8</title>      <section><title>Fixed Bugs and Malfunctions</title> | 
