Clojure 初学者が感じた Clojure の基礎文法に関するつぶやき
参考情報 = 私のスペック: プログラミング歴 10年, lisp経験なし, 関数型経験あり, 4clojure の elementary & easy は全て解いた, 「clojure for brave and true」 で学習
infix でないことの強み
+
, =
や and
など他の言語では infix な演算子が Clojure では prefix になっており、可変個の引数を受け付ける。これにより、他の言語での sum, product というような関数は不要になる: (+ 1 2 3)
, (apply + [1 2 3])
, (* 1 2 1)
, (and true false false)
。
名づけが絶妙
特に seq まわりの関数に当てはまるが、反復操作の処理パターンを類型化し、名前をつけるのが上手い。例: mapcat
, juxt
, interleave
, interpose
, partition
。この辺りを知れば知るほど簡潔にプログラムが書けるようになりそう。
自由すぎる
4clojure のような単純な要件でさえ、実装方法のバリエーションが多い。書くのは楽だが読むのは辛いという印象が強い。ある問題では、for
を使った内包表記で回答を作る人がいれば、reduce
を使ったり、 loop
, iterate
を使った人もいた。
読みづらい
よく言われるように括弧多すぎというのもあるが、一番つらいのはインデントが深くなること。JavaScript, Python を書いてるときは最大でもインデント深さを 3くらいにとどめていただけに、インデントの深い expression を見ると発狂しそうになる。
destructuring の強力さ
最近では JavaScript でも使えるけど、destructuring は便利すぎる。多くの lexical binding は destructuring で驚くほど簡潔になる。
関数合成の実際
いくつか実践してみると comp
, partial
よりも ->
などのスレッディングマクロを使うほうが楽なケースが多い。#((as-> ...)
をよく使う。 transduce
も seq に対する処理の際にはかなり便利に使える(transducer の合成がめちゃ楽なのがよい)。
エラーメッセージ
何言っているのかわからないメッセージが多くてつらい
楽しい
短くかけて楽しい