On Tuesday, April 16, 2019 at 4:04:55 PM UTC-6, José Valim wrote:
>
> Elixir already has a perfectly fine syntax via curly brackets for creating
> ok and error tuples, that also works on matching, so my recommendation is
> still to build an extra vocabulary in your app or as a separate library.
>
Quite agree. Though one thing that I'd find immensely useful is a way to
match something out of a pipeline or error otherwise. Like currently there
is a `match?/2` function, it would be nice to have a generic `match/2`
function as well, which would take a matchspec (either erlang's, with of
course a nice elixir builder, or whatever...) and the value and it returns
back in the form as specified. Perhaps as a thought it could work like:
```elixir
# Via a matchspec that builds based on an `fn` similar to erlang's parse
transform:
iex(1)> match({:ok, 6.28}, fn {:ok, v} -> [v] end)
[6.28]
iex(2)> match({:error, "blah"}, fn {:ok, v} -> [v] end)
** (MatchError) no match of right hand side value: {:error, "blah"}
# Or maybe have a match/3 instead with a kind an anon-fun syntax with a
match/2 fallback to return all values, either by itself if 1 or as a tuple
containing all?
iex(3)> match({:ok, 6.28}, {:ok, _})
6.28
# &# syntax requires the output argument
iex(4)> match({:ok, 6.28}, {:ok, &1}, &1)
6.28
iex(4)> match({:ok, 6.28}, {:ok, &1}, [&1])
[6.28]
```
Of which a pipeline usage could look like:
```elixir
things
|> might_fail()
|> match({:ok, _})
|> assert(6.28)
```
Compared to the usual (or even larger and more wordy forms):
```elixir
things
|> might_fail()
|> case do {:ok, v} -> v end
|> assert(6.28)
```
Consequently the `match/2,3` macro can be implement fairly easily by just
falling down to a `case` expression with some rewriting of variable names
for ease of use (or don't, force the user to 'name' out the matcher parts
they want to use, though I like just `_` as a single-out nice bit,
consequently this is how I implemented it in the shell for this quick test).
Potential other alternative name might be something like `match_out`, but I
personally like `match` as the corresponding part of `match?`.
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-core/0684320c-b881-4cf5-8b96-601ee291c207%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.