0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

多言語FizzBuzzチャレンジ20日目:Erlang

Last updated at Posted at 2022-12-19

これまでのまとめ

本日のお品書き

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)).
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?