Hi Chris,

To me the conclusion is exactly the opposite: since we have is_struct/2,
there is no need to add a bunch of guards to Kernel. Furthermore, adding
such guards to Kernel will only feel natural for Elixir built-types. For
everyone else, the usage is more bureaucratic (i.e. import/require a module
and then use it). So is_struct/2 is more consistent.

The argument that the Regex struct is an implementation detail does not
hold because, given that Elixir has limited built-in types, it has to be a
struct by definition. For example, if anyone has ever implemented a
protocol for Regex, you are relying on the fact it is a struct - as there
is literally no other option.

The MapSet is really an issue with Dialyzer not having a mechanism for us
to express the constructs we have in Elixir. As mentioned in the linked
issue, it manifests in other occasions too, and I would rather fix
Dialyzer. Furthermore, a "is_mapset" guard would have the same warnings as
is_struct/2", if any, so it wouldn't really address this problem.

In any case, Regex.regex? does send mixed signals now that we have
is_struct/2, so I will schedule it for deprecation in the long run. Thanks!


On Mon, Aug 17, 2020 at 2:08 AM Christopher Keele <christheke...@gmail.com>
wrote:

> With is_struct/2 coming in 1.11, I think it makes sense to add a guard for
> regexes at the same time.
>
> It is rarely appropriate for Elixir developers to destructure a Regex
> struct: its implementation is semi-opaque (partially evidenced by the fact
> that it carries a version number
> <https://github.com/elixir-lang/elixir/blob/1145dc01680aab7094f8a6dbd38b65185e14adb4/lib/elixir/lib/regex.ex#L146-L148>
> with it). The main exception is trying to pattern match on function
> parameters to determine if input is a regex versus something else.
>
> MapSet is another example of a stdlib struct whose implementation is
> versioned
> <https://github.com/elixir-lang/elixir/blob/1145dc01680aab7094f8a6dbd38b65185e14adb4/lib/elixir/lib/map_set.ex#L57-L61>,
> and might make more sense to have a guard for rather than expecting
> developers to pattern match it for typecheck guards. However, since it is
> fully opaque, there are other problems implementing a guard for them, as
> discussed here already:
> https://groups.google.com/g/elixir-lang-core/c/2KnRcKTZvuE/m/229Nfw0oCwAJ
>
> The fact that a Regex is a struct is much more of an implementation detail
> than some other, raw-data stdlib structs; like Range, Date, Version, and
> URI. An is_regex/1 would help make that clearer, and prevent code like
> this
> <https://github.com/boydm/phoenix_markdown/blob/ef7b5f76f339babec688021080a70708d9ddf1c1/lib/phoenix_markdown/engine.ex#L80-L88>
>  that
> has to choose between not using guards, or reaching into the struct
> implementation detail.
>
> considerations:
>
>    - we'd want to re-implement Regex.regex?/1 in terms of it and possibly
>    put that function into a deprecation path.
>       - we'd need to remove it as an example in the guard Naming
>       Convention
>       <https://hexdocs.pm/elixir/naming-conventions.html#is_-prefix-is_foo>
>       guide.
>    - could be implemented in either Regex or Kernel. adding to Kernel
>    sucks, but I think it would be a stronger commitment to the Regex struct
>    implementation being an opaque detail.
>       - it would make Regexs feel a lot more first-class Elixir
>       data-typey, which they already do a lot just by virtue of inspecting as
>       their sigil constructors.
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/071f08ea-f4cf-483e-bfe6-29d98af4bef7n%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-core/071f08ea-f4cf-483e-bfe6-29d98af4bef7n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BkHtDY3Uhdr9s6%2BtW_inE-N4QOS0nDzmwk5gq-YyeGvA%40mail.gmail.com.

Reply via email to