この記事はElixir その2 Advent Calendar 2020 21日目です。
前日は、@mnishiguchiさんの「[Elixir] Referenceの作り方」 でした。
6日間ありがとうございました。残りはお任せください。
はじめに
- Elixir楽しんでいますか!
- さて、
1260
とはなんでしょうか
答え
- Elixir 1.11.2-otp-23にある関数の数です
どうやって数えたの?
- ここで数えました
-
$\huge{ウソです}$
- 真っ赤なウソです
- @namosukeさんの「【クソアプリ】PHP関数名しりとり」を眺めておりまして、Elixir版をPhoenixで作ろうかとおもって、まずは関数の一覧ダ〜〜〜 とおもってどうやってリストアップしたらいいのかを調べてみました
- きっと、Elixirのことは、Elixirが教えてくれるだろう、と
とても参考にしたページ
-
Get a list of all elixir modules in IEx
- Thanks!!!
こんな感じ
:code.all_loaded()
|> Enum.filter(fn {mod, _} -> "#{mod}" =~ ~r{^[A-Z]} end)
|> Enum.map(fn {mod, _} -> mod end)
|> Enum.reduce(%{}, fn mod, acc ->
Map.put(acc, mod, mod.__info__(:functions))
end)
結果
%{
Supervisor.Default => [init: 1],
Module => [
__get_attribute__: 3,
__put_attribute__: 4,
add_doc: 5,
add_doc: 6,
check_behaviours_and_impls: 4,
compile_definition_attributes: 6,
concat: 1,
concat: 2,
create: 3,
defines?: 2,
defines?: 3,
defines_type?: 2,
definitions_in: 1,
definitions_in: 2,
delete_attribute: 2,
eval_quoted: 2,
eval_quoted: 3,
eval_quoted: 4,
get_attribute: 2,
get_attribute: 3,
has_attribute?: 2,
make_overridable: 2,
open?: 1,
overridable?: 2,
put_attribute: 3,
register_attribute: 3,
safe_concat: 1,
safe_concat: 2,
spec_to_callback: 2,
split: 1
],
Inspect.Atom => [__impl__: 1, inspect: 2],
Inspect => [__protocol__: 1, impl_for: 1, impl_for!: 1, inspect: 2],
Access => [
all: 0,
at: 1,
数を数えてみよう
:code.all_loaded()
|> Enum.filter(fn {mod, _} -> "#{mod}" =~ ~r{^[A-Z]} end)
|> Enum.map(fn {mod, _} -> mod end)
|> Enum.reduce(%{}, fn mod, acc ->
Map.put(acc, mod, mod.__info__(:functions))
end)
|> Enum.reduce(0, fn {_, funs}, acc -> acc + Enum.count(funs) end)
- 一回マップにする必要はありませんが、まあ、さっきのプログラムを利用して足してみましたですよ
Wrapping Up
- Elixirでわからないことがある場合は、英語でググると答えがすぐみつかるよ
-
:code.all_loaded/0ってそういえば以下の記事で使っていました
- 「kentaro/mix_tasks_upload_hotswap」を試してみる! ご本人が参加していらっしゃるカレンダーにて
- 2回目なのでようやく私の中で定着してきました
- Enjoy Elixir !!!