これまでのまとめ
本日のお品書き
Erlangさん。
- 個人的には時雨堂さんのイメージがある言語です。
- 以前にFizzBuzzしたElixirさんはErlangVM上で動作しているとのことでしたが、果たして言語的な共通点もあるのでしょうか?
FizzBuzz
- なんだかパターンマッチと再帰がわかってきた気がします(錯覚か)
- 関数型言語は
for
を持たないものも多く、リストを入力として先頭から順番に再起的に処理を行うか、リストを入力としてmap的に各要素を処理するかが多い気がしてきた。 - 以下ではFizzBuzzをスクリプトとして実行するため、ファイル冒頭にescriptのシェバンを記載している。こうすると
main(_)
が実行される。
fizzbuzz.erl
#!/usr/bin/env escript
%% 空のリストが入力されたらatoms(ok)を返して終了する
fb([]) ->
ok;
%% パターンマッチでリストの先頭とそれ以外を分ける
fb([N|Rest]) ->
if
N rem 15 == 0 ->
%% 標準出力にはio:formatを使う。ioモジュールのformat関数という意味。
io:format("FizzBuzz~n", []);
N rem 3 == 0 ->
io:format("Fizz~n", []);
N rem 5 == 0 ->
io:format("Buzz~n", []);
true ->
io:format("~w~n", [N])
end,
%% 残りの要素を再帰的に処理する
fb(Rest).
main(_) -> fb(lists:seq(1,100)).
おまけ:実行方法
Dockerでぽちっと
docker run --mount type=bind,source=$(pwd),target=/app -w /app --rm erlang bash -c "chmod +x fizzbuzz.erl && escript fizzbuzz.erl"
おまけのおまけ
escriptではなくfizzbuzz関数を読んで対話的に実行する場合は、fizzbuzz.erl冒頭に次のように宣言した上で、モジュール:関数の形式で呼び出す。
fizzbuzz.erl
-module(fizzbuzz).
-export([fb/1]).
%% 省略
# 対話環境に入る
erl
# コンパイル
1> c(fizzbuzz).
# モジュールと関数の呼び出し
2> fizzbuzz:fb(lists:seq(1,100)).