DEV Community

kaede
kaede

Posted on • Updated on

Clojure Tutorial Part 2 -- 四則演算

参考

https://clojure.org/guides/repl/basic_usage

Clojure 公式の基本的な使い方のページの前半。


数値計算

clojure の四則演算の特徴

https://clojure.org/guides/repl/basic_usage#_evaluating_clojure_expressions

+, -, * , / の四則演算が Java や JS とは大きく異なる

足し算の例だと

( + 数値A 数値B 数値C 数値D ... )

の形で

((( 数値A + 数値B ) + 数値C ) + 数値 D ...)

という計算になる

https://alraku.com/calculation/2454/

先頭の引数を残りの引数で割った数値が返り値となります。

このような Lisp と同じ計算方法が使われる。

https://github.com/clojure/clojure/blob/clojure-1.10.1/src/clj/clojure/core.clj#L984

なお、JS などの算術演算子のように見えるが
ソースコードを見ると defn で定義されているように、
実態は可変長の引数をとる関数である


単体の数値出力

user=> (+ 1)
1
Enter fullscreen mode Exit fullscreen mode

+ で加算計算することを宣言し
空白を開けて数値を渡す。

( + -4 )
-4
Enter fullscreen mode Exit fullscreen mode

マイナスの数値を渡すこともできる。

( + )
0
Enter fullscreen mode Exit fullscreen mode

加算、乗算なら数値は渡さなくてもエラーにならない
減算、割算はエラーになる。


エラーになる出力

( 1 )
Enter fullscreen mode Exit fullscreen mode

数値のみではエラーになる。数値計算の宣言が必要。

( +1 )
Enter fullscreen mode Exit fullscreen mode

足し算宣言と数値の間に空白が入っていないのでエラーになる。


加算 -- (((A+B)+C)+D)

( + 1 2 3)
6
Enter fullscreen mode Exit fullscreen mode

数値を増やしていけば、全て加算してくれる。

しかし内部的には ( 1 + 2 ) + 3 ) = 6 になっている


減算 -- (((A-B)-C)-D)

( 1 - 2 ) - 3 をするために

( - 1 2 3)
-4
Enter fullscreen mode Exit fullscreen mode

-1 -2 -3 = -6 になるかと思いきや
( 1 - 2 ) - 3 = -1 -3 = 4 になっている

( - 1 2)
-1
Enter fullscreen mode Exit fullscreen mode

順番に計算していく

-1 -2 -3 をするために

( - -1 2 3 )
-6
Enter fullscreen mode Exit fullscreen mode

最初の引数さえ -n にすれば全て減算できる

( - 1 - 2 )
Execution error (ClassCastException)
at user/eval5 (REPL:1).
Enter fullscreen mode Exit fullscreen mode

マイナスと 1 の間を離すとエラーになる。

1-1+2-2 のような計算は一度にはできない。


掛け算 -- ( A x B ) x C )

( * 2 3 )
6
Enter fullscreen mode Exit fullscreen mode

2 x 3 = 6

( * 2 3 3 )
18
Enter fullscreen mode Exit fullscreen mode

( 2 x 3 ) x 3 ) = 18

になる。


割り算 -- ( A ÷ B ) ÷ C )

( / 2 3 )
2/3
Enter fullscreen mode Exit fullscreen mode

2 ÷ 3 = 2/3

( / 2 3 3)
2/9
Enter fullscreen mode Exit fullscreen mode

( A ÷ B ) ÷ C ) = 2/9

準に割る処理をしていく。

引き算と同じロジック。

Top comments (0)