호두나무 공방/Exercism in Elixir

Take-A-Number - Exercism in Elixir

2022. 4. 11. 22:52

문제 보기

간단한 프로세스를 실행하고 메시지를 받아 처리하는 문제였다. 책을 번역하면서 프로세스의 기본 동작에 대해서는 몇 번인가 훑어본 적이 있어서 크게 어렵지는 않았다. 가이드에서는 익명 함수를 써서 띄워야 한다는 듯, 다른 함수를 만들어 띄우니 start 외의 함수는 defp로 정의해야 한다고 경고를 띄우던데, 이유는 알겠지만 저 긴 함수를 익명 함수 안에 넣자니 그것도 또 난감한 일이라 일단 이대로 만족.

defmodule TakeANumber do
  def process(state) do
    receive do
      {:report_state, pid} ->
        send(pid, state)
        process(state)

      {:take_a_number, pid} ->
        new_state = state + 1
        send(pid, new_state)
        process(new_state)

      :stop ->
        :ok

      _ ->
        process(state)
    end
  end

  def start() do
    spawn(TakeANumber, :process, [0])
  end
end

추기: 다른 사람들의 답을 참고해서 해봤는데, spawn 호출을 spawn(fn -> process(0) end)로 바꾸면 process 함수를 프라이빗으로 바꿔도 되더라. 이것도 방법일 것 같다. 👍