To revisit the example situation from the original post: ``` {sections, _acc} = for let {section_counter, lesson_counter} = {1, 1}, section <- sections do lesson_counter = if section["reset_lesson_position"], do: 1, else: lesson_counter {lessons, lesson_counter} = for let lesson_counter, lesson <- section["lessons"] do {Map.put(lesson, "position", lesson_counter), lesson_counter + 1} end section = section |> Map.put("lessons", lessons) |> Map.put("position", section_counter)
{section, {section_counter + 1, lesson_counter}} end ``` I think that's nice! It focuses on inputs and outputs and reduces the overall line noise. On Monday, December 20, 2021 at 5:28:29 PM UTC-5 José Valim wrote: > Stefan, this would work if we include all extensions: > > for reduce {status, acc} = {:ok, []}, status == :ok, foo <- foos do > case barify(foo) do > {:ok, bar} -> {:ok, [bar | acc]} > > {:error, _reason} = error -> error > end > end > > I am not sure if you find it any better. It is hard to do this with "let" > because you don't want to include the element of when it fails. > > On Mon, Dec 20, 2021 at 9:23 PM Stefan Chrobot <ste...@chrobot.io> wrote: > >> I went through some of our code and one thing I'd love to see is a way to >> replace Enum.reduce_while with the for comprehension. So the code like this: >> >> Enum.reduce_while(foos, {:ok, []}, fn foo, {:ok, bars} -> >> case barify(foo) do >> {:ok, bar} -> {:cont, {:ok, [bar | bars]}} >> {:error, _reason} = error -> {:halt, error} >> end >> end) >> >> Would the following even work? >> >> for reduce(result = {:ok, []}), foo <- foos, {:ok, _} <- result do >> case barify(foo) do >> {:ok, bar} -> {{:ok, [bar | bars]}} >> {:error, _reason} = error -> {error} >> end >> end >> >> Even if it did, it's not doing a great job of communicating the intent >> and still potentially requires a Enum.reverse call. The intent here is >> "early exit with some value upon some condition or pattern mismatch". >> >> >> Best, >> Stefan >> >> pon., 20 gru 2021 o 21:06 Stefan Chrobot <ste...@chrobot.io> napisał(a): >> >>> I really like this proposal! For me it strikes the perfect balance >>> between terseness and explicitness that I've come to enjoy in Elixir. >>> >>> My votes: >>> - Naming: let over given; just because it's shorter, >>> - Do use parents: let "feels" similar to var!. >>> >>> Best, >>> Stefan >>> >>> pon., 20 gru 2021 o 19:54 José Valim <jose....@dashbit.co> napisał(a): >>> >>>> Good point. I forgot to mention the :reduce option will be deprecated >>>> in the long term. >>>> >>>> On Mon, Dec 20, 2021 at 7:53 PM 'eksperimental' via elixir-lang-core < >>>> elixir-l...@googlegroups.com> wrote: >>>> >>>>> The proposal is very concise, >>>>> the only thing that would be problematic is the use of `reduce` for two >>>>> different things, >>>>> >>>>> for <<x <- "AbCabCABc">>, x in ?a..?z, reduce: %{} do >>>>> acc -> Map.update(acc, <<x>>, 1, & &1 + 1) >>>>> end >>>>> >>>>> {sum, count} = >>>>> for reduce({sum, count} = {0, 0}), i <- [1, 2, 3] do >>>>> sum = sum + i >>>>> count = count + 1 >>>>> {sum, count} >>>>> end >>>>> >>>>> It would lead to misunderstanding as it may not be clear which one we >>>>> are talking about when we say "use for reduce" >>>>> >>>>> >>>>> On Mon, 20 Dec 2021 19:11:54 +0100 >>>>> José Valim <jose....@dashbit.co> wrote: >>>>> >>>>> > Hi everyone, >>>>> > >>>>> > This is the second proposal for-let. You can find it in a gist: >>>>> > https://gist.github.com/josevalim/fe6b0bcc728539a5adf9b2821bd4a0f5 >>>>> > >>>>> > Please use the mailing list for comments and further discussion. >>>>> > Thanks for all the feedback so far! >>>>> > >>>>> >>>>> -- >>>>> 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-co...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/elixir-lang-core/61c0d119.1c69fb81.af520.c181SMTPIN_ADDED_MISSING%40gmr-mx.google.com >>>>> . >>>>> >>>> -- >>>> 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-co...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LOyoAmXULJQo%2BYX4eFVJZJAoYtKHytoHujCS_kJ6AEuA%40mail.gmail.com >>>> >>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LOyoAmXULJQo%2BYX4eFVJZJAoYtKHytoHujCS_kJ6AEuA%40mail.gmail.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-co...@googlegroups.com. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/elixir-lang-core/CACzMe7aXBL1jNM_aWmJJzYOjrK%3Dtf-4%2BLPLJLpccu_G4zr0cAg%40mail.gmail.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/CACzMe7aXBL1jNM_aWmJJzYOjrK%3Dtf-4%2BLPLJLpccu_G4zr0cAg%40mail.gmail.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/c1fea9e2-f47c-4236-812a-431bc7d76d62n%40googlegroups.com.