動かざることバグの如し

近づきたいよ 君の理想に

Elixirでパイプ中にpryでデバッグしたい

環境

  • Elixir 1.x

コード

Elixirのパイプ演算子便利なんだけど、途中の変数変化を把握しづらい。そこでpryを使ってブレークポイントを仕掛ける。

defmodule Example do
  def pipe do
    1..10
    |> Enum.map(&(&1 * &1))
    |> Enum.filter(&rem(&1, 2) == 0)
    |> (fn(x) -> IEx.pry;x end).()
    |> Enum.take(3)
  end
end

実行

iex(1)> c "index.ex"
warning: redefining module Example (current version defined in memory)
  index.ex:10

[Example]
iex(2)> Example.pipe
Break reached: Example.pipe/0 (index.ex:15)

   13:     |> Enum.map(&(&1 * &1))
   14:     |> Enum.filter(&rem(&1, 2) == 0)
   15:     |> (fn(x) -> IEx.pry;x end).()
   16:     |> Enum.take(3)
   17:   end

pry(1)> x
[4, 16, 36, 64, 100]
pry(2)> respawn

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
[4, 16, 36]

パイプ演算子中ではない場合

require IEx;

defmodule Example do
  def add(x, y) do
    IEx.pry
    x + y
  end
end