唐突にErlangを触ることにしました。
Erlangはエリクソンが開発した言語で、何といっても分散環境やフォールトトレラントのための言語ですから、わくわくしてしまいます。
元々やりたいとは思っていたのですが、なぜか昨日の夜に「やろう!」と決意して本を注文しました。やると決めて本を注文するまでに1分かからなかったですね。いや、お金ないんですよ、本当は・・・
さて、そういうわけで本が来るまでの間に少しくらい触っておいてみようということで、セットアップして触ってみました。いろんなページを渡り歩き、emacsでErlangをやることにしました。昔、講義でC言語のソースを書くエディタとして使わされたのですが、バージョンが古くて見づらいかったのを覚えています。最近のは目に優しいですね。
そして、とりあえずやることはユニットテストとテスト駆動開発。
お題はパッと思いついた、FizzBuzz。
それではソースコードです。
-module(fizzbuzz). -export([fizzBuzz/1]). fizzBuzz(Other) when not is_integer(Other) -> "Parameter is Not Integer"; fizzBuzz(X) when X < 1 -> "Parameter is Not greater than or equal 1"; fizzBuzz(X) when X rem 15 == 0 -> "FizzBuzz"; fizzBuzz(X) when X rem 5 == 0 -> "Buzz"; fizzBuzz(X) when X rem 3 == 0 -> "Fizz"; fizzBuzz(X) -> integer_to_list(X).
fizzbuzz.erl
-module(fizzbuzzTest). -include_lib("eunit/include/eunit.hrl"). fib_test_() -> [ ?_assert(sample:fizzBuzz(0)=:="Parameter is Not greater than or equal 1"), ?_assert(sample:fizzBuzz(1)=:="1"), ?_assert(sample:fizzBuzz(3)=:="Fizz"), ?_assert(sample:fizzBuzz(5)=:="Buzz"), ?_assert(sample:fizzBuzz(15)=:="FizzBuzz"), ?_assert(sample:fizzBuzz("FizzBuzz")=:="Parameter is Not Integer") ].
fizzbuzzTest.erl
関数型を見慣れている人なら、構文を知らなくても読めると思います。
integer_to_list()というのは組み込み関数で、整数を文字列に変換できるそうです。
あとはコンパイルして、EShell上で
>sampleTest:test().
という風に実行するとeunitが自動的に生成したtest()関数が実行されて、「_test_」で終わる関数がテストとして実行されます。
最後にこのテストを書くのに参考にさせていただいたページがあるので紹介しておきます。
shibu.jp (Erlang用の軽量ユニットテストフレームワーク)
『有名な渋神さんの〜』などと紹介しているWebページもあるので、私が知らないだけで有名な人みたいです。
しかもなにやら上で紹介したページはPython中心の翻訳記事集みたいです。
私は最近Pythonをやりはじめたので、今度はそちらでお世話になるかもしれませんね。