やっちのわいわい日記

電通大に編入した元高専生の日記。日記を書きつつ編入のこととか勉強のこととか書こうと思っています。編入とかで質問があるかたは@amhflcl0514にDMくださいお

Elixir勉強日記2 〜基本演算編〜

Elixir勉強日記(一日ずつやるとは言っていない)第2回です

f:id:nishikino3:20190611145254j:plain

今日は演算とかのあたりから進めていこうと思います

elixirschool.com

コードを見ながらざっくり進めていきいます

インストール

MacでもLinux(Ubuntu)でもさくっとインストールして動かせました

各所で議論される型ですね

言語によって重要視したりしてなかったりするのでElixirどんな感じなのか気になりますね

整数

# 動かしてみた感じ最大値は決まっていないようです
# あと長い桁数は_で区切ることもできます。この辺はrubyと似てますね
iex> 255
255
iex> 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

# 2進数、8進数、16進数は組み込みで対応しています
iex> 0b0110
6
iex> 0o644
420
iex> 0x1F
31

浮動小数

# Elixirでは、浮動小数点数は少なくとも1桁の数字とその後に続く小数を必要とし、 64ビットの倍精度で、指数eに対応しています
iex> 3.14
3.14
iex> .14 # この書き方はだめらしい
** (SyntaxError) iex:2: syntax error before: '.'
iex> 1.0e-10
1.0e-10
iex>  0.000000000000000000000000000001 + 1.0 
1.0

真理値

# Elixirは真理値としてtrueとfalseを提供しています。また、falseとnil以外は真とみなされます

iex> true
true
iex> false
false

アトム

# アトムは自身の名前がそのまま値になる定数です。Rubyをご存知なら、シンボルと同義になります
iex> :foo
:foo
iex> :foo == :bar
false

# 真理値のtrueとfalseはそれぞれ、アトムの:trueと:falseでもあります。
iex> true |> is_atom
true
# ちなみに!! |> を使うと左項の値を右項の引数として扱います!これすこ!シェルのパイプみたいな感じですね
iex> :true |> is_boolean
true
iex> :true === true
true

# Elixirのモジュールの名前もまたアトムです。MyApp.MyModuleは、そのようなモジュールが宣言されていなくても有効なアトムです。
iex> is_atom(MyApp.MyModule)
true

# アトムとモジュールの名前が被るのが若干懸念される気がしますね...

# アトムは、Erlangのビルトインのものも含めたライブラリのモジュールを参照するのにも使われます。
iex> :crypto.strong_rand_bytes 3
<<23, 104, 108>>

# アトムでErlangのモジュール参照できるのすごいですがわりと名前被りそうで怖い

文字列

# 文字列はElixirではUTF-8エンコードされていて、二重引用符で囲みます
iex> "Hello"
"Hello"
iex> "dziękuję"
"dziękuję"

# 文字列は改行やエスケープシーケンスに対応しています
iex> "foo
...> bar"
"foo\nbar"
iex> "foo\nbar"
"foo\nbar"

基本的な演算

算術

# 基本的にいつも通り
iex> 2 + 2
4
iex> 2 - 1
1
iex> 2 * 5
10
iex> 10 / 5 # /は常に浮動小数点を返すので注意
2.0

# 結果が整数の割り算
iex> div(10, 5)
2
# %ではないので気をつける
iex> rem(10, 3)
1

論理

# ||と&&と!は基本的にどんな型にも対応してる
iex> -20 || true
-20
iex> false || 42
42
iex> 42 && true
true
iex> 42 && nil
nil
iex> !42
false
iex> !false
true

# このあたりはrubyと同じですね
# nil判定とかに便利そう

# 最初の引数が真偽値である必要がある演算子`and``or``not`
iex> true and 42
42
iex> false or true
true
iex> not false
true
iex> 42 and true
** (ArgumentError) argument error: 42
iex> not 42
** (ArgumentError) argument error
# はぇ〜〜〜

比較

# 基本はrubyと一緒な感じ
iex> 1 > 2
false
iex> 1 != 2
true
iex> 2 == 2
true
iex> 2 <= 3
true
iex> 2 == 2.0
true
iex> 2 === 2.0 # 整数と小数を厳密に比較
false

# 型を比較できてソートにおいて有用
# これは他の言語ではあまり見られない気がします
# number < atom < reference < function < port < pid < tuple < map < list < bitstring

iex> :hello > 999
true
iex> {:hello, :world} > [1, 2, 3]
false
# これってリストを型でまとめるようにソートできるってことですかね?

文字列への式展開

# Rubyを使っているなら、Elixirでの式展開は見覚えがあるでしょう
iex> name = "Sean"
iex> "Hello #{name}"
"Hello Sean"

# 見覚えありますねぇ

文字列の連結

# 文字列連結は<>演算子を利用します
iex> name = "Sean"
iex> "Hello " <> name
"Hello Sean"

# +じゃないのね

第2回まとめ

  • 基本的な演算や数値の扱いはrubyと似ている(値自体がインスタンスではないけど)(そもそもElixirはクラスない?)
  • / は常に小数を返す
  • 剰余算は%じゃなくてrem/2
  • アトムはrubyのシンボルとほぼ同義
  • モジュール名はアトムとして扱われている
  • 論理演算は真偽値じゃなくても扱える
  • ただしand``or``not演算子は真偽値のみ
  • 比較は小数まで厳密に比較する===演算子があったり、異なる型だと型での比較ができる
  • 文字列の式展開もrubyと同じ、文字列連結の演算子<>

基本的な演算とかはrubyと同じで馴染みそうだな〜って感じです

Erlangのモジュール使うことあるしErlangも多少は眺めたほうがいいのかな

こっちも進めてみたい感じあるので気が向いたら切り替えるかもしれません

hexdocs.pm