From 274e5b47bfbc86e8b9591134f28da9ef68f87221 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
+ Constructing a new map is done by letting an expression
#{ K => V }
+ + New maps may include multiple associations at construction by listing every + association: +
+#{ K1 => V1, .., Kn => Vn }
+ + An empty map is constructed by not associating any terms with each other: +
+#{}
+ + All keys and values in the map are terms. Any expression is first evaluated and + then the resulting terms are used as key and value respectively. +
+
+ Keys and values are separated by the
+ Examples: +
+
+M0 = #{}, % empty map
+M1 = #{a => <<"hello">>}, % single association with literals
+M2 = #{1 => 2, b => b}, % multiple associations with literals
+M3 = #{k => {A,B}}, % single association with variables
+M4 = #{{"w", 1} => f()}. % compound key associated with an evaluated expression
+
+ where,
+ If two matching keys are declared, the latter key will take precedence. +
++ Example: +
+ ++1> #{1 => a, 1 => b}. +#{1 => b } +2> #{1.0 => a, 1 => b}. +#{1 => b, 1.0 => a} ++
+ The order in which the expressions constructing the keys and their + associated values are evaluated is not defined. The syntactic order of + the key-value pairs in the construction is of no relevance, except in + the above mentioned case of two matching keys. +
++ Updating a map has similar syntax as constructing it. +
++ An expression defining the map to be updated is put in front of the expression + defining the keys to be updated and their respective values. +
+M#{ K => V }
+
+ where
+ If key
+ If
+ To only update an existing value, the following syntax is used, +
+M#{ K := V }
+
+ where
+ If key
+ If
+ Examples: +
+
+M0 = #{},
+M1 = M0#{a => 0},
+M2 = M1#{a => 1, b => 2},
+M3 = M2#{"function" => fun() -> f() end},
+M4 = M3#{a := 2, b := 3}. % 'a' and 'b' was added in `M1` and `M2`.
+
+ where
+ More Examples: +
++1> M = #{1 => a}. +#{1 => a } +2> M#{1.0 => b}. +#{1 => a, 1.0 => b}. +3> M#{1 := b}. +#{1 => b} +4> M#{1.0 := b}. +** exception error: bad argument ++
+ As in construction, the order in which the key and value expressions + are evaluated is not defined. The + syntactic order of the key-value pairs in the update is of no + relevance, except in the case where two keys match, in which + case the latter value is used. +
++ Matching of key-value associations from maps is done in the following way: +
+ +#{ K := V } = M
+
+ where
+ If the variable
Example:
+
+1> M = #{"tuple" => {1,2}}.
+#{"tuple" => {1,2}}
+2> #{"tuple" := {1,B}} = M.
+#{"tuple" => {1,2}}
+3> B.
+2.
+
+ This will bind variable
+ Similarly, multiple values from the map may be matched: +
+#{ K1 := V1, .., Kn := Vn } = M
+
+ where keys
+ If the matching conditions are not met, the match will fail, either with +
+
+ Matching in maps only allows for
+ Duplicate keys are allowed in matching and will match each pattern associated + to the keys. +
+#{ K := V1, K := V2 } = M
+ + Matching an expression against an empty map literal will match its type but + no variables will be bound: +
+#{} = Expr
+
+ This expression will match if the expression
+ Matching of literals as keys are allowed in function heads. +
+
+%% only start if not_started
+handle_call(start, From, #{ state := not_started } = S) ->
+...
+ {reply, ok, S#{ state := start }};
+
+%% only change if started
+handle_call(change, From, #{ state := start } = S) ->
+...
+ {reply, ok, S#{ state := changed }};
+ + Maps are allowed in guards as long as all sub-expressions are valid guard expressions. +
++ Two guard BIFs handles maps: +
+