From bd64ad8e15d66e48b36dbe3584315dd5cfc8b59a Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Wed, 11 May 2016 17:22:23 +0200 Subject: Prepare release --- lib/stdlib/doc/src/notes.xml | 261 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) (limited to 'lib/stdlib/doc/src/notes.xml') diff --git a/lib/stdlib/doc/src/notes.xml b/lib/stdlib/doc/src/notes.xml index 87f5335723..76d49e37c2 100644 --- a/lib/stdlib/doc/src/notes.xml +++ b/lib/stdlib/doc/src/notes.xml @@ -31,6 +31,267 @@

This document describes the changes made to the STDLIB application.

+
STDLIB 3.0 + +
Fixed Bugs and Malfunctions + + +

Fix a race bug affecting dets:open_file/2. +

+

+ Own Id: OTP-13260 Aux Id: seq13002

+
+ +

Don't search for non-existing Map keys twice

+

For maps:get/2,3 and maps:find/2, + searching for an immediate key, e.g. an atom, in a small + map, the search was performed twice if the key did not + exist.

+

+ Own Id: OTP-13459

+
+ +

+ 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.

+

+ Own Id: OTP-13531

+
+ +

Fix linting of map key variables

+

Map keys cannot be unbound and then used in parallel + matching.

+

Example: #{ K := V } = #{ k := K } = M. This + is illegal if 'K' is not bound.

+

+ Own Id: OTP-13534 Aux Id: ERL-135

+
+
+
+ + +
Improvements and New Features + + +

The types of The Abstract Format in the + erl_parse module have been refined.

+

+ Own Id: OTP-10292

+
+ +

Undocumented syntax for function specifications, + -spec F/A :: Domain -> Range, has been removed + (without deprecation).

Using the + is_subtype(V, T) syntax for constraints (in + function specifications) is no longer documented, and the + newer syntax V :: T should be used instead. The + Erlang Parser still recognizes the is_subtype + syntax, and will continue to do so for some time.

+

+ *** POTENTIAL INCOMPATIBILITY ***

+

+ Own Id: OTP-11879

+
+ +

The 'random' module has been deprecated. Use + the 'rand' module instead.

+

+ Own Id: OTP-12502 Aux Id: OTP-12501

+
+ +

Background: In record fields with a type declaration + but without an initializer, the Erlang parser inserted + automatically the singleton type 'undefined' to + the list of declared types, if that value was not present + there. That is, the record declaration:

+

+ -record(rec, {f1 :: float(), f2 = 42 :: integer(), f3 :: + some_mod:some_typ()}).

+

was translated by the parser to:

+

+ -record(rec, {f1 :: float() | 'undefined', f2 = 42 :: + integer(), f3 :: some_mod:some_typ() | 'undefined'}).

+

The rationale for this was that creation of a "dummy" + #rec{} record should not result in a warning from + dialyzer that, for example, the implicit initialization + of the #rec.f1 field violates its type + declaration.

+

Problems: This seemingly innocent action has some + unforeseen consequences.

+

For starters, there is no way for programmers to + declare that e.g. only floats make sense for the + f1 field of #rec{} 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.)

+

It also means that dialyzer does not warn if e.g. an + is_atom/1 test or something more exotic like an + atom_to_list/1 call is performed on the value of + the f1 field.

+

Similarly, there is no way to extend dialyzer to warn + if it finds record constructions where f1 is not + initialized to some float.

+

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.

+

Change: To solve these problems the parser will not + automatically insert the 'undefined' 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 | 'undefined' + there manually.

+

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 + 'undefined' (e.g. float()). This warning + can be suppressed easily by adding | 'undefined' + to the type of this field. This also adds documentation + that the user really intends to create records where this + field is uninitialized.

+

+ *** POTENTIAL INCOMPATIBILITY ***

+

+ Own Id: OTP-12719

+
+ +

Remove deprecated functions in the modules + erl_scan and erl_parse.

+

+ Own Id: OTP-12861

+
+ +

The pre-processor can now expand the ?FUNCTION_NAME + and ?FUNCTION_ARITY macros.

+

+ Own Id: OTP-13059

+
+ +

A new behaviour gen_statem 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"... +

The gen_statem behaviour is intended to + replace gen_fsm for new code. It has the same + features and add some really useful:

State code is gathered + The state can be any term Events can + be postponed Events can be self + generated A reply can be sent from a later + state There can be multiple sys traceable + replies

The callback model(s) for + gen_statem differs from the one for + gen_fsm, but it is still fairly easy to rewrite + from gen_fsm to gen_statem.

+

+ Own Id: OTP-13065 Aux Id: PR-960

+
+ +

+ Optimize binary:split/2 and binary:split/3 with native + BIF implementation.

+

+ Own Id: OTP-13082

+
+ +

Background: The types of record fields have since R12B + been put in a separate form by epp:parse_file(), + leaving the record declaration form untyped. The separate + form, however, does not follow the syntax of type + declarations, and parse transforms inspecting + -type() attributes need to know about the special + syntax. Since the compiler stores the return value of + epp:parse_file() as debug information in the + abstract code chunk ("Abst" or + abstract_code), tools too need to know about the + special syntax, if they inspect -type() attributes + in abstract code.

+

Change: No separate type form is created by + epp:parse_file(), but the type information is kept + in the record fields. This means that all parse + transforms and all tools inspecting -record() + declarations need to recognize {typed_record_field, + Field, Type}.

+

+ *** POTENTIAL INCOMPATIBILITY ***

+

+ Own Id: OTP-13148

+
+ +

+ Unsized fields of the type bytes in binary + generators are now forbidden. (The other ways of writing + unsized fields, such as binary, are already + forbidden.)

+

+ Own Id: OTP-13152

+
+ +

The type map() is built-in, and cannot be + redefined.

+

+ Own Id: OTP-13153

+
+ +

Let dets:open_file() exit with a badarg + message if given a raw file name (a binary).

+

+ Own Id: OTP-13229 Aux Id: ERL-55

+
+ +

Add filename:basedir/2,3

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.

+

+ Own Id: OTP-13392

+
+ +

There are new preprocessor directives + -error(Term) and -warning(Term) to cause a + compilation error or a compilation warning, + respectively.

+

+ Own Id: OTP-13476

+
+ +

+ Optimize '++' operator and lists:append/2 + by using a single pass to build a new list while checking + for properness.

+

+ Own Id: OTP-13487

+
+ +

+ Add maps:update_with/3,4 and maps:take/2

+

+ Own Id: OTP-13522 Aux Id: PR-1025

+
+ +

lists:join/2 has been added. Similar to + string:join/2 but works with arbitrary lists.

+

+ Own Id: OTP-13523

+
+ +

Obfuscate asserts to make Dialyzer shut up.

+

+ Own Id: OTP-13524 Aux Id: PR-1002

+
+
+
+ +
+
STDLIB 2.8
Fixed Bugs and Malfunctions -- cgit v1.2.3