Archive for: 𔃷月 2016’

ElixirのHeadとTailについて

2016年7月16日 Posted by PURGE

[head | tail]の挙動が、いまひとつわからなかった。
しかし、どうもErlang や Elixir の構文では、この概念が重要な気がしたので、ちょっと理解をしようと思う。

リストを作成して、[head | tail]で受けると、リストの先頭と、それ以降が分割される。

iex(1)> list = [1,2,3,4,5]
[1, 2, 3, 4, 5]
iex(2)> [head | tail] = list
[1, 2, 3, 4, 5]
iex(3)> head
1
iex(4)> tail
[2, 3, 4, 5]

ちなみに、リストを分割する関数も存在する。

iex(5)> hd(list)
1
iex(6)> tl(list)
[2, 3, 4, 5]

この概念は、再帰処理とかで基本になるので、ここで整理しておく。

Elixir ファイル読み込み

2016年7月15日 Posted by PURGE

File読込み。

defmodule FileIO do
    def main do
        {:ok, file} = File.open("sample.txt", [:read, :utf8])
        Enum.each(IO.stream(file, :line), fn(line) ->
            IO.puts line
        end )
        File.close(file)
    end
end

Elixir プログラムの実行方法

2016年7月14日 Posted by PURGE

下記のモジュールファイルを作成する。

MyModule.exs

defmodule MyModule do
  def hello() do
    IO.puts "Hello"
  end
end

これを実行するには、下記コマンドにてコンパイルする。

$ elixirc MyModule.exs 

または、コンソールにてコンパイル。

$ iex
Erlang/OTP 18 [erts-7.3]  [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.3.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("MyModule.exs")
[MyModule]

そのまま実行するには、

$ elixir -e MyModule.hello
Hello

iexから実行するには、

$ iex MyModule.exs 
Erlang/OTP 18 [erts-7.3]  [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

warning: redefining module MyModule (current version loaded from Elixir.MyModule.beam)
  MyModule.exs:1

Interactive Elixir (1.3.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> MyModule.hello
Hello
:ok

Elixir関数定義

2016年7月14日 Posted by PURGE

以下は、同じらしい。

    fun = &(&1 + 5)
    fun.(2)
    fun2 = fn(a) -> a + 5 end
    fun2.(2)

関数型言語の慣れが必要です。

Elixir エラーハンドリングのパターン

2016年7月14日 Posted by PURGE

存在しないファイルを読み込んだ時、:ok は帰ってこない為、パターンマッチに失敗してエラーとなる。

iex(1)> {:ok, file} = File.read "non_exist_file.txt"
** (MatchError) no match of right hand side value: {:error, :enoent}

存在しないファイルを読み込んだ時、:error が帰ってくる為、パターンマッチに失敗しない。

iex(2)> {:error, enoent} = File.read "non_exist_file.txt"
{:error, :enoent}

普通の言語なら、下記の2つの文をif文で制御するところだが、上記の制御を振り分けるためには、case文を使用するようだ。

case File.read "non_exist_file.txt" do
    {:ok, file} -> IO.puts "OK!!"
    {:error, enoent} -> IO.puts "File not found Error!!"
end

中々、慣れない。

Elixir 久しぶりの復習その2

2016年7月14日 Posted by PURGE

カレントパスのファイル名を取得して、ファイルに書き出す処理。

{:ok, files} = File.ls(".")

{:ok, file} = File.open "filelist.txt", [:write]
Enum.map(files, &IO.write(file, &1<>"\n"))
File.close file

Elixir 久しぶりの復習

2016年7月13日 Posted by PURGE

defmodule Hello do
    def hello do
        IO.puts "Hello Tajima!!!"
    end

    def goody do
        IO.puts "Good night Tajima!!!"
    end

    def dir do
        {:ok, files} = File.ls(".")
        #IO.puts "こんにちは。"
        #File.mkdir("dir")
        Enum.map(files, &IO.puts(&1))
    end
end