再開。OTP サーバのあたりから。Cloud Shell にて云々しています。
とりあえず
$ mix new sequence
しています。以下なナニをでっち上げて
defmodule Sequence.Server do
use GenServer
def handle_call(:next_number, _from, current_number) do
{ :reply, current_number, current_number+1 }
end
end
で、iex -S mix
したら以下な出力が。
$ iex -S mix
Erlang/OTP 21 [erts-10.3.5] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
Compiling 1 file (.ex)
warning: function init/1 required by behaviour GenServer is not implemented (in module Sequence.Server).
We will inject a default implementation for now:
def init(init_arg) do
{:ok, init_arg}
end
You can copy the implementation above or define your own that converts the arguments given to GenServer.start_link/3 to the server state.
lib/sequence/server.ex:1
Interactive Elixir (1.8.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
盛り込んでおきます。リトライすると以下なカンジに。
$ iex -S mix
Erlang/OTP 21 [erts-10.3.5] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
Compiling 1 file (.ex)
Interactive Elixir (1.8.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
で、iex にてメセジ送信してみます。
iex(1)> { :ok, pid } = GenServer.start_link(Sequence.Server, 100)
{:ok, #PID<0.144.0>}
iex(2)> GenServer.call(pid, :next_number)
100
ええと、:reply
は二番目の要素を戻すよう OTP に指示、とあります。で、最後 (三番目) の要素が次の状態になる、とありますね、成程。
iex(3)> GenServer.call(pid, :next_number)
101
iex(4)> GenServer.call(pid, :next_number)
102
次は setter みたいなナニを定義しています。というか、start_link とは何か。
start_link
ありゃ、Chapter 14 をすっとばしているな。色々確認してみる方向。