/var/log/messages

May 13, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (27)

再開。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 とは何か。

ありゃ、Chapter 14 をすっとばしているな。色々確認してみる方向。

書籍 プログラミング Elixir (28)

comments powered by Disqus