dogweather

dogweather

Dbg() in a `with` sequence?

dbg() is one of my favorite Elixir features: placing it somewhere in a pipe of function calls outputs all the intermediate results. It’s great for debugging parsing code. Like this:

    meta_date =
      document
      |> Floki.find("meta[property='article:published_time']")
      |> Floki.attribute("content")
      |> List.first()
      |> parse_date_text()
      |> dbg()

Well, now I’m starting to use with instead of |>. Is it possible to get that dbg() behavior? I haven’t figured it out. For example:

  @spec parse_human_date_string(binary) :: nil | Date.t
  def parse_human_date_string(text) when is_binary(text) do
    with [_, raw_month, raw_day, year] <- Regex.run(~r/^(.+) (.+), (\d\d\d\d)$/, text),
          day        <- String.pad_leading(raw_day, 2, "0"),
          month_num  <- Integer.to_string(Enum.find_index(@months, &(&1 == raw_month)) + 1),
          month      <- String.pad_leading(month_num, 2, "0"),
         {:ok, date} <- Date.from_iso8601("#{year}-#{month}-#{day}"),
         dbg() do  ### THIS IS WHAT I'D LIKE TO DO ###
      date
    else
      _ -> nil
    end
  end

Then I’d get the results of each “line” of the with.

Marked As Solved

dogweather

dogweather

Yep, just make dbg() one of the clauses. I’ll paste here the actual running code and the output. I’m pretty sure it’s the same as above:

  @spec parse_human_date_string(binary) :: Date.t | nil
  def parse_human_date_string(text) when is_binary(text) do
    with [_, raw_month, raw_day, year] <- Regex.run(~r/^(.+) (.+), (\d\d\d\d)$/, text),
          day        <- String.pad_leading(raw_day, 2, "0"),
          month_num  <- Integer.to_string(Enum.find_index(@months, &(&1 == raw_month)) + 1),
          month      <- String.pad_leading(month_num, 2, "0"),
         {:ok, date} <- Date.from_iso8601("#{year}-#{month}-#{day}"),
         dbg() do
      date
    else
      _ -> nil
    end
  end
~/s/P/oregon-revised-statutes-crawler ❯❯❯ mix test                                                       refactor ✱
Compiling 1 file (.ex)
Generated crawlers app
................................................................................................................................[lib/news/date_modified.ex:99: News.DateModified.parse_human_date_string/1]
binding() #=> [
  date: ~D[2023-12-05],
  day: "05",
  month: "12",
  month_num: "12",
  raw_day: "5",
  raw_month: "December",
  text: "December 5, 2023",
  year: "2023"
]

..........[lib/news/date_modified.ex:99: News.DateModified.parse_human_date_string/1]
binding() #=> [
  date: ~D[1997-05-26],
  day: "26",
  month: "05",
  month_num: "5",
  raw_day: "26",
  raw_month: "May",
  text: "May 26, 1997",
  year: "1997"
]

..[lib/news/date_modified.ex:99: News.DateModified.parse_human_date_string/1]
binding() #=> [
  date: ~D[2020-01-01],
  day: "01",
  month: "01",
  month_num: "1",
  raw_day: "1",
  raw_month: "January",
  text: "January 1, 2020",
  year: "2020"
]

.......
Finished in 0.9 seconds (0.4s async, 0.5s sync)
17 doctests, 130 tests, 0 failures

Also Liked

dogweather

dogweather

Never mind—it freakin’ works. Amazing.

dogweather

dogweather

BTW, @josevalim this is mind-blowingly good.

sodapopcan

sodapopcan

OIC, dbg() without explicit args (or pipe) just outputs the current binding which I never realized before.

For example:

if true do
  a = 1
  dbg()
end
binding() #=> [a: 1]

Cool!

PS, I wasn’t able to get it to work before because I was being dumb and trying this: with 1 <- 1, 2 <- 2, dbg(), do: "hi" so of course I got binding() #=> [] :person_facepalming:

dogweather

dogweather

OIC, dbg() without explicit args (or pipe) just outputs the current binding which I never realized before.

That’s exactly what I’m inferring. It’s fantastic fall-back behavior for when no args are given. I suppose I could look at the docs :stuck_out_tongue:

with 1 <- 1

Lol, yeah. Nice little gotcha. No bindings to speak of!

Where Next?

Popular in Questions Top

pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
idi527
I’ve been re-reading swift book again and noticed that multiline strings there don’t have a trailing line break, unlike in elixir iex(2)...
New

Other popular topics Top

yurko
Here are few pieces of (common) Linux knowledge that we use for reasonably small one server apps. We use Ubuntu but this should work for ...
New
peerreynders
Manning 2016 Halloween weekend sale via Deal of the Day Friday, October 28 - Half off all MEAPs - code WM102816LT Saturday, October 29 ...
326 29600 154
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
magnetic
Hey :wave:t3: Elixir community, I’ve been learning Elixir, and working on some side projects. My editor of choice is VSCode, and althoug...
New

We're in Beta

About us Mission Statement