They probably shouldn't been lists in the first place but that ship sailed a long time ago.
If you need to work with them dynamically, the API is there. It just shouldn't be encouraged and adding functions such as Tuple.wrap could end-up having the opposite effect: encouraging more dynamic work making everyone's life harder, rather than easier. *José Valim* www.plataformatec.com.br Skype: jv.ptec Founder and Director of R&D On Wed, Apr 17, 2019 at 1:32 AM <t...@scalpel.com> wrote: > I agree that they are rarely used dynamically, but when they are they can > be quite the pain to work with. > > For example, if you are doing any work with ASN.1 dynamic tuples are > everywhere. Any advanced work in cryptography or telecom becomes harder to > work with than I would like it to be. > > On Tuesday, April 16, 2019 at 7:24:15 PM UTC-4, José Valim wrote: >> >> Well, the difference is really in their usage. Tuples are rarely used >> dynamically, you usually want to see tuples as literals in your code. The >> Tuple docs also mention it: >> >> > The functions in this module that add and remove elements from tuples >> are >> > rarely used in practice, as they typically imply tuples are being used >> as >> > collections. To append to a tuple, it is preferable to use pattern >> matching >> >> >> *José Valim* >> www.plataformatec.com.br >> Skype: jv.ptec >> Founder and Director of R&D >> >> >> On Wed, Apr 17, 2019 at 1:20 AM <t...@scalpel.com> wrote: >> >>> I see your point. >>> >>> I was thinking more along the lines of consistency in the API design. If >>> you can wrap an item in a list why can't you wrap it in a tuple? *If >>> you could wrap things in tuples* then you *could* insert a value at the >>> front of said tuple.This is more of an exercise in "you could" rather than >>> "you should". >>> >>> On Tuesday, April 16, 2019 at 7:07:33 PM UTC-4, José Valim wrote: >>>> >>>> If the choice is between: >>>> >>>> value |> Tuple.wrap() |> Tuple.insert_at(0, :ok) >>>> >>>> >>>> and >>>> >>>> {:ok, value} >>>> >>>> >>>> I believe we should choose the second every time. >>>> >>>> If the choice is between: >>>> >>>> value >>>> |> very() >>>> |> long() >>>> |> pipeline() >>>> |> Tuple.wrap() >>>> |> Tuple.insert_at(0, :ok) >>>> >>>> >>>> and: >>>> >>>> >>>> value >>>> |> very() >>>> |> long() >>>> |> pipeline() >>>> |> OkError.ok() >>>> >>>> >>>> and: >>>> >>>> >>>> var = >>>> value >>>> |> very() >>>> |> long() >>>> |> pipeline() >>>> >>>> {:ok, var} >>>> >>>> >>>> I don't see any reason why we should ever do the first one. >>>> >>>> So I really don't see which problem Tuple.wrap is supposed to solve. >>>> >>>> *José Valim* >>>> www.plataformatec.com.br >>>> Skype: jv.ptec >>>> Founder and Director of R&D >>>> >>>> >>>> On Wed, Apr 17, 2019 at 12:58 AM <t...@scalpel.com> wrote: >>>> >>>>> I understand that this is possible, and thank you for the suggestion >>>>> but I'm not the biggest fan of anonymous functions. >>>>> >>>>> When I go back and read programs written this way I can't tell if I >>>>> wrote the code or a cat walked on my keyboard. >>>>> >>>>> On Tuesday, April 16, 2019 at 6:54:16 PM UTC-4, Ryan Winchester wrote: >>>>>> >>>>>> Yeah, sorry >>>>>> >>>>>> value |> (&{:ok, &1}).() >>>>>> >>>>>> On April 16, 2019 at 3:51:28 PM, Ryan Winchester ( >>>>>> he...@ryanwinchester.ca ) wrote: >>>>>> >>>>>> value |> (&{&1}).() |> Tuple.insert_at(0, :ok) >>>>>> >>>>>> On April 16, 2019 at 3:47:58 PM, t...@scalpel.com (t...@scalpel.com >>>>>> ) wrote: >>>>>> >>>>>> Fair enough, I know when to give up on a losing battle. >>>>>> >>>>>> Would you consider an alternative like Tuple.wrap/1. It would work >>>>>> exactly like List.wrap/1 but doesn't carry the baggage that "error" and >>>>>> "ok" would have. This way I could still accomplish the goal of keeping >>>>>> pipe >>>>>> chains clean with something like. >>>>>> >>>>>> value |> Tuple.wrap() |> Tuple.insert_at(0, :ok) >>>>>> >>>>>> Which is a bit wordier but functionally equivalent to the original >>>>>> proposal. >>>>>> >>>>>> On Tuesday, April 16, 2019 at 6:04:55 PM UTC-4, José Valim wrote: >>>>>>> >>>>>>> Hi Tom, >>>>>>> >>>>>>> You don't have to buy the arguments, we can agree to disagree, but >>>>>>> they are still the reason for not adding such functions to Elixir. :) >>>>>>> >>>>>>> I also agree with is_even and is_odd being similar convenience >>>>>>> functions but they do have a rationale. They were added before defguard >>>>>>> existed. At the time, writing guards was a bit more bureaucratic. But if >>>>>>> is_odd/is_even were proposed today, they would most likely have been >>>>>>> rejected as well. >>>>>>> >>>>>>> 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. >>>>>>> >>>>>>> *José Valim* >>>>>>> www.plataformatec.com.br >>>>>>> Skype: jv.ptec >>>>>>> Founder and Director of R&D >>>>>>> >>>>>>> >>>>>>> On Tue, Apr 16, 2019 at 11:46 PM <t...@scalpel.com > wrote: >>>>>>> >>>>>>>> I disagree that this should be a library. (I've already done this >>>>>>>> in my app and would be fine extracting it into one though) I don't buy >>>>>>>> the >>>>>>>> slippery slope argument. The functions are very simple to create and >>>>>>>> maintain, and it's not like the Tuple module is overflowing with >>>>>>>> complexity. We have things like 'is_even' and 'is_odd' because they are >>>>>>>> common to work with. :ok and :error are insanely common in elixir >>>>>>>> codebases. Why not add convenience methods? >>>>>>>> >>>>>>>> On Tuesday, April 16, 2019 at 5:22:38 PM UTC-4, José Valim wrote: >>>>>>>>> >>>>>>>>> Hi Tom, thanks for the proposal. >>>>>>>>> >>>>>>>>> As OvermindDL1 already hinted, this can lead to a slippery slope >>>>>>>>> where we need to add bang variants, question mark variants, >>>>>>>>> ok/1/2/3/4 to >>>>>>>>> deal with arities and so on. I would suggest building this vocabulary >>>>>>>>> as >>>>>>>>> necessary in your applications or, if you want to share it with the >>>>>>>>> world, >>>>>>>>> it could be a nice library. Hint: the package ok_error seems to be >>>>>>>>> available. :) >>>>>>>>> >>>>>>>>> *José Valim* >>>>>>>>> www.plataformatec.com.br >>>>>>>>> Skype: jv.ptec >>>>>>>>> Founder and Director of R&D >>>>>>>>> >>>>>>>>> >>>>>>>>> On Tue, Apr 16, 2019 at 11:12 PM OvermindDL1 <overm...@gmail.com >>>>>>>>> > wrote: >>>>>>>>> >>>>>>>>>> On Tuesday, April 16, 2019 at 3:04:13 PM UTC-6, t...@scalpel.com >>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> It is often the case that you want to wrap the result of an >>>>>>>>>>> operation in an ":ok" or ":error" Tuple. We should add convenience >>>>>>>>>>> wrapper >>>>>>>>>>> functions since this is so common and it cleans up otherwise ugly >>>>>>>>>>> code. >>>>>>>>>>> >>>>>>>>>>> def ok(value), do: {:ok, value} >>>>>>>>>>> def error(value), do: {:error, value} >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> This could be quite useful! On the other side it would be useful >>>>>>>>>> to add functions like these as well: >>>>>>>>>> >>>>>>>>>> def ok!({:ok, value}), do: value >>>>>>>>>> >>>>>>>>>> def ok?({:ok, _value}), do: true >>>>>>>>>> def ok?(_), do: false >>>>>>>>>> >>>>>>>>>> And so forth for error as well. They are not really useful on >>>>>>>>>> their own because matching is better, but for use in pipes that >>>>>>>>>> would be >>>>>>>>>> quite useful (right now I use the exceptional library, which does >>>>>>>>>> similar >>>>>>>>>> things and more). >>>>>>>>>> -- >>>>>>>>>> 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-l...@googlegroups.com . >>>>>>>>>> To view this discussion on the web visit https://groups.google.com/d/ >>>>>>>>>> msgid/elixir-lang-core/ 30614530-7e33-4cb8-bffb- >>>>>>>>>> 63c18248d340%40googlegroups. com >>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/30614530-7e33-4cb8-bffb-63c18248d340%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>>> . >>>>>>>>>> For more options, visit https://groups.google.com/d/ optout >>>>>>>>>> <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-l...@ googlegroups.com . >>>>>>>> To view this discussion on the web visit https://groups.google.com/d/ >>>>>>>> msgid/elixir-lang-core/ 0314757d-eff2-4b23-8130- >>>>>>>> a19ee921b254%40googlegroups. com >>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/0314757d-eff2-4b23-8130-a19ee921b254%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> For more options, visit https://groups.google.com/d/ optout >>>>>>>> <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-l...@googlegroups.com . >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/elixir-lang-core/2e7204c7-6d06-49f9-8edc-7c631f75063a%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/2e7204c7-6d06-49f9-8edc-7c631f75063a%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> 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-l...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/elixir-lang-core/721abcf1-0cfd-4824-b54a-ff2aa22487f3%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/elixir-lang-core/721abcf1-0cfd-4824-b54a-ff2aa22487f3%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> 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-l...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/elixir-lang-core/5607dc54-2c5d-452c-a5a5-fa6ec03864c3%40googlegroups.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/5607dc54-2c5d-452c-a5a5-fa6ec03864c3%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> 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/50776062-e75d-4f31-8266-2b633e78bf89%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/50776062-e75d-4f31-8266-2b633e78bf89%40googlegroups.com?utm_medium=email&utm_source=footer> > . > 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/CAGnRm4%2B%3DEbqEZLM4hubrXrdRVVY-unbs09264z%2BRm-NGbmpWCQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.