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: +
+Maps are considered experimental during OTP 17 and may be subject to change.
-The documentation below describes it being possible to use arbitrary - expressions or variables as keys, this is NOT implemented in the current - version of Erlang/OTP.
-Exceptions returns
- 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: -
-