Elixir 1.18 added some interesting, features but one that went under the radar was extended support for dbg
. In 1.17 when you had this code
a = 1
b = 2
if a + b == 3 do
:equal
else
:non_equal
end
|> dbg
It evaluated to:
if a + b == 3 do
:equal
else
:non_equal
end #=> :equal
In 1.18 this was aligned with what case
and cond
does:
Case argument:
1 + 2 #=> 3
Case expression (clause #1 matched):
case 1 + 2 do
3 -> :equal
_ -> :non_equal
end #=> :equal
if
result in 1.18:
If condition:
a + b == 3 #=> true
If expression:
if a + b == 3 do
:equal
else
:non_equal
end #=> :equal
if this is not enough you can wrap your code in brackets and pass it to dbg
(
input = %{a: 1, b: 2}
c = Map.get(input, :c, 20)
if input[:a] + c == 3 do
:equal
else
:non_equal
end
)
|> dbg
results in displaying results for every expression
Code block:
(
input = %{a: 1, b: 2} #=> %{a: 1, b: 2}
c = Map.get(input, :c, 20) #=> 20
if input[:a] + c == 3 do
:equal
else
:non_equal
end #=> :non_equal
)
Last missing piece is the with
macro which is sometimes a nightmare to debug, in elixir 1.18 we have support for that:
with input = %{a: 1, b: 2},
{:ok, c} <- Map.fetch(input, :c),
3 <- input[:a] + c do
:equal
else
_ -> :non_equal
end
|> dbg
The result here is:
With clauses:
%{a: 1, b: 2} #=> %{a: 1, b: 2}
Map.fetch(input, :c) #=> :error
With expression:
with input = %{a: 1, b: 2},
{:ok, c} <- Map.fetch(input, :c),
3 <- input[:a] + c do
:equal
else
_ -> :non_equal
end #=> :non_equal
This should make your debugging journey easier.
If you are stuck in an older elixir versions you can install a package that backports this functionality dbg_mate
Thanks for your attention.
Top comments (1)
Excellent.