Thank you Eksperimental for a great and detailed proposal with working
implementation.

My biggest concern is that the "kinds" are not extensible. We are replacing
something that is extensible (defining functions) with an atom-tuple based
lookup that is not. Even if guards are somewhat limited, someone could
implement is_mfa/1, is_even/1 and is_odd/1 in their codebases today.

Therefore, in your proposal, how could someone add new kinds? If two
libraries define conflicting kinds, how can we resolve such conflicts? One
option is to make {:kind, 1} to always expand to is_kind(term, 1) but, if
that is the case, I would prefer to add defguard that makes it simpler to
define guards as regular macros without the kind indirection. I believe we
had a defguard proposal flying around at some point.

This proposal also blurries the line between guards and @specs. I would
love to have an unified view but I am not sure how such would eventually
work and I am worried that any step taken now may make it harder to move to
another direction in the future.


*José Valim*
www.plataformatec.com.br
Skype: jv.ptec
Founder and Director of R&D

On Thu, Aug 11, 2016 at 5:30 PM, eksperimental <eksperimen...@autistici.org>
wrote:

> Hi everyone in this list,
>
> I hope it has a good reception among the community, since it has the
> potential to change the way we write functions guards in a very positive
> and more natural way.
>
> Guards clauses are a key feature in Elixir. Researching
> how to make it easier for developers to define guards, has led me to
> two enhancement proposal. This is the first one, which will allow
> developers to write guards, guard safe macros and other clauses in a
> more natural and succinct way.
>
> All the following macros are allowed in guards:
> - `is_kind(term, kind)` determines if a given `term` is of a certain
>   `kind`.
> - `term is kinds` determines if `term` is each kind in `kinds`.
> - `term is_not kinds` determines if `term` is not of any of the `kinds`.
> - `term is_any kinds` determines if `term` is of any of the `kinds`.
> - `terms are kinds` determines if every term in list `terms` is of
>   every kind in `kinds`.
> - `terms are_not kinds` determines if every item in list `terms` is not
>   of `kind`.
> - `terms are_any kinds` determines if every term in list `terms` is not
>   of any of the `kinds`.
>
> Allowing us to write functions guards as regular code, that otherwise
> it would take a really long lines of code:
>
>   def check(letter) when letter is :char, do: true
>
>   iex> [100, 200] are [:even, {:>=, 100}]
>   true
>
> write expressions in a more natural way:
>   iex> term is_not nil
>
> as opposed to
>   iex> not is_nil(term)
>
> For a list of all supported kinds, see the list:
> https://gist.github.com/eksperimental/a6df4348e9675109e49ccf
> 4e34101bfe#list-of-supported-kinds-by-is_kind2
>
> Here's the proposal:
> https://gist.github.com/eksperimental/a6df4348e9675109e49ccf4e34101bfe
>
> and here the its full implementation:
> https://github.com/eksperimental/elixir/tree/is-kind
>
> Looking forwards to hear your opinions
>
> --
> 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/ms
> gid/elixir-lang-core/20160811223043.7a17eb02.eksperimental%40autistici.org
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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/CAGnRm4LtsnHP-WWCh-gpfrgV6fcR-c9q6pMxksunWtYWMB5brw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to