はじめに
- Elixir 楽しんでいますか
- $\huge{今年もよろしくお願いします!!!}$
- 今日は気になった関数のソースコードを見に行く方法をご紹介します
- この関数、どんな実装になっているのだろう? って気になることありませんか
- Elixirは公式ドキュメントを読むのが一番よいです
新年のごあいさつ
[12354, 12369, 12414, 12375, 12390, 12362, 12417, 12391, 12392, 12358, 12372, 12374, 12356, 12414, 12377, 127885]
$ iex
iex> (
[12354, 12369, 12414, 12375, 12390, 12362, 12417, 12391, 12392, 12358, 12372, 12374, 12356, 12414, 12377, 127885]
|> List.to_string()
)
"?????"
Elixirをインストールして、IEx(Elixir's interactive shell)
を起動してお確かめください。
Elixirのインストールは、手前味噌ですが、インストールなどをご参照ください。
List.foldl/3
Elixirの公式ドキュメントをながめる旅1をしておりましたところ、List.foldl/3なる関数に行き当たりました。
Examples だけ書き起こします
iex> List.foldl([5, 5], 10, fn x, acc -> x + acc end)
20
iex> List.foldl([1, 2, 3, 4], 0, fn x, acc -> x - acc end)
2
- Enum.reduce/3となにが違うのだろう? という疑問を持ちました
- Elixirの実装がどうなっているかを見に行きましょう
- 関数の右のほうにある> がリンクになっておりまして押せますですよ!
- ありがとナイス
https://github.com/elixir-lang/elixir/blob/v1.11.2/lib/elixir/lib/list.ex#L237-L240
defmodule List do
...
@spec foldl([elem], acc, (elem, acc -> acc)) :: acc when elem: var, acc: var
def foldl(list, acc, fun) when is_list(list) and is_function(fun) do
:lists.foldl(fun, acc, list)
end
https://github.com/elixir-lang/elixir/blob/v1.11.2/lib/elixir/lib/enum.ex#L2179-L2182
defmodule Enum do
...
@spec reduce(t, any, (element, acc -> acc)) :: acc
def reduce(enumerable, acc, fun) when is_list(enumerable) do
:lists.foldl(fun, acc, enumerable)
end
List.foldl/3、Enum.reduce/3ともにErlangのlists:foldlを呼び出しています。
これにより実行結果は同じになることがわかりました
Wrapping Up
-
旅と言う名の記事を書くためのネタ探しジャーニーです。 ↩