Очень простой IEx и IEx.pry из сценария эликсира выдает ошибку: запущена оболочка IEx?

Я работаю с Эликсиром программирования Дэйва Томаса и пробую несколько примеров из главы списка.

Когда я изучаю язык, я предпочитаю оставаться как можно более базовым, запустив <language executable> <script file>. В этом случае я бегу elixir reduce.exs

содержимое reduce.exs:

require IEx;

defmodule MyList do
  def reduce([], memo, _), do: memo
  def reduce([head | tail], memo, func) do
    IEx.pry
    reduce(tail, func.(head, memo), func)
  end
end

ExUnit.start()
defmodule MyListTest do
  use ExUnit.Case

  def test do
    assert 10 == MyList.reduce([1,2,3,4], 0, &(&1 + &2))
  end
end

IO.puts(MyListTest.test())

При запуске консоль выводит:

Cannot pry #PID<0.70.0> at reduce.exs:9. Is an IEx shell running?

Я предполагаю, что полностью не понимаю некоторые основные концепции, но я не совсем уверен, что они из себя представляют.

Я ожидаю, что программа просто перейдет в iex сеанс, когда выполнит IEx.pry. Учитывая, что iex находится в основных библиотеках elixir, я подумал, что require IEx будет достаточно для использования pry.

Мне нужно использовать IEx.pry/3? Нужно ли мне запускать отдельный экземпляр iex и каким-то образом соединять два узла вместе?

Простая оценка кода путем запуска iex reduce.exs запускает файл, но не показывает результат теста.

Не стесняйтесь исправлять любые мои глупые предположения.


person Jeff Gandt    schedule 19.03.2017    source источник


Ответы (1)


Вы получаете эту ошибку, потому что IEx должен быть запущен. Использование команды iex reduce.exs позволит вам войти в код, и где IEx.pry находится в вашем исходном файле.

Чтобы продолжить выполнение оттуда, введите respawn в оболочке. Он спросит вас, хотите ли вы разрешить pry для каждой рекурсии, но в конечном итоге распечатает результат теста.

Причина, по которой вы не видите результат теста заранее, заключается в том, что IEx.pry останавливает выполнение, поэтому ваша тестовая функция не вернулась и вызов IO.puts не завершился.

person Daniel Timberlake    schedule 19.03.2017