hey all, thanks for you work on such a beautiful lang.
Small proposal. People sometimes get confused about data structures which based on maps.
for instance:
```
iex(3)> {:ok, datetime} = DateTime.now("Etc/UTC")
{:ok, ~U[2022-12-22 05:53:36.228720Z]}
iex(5)> is_struct(datetime)
true
iex(6)> is_map(datetime)
true
```
but here i got an error
```elixir
iex(11)> Enum.each(datetime, &Function.identity/1)
** (Protocol.UndefinedError) protocol Enumerable not implemented for ~U[2022-12-22 05:53:36.228720Z] of type DateTime (a struct)
```
i have in a codebase in function definition something like
`where is_map(map_name) and not is_struct(map_name)`
what i suggest to do is to create a macro `is_real_map` to check only real maps as a key-value storage with Enumerable impl
```elixir
@doc """
Returns true if `term` is a map and not is struct; otherwise returns `false`.
Allowed in guard tests.
## Examples
iex> is_real_map(%{oi: :blz})
true
iex> is_real_map(URI.parse("/"))
false
"""
@doc since: "1.16.0", guard: true
defmacro is_real_map(term) do
case __CALLER__.context do
nil ->
quote do
case unquote(term) do
%_{} -> false
%{} -> true
_ -> false
end
end
:match ->
invalid_match!(:is_real_map)
:guard ->
quote do
is_map(unquote(term)) and not :erlang.is_map_key(:__struct__, unquote(term))
end
end
end
```