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

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
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
pgiesin
This should be a simple problem but I just can’t seem to figure it out. I have a standalone Elixir app that won’t find the database. Dep...
New
Kagamiiiii
Student &amp; New to elixir. Nice language. I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
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
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
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
kostonstyle
Hi all I want to have a unix time, from the current time plus 1 hour. DateTime.now + 1 hour How to get it in elixir? Thanks
New
Exadra37
Sometimes I want to check if the input into a function is not a blank string. My first approach: defmodule Example do def do_stuff(s...
New
beno
I will often find my self writing things similar to: case some_value do nil -&gt; something() "" -&gt; something() _ -&gt; someth...
New

Other popular topics Top

shahryarjb
Hello, I get Persian date from my client and convert it to normal calendar like this: def jalali_string_to_miladi_english_number(persi...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
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

We're in Beta

About us Mission Statement