LoginSignup
8
1

More than 3 years have passed since last update.

気になる関数の実装はドキュメントの</>を押してソースコードをみてみましょう (Elixir)

Last updated at Posted at 2021-01-01

はじめに

  • Elixir 楽しんでいますか :bangbang::bangbang::bangbang:
  • $\huge{今年もよろしくお願いします!!!}$
  • 今日は気になった関数のソースコードを見に行く方法をご紹介します
    • この関数、どんな実装になっているのだろう? って気になることありませんか
  • Elixirは公式ドキュメントを読むのが一番よいです

新年のごあいさつ

[12354, 12369, 12414, 12375, 12390, 12362, 12417, 12391, 12392, 12358, 12372, 12374, 12356, 12414, 12377, 127885]

:point_down::point_down_tone1::point_down_tone2::point_down_tone3::point_down_tone4::point_down_tone5:

$ 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なる関数に行き当たりました。

スクリーンショット 2021-01-01 18.56.10.png

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の実装がどうなっているかを見に行きましょう :rocket::rocket::rocket:
  • 関数の右のほうにある</> がリンクになっておりまして押せますですよ!
  • ありがとナイス:flag_cn:

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/3Enum.reduce/3ともにErlangのlists:foldlを呼び出しています。
これにより実行結果は同じになることがわかりました :rocket::rocket::rocket:

Wrapping Up :moyai::moyai::moyai::moyai::moyai:

  • 気になる関数の実装は、ドキュメントの</>を押してみましょう :bangbang::bangbang::bangbang:
  • $\huge{今年もよろしくお願いします!!!}$
  • Enjoy Elixir :rocket::rocket::rocket:

  1. 旅と言う名の記事を書くためのネタ探しジャーニーです。 

8
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1