さめたコーヒー

kbaba1001's blog.

Clojure Essentials を読み終えた

Clojure Essentials: 入門書では飽き足らない人へ

Clojure Essentials: 入門書では飽き足らない人へ

Rubyをずっと使ってきたけど、新しい力が欲しくて Clojure を勉強し始めた。Clojureについてざっくり知りたくて、いいドキュメントがないか探していたらたまたま Kindle で 300円で上記の本があったので読んでみた。内容は Clojure の機能をざっくり紹介していて、説明は少なめだったけどその分はやく読めたから良かった。 初めの方に「英語を読むのが面倒な人向け」と書いてあったけど、まさにそんな感じだった。 Clojureguide にも一通り読んだけど、この本の方が詳しかったように思う。

驚いた点

  • def は変数宣言なので def hoge 0ruby でいうところの hoge = 0 に相当する
  • 無名関数を定義するのが fn なので有名関数を定義するには def foo (fn [n] n) のような感じになる。この辺は JavaScript 等と同じで、変数と関数を区別しない考え。省略記法として defn foo [n] のようにもかける
  • def で定義したシンボルにメタデータを与えることができる。ex: (def ^{:doc "Num of items"} num-items 20) みたいな感じ。
  • これにはいくつか予約語のようなものがあって、例えば、:dynamicコンパイラに型のヒントを与えることができる。(戻り値の指定に使える?)
  • :pre:post で事前条件、事後条件を設定できる。つまり、契約による設計をシンタックスとしてサポートしている。
(def twice
  (fn [n]
    {:pre [(> n 0)]
     :post [(even? %) (>= % 2)]
    (* n 2)}))

(twice -1)   ;これは Assertion Error になる
(twice 3)    ;6 を返す

雑感

RubyLisp の影響が強い言語だから Clojure にも近い部分が有るけど、 Clojure はより関数型言語であることや並列処理を意識していて、そういうのが Ruby より強いのは興味をそそった。 また、僕は文法がごちゃごちゃした言語は苦手だ。Lispは文法はすごく単純だ。しかも Clojure は他の Lisp に比べても簡素にかけるように工夫されている。そういうところが気に入った。

だいたい自分に合わない言語の場合、この手の本を最後まで読み終えることが出来ないから、最後までよんでも興味を失っていないということはそれなりにあっているのだと思う。

ClojureRuby と比較すると、まず並列処理に優れている。Ruby (cRuby) は GIL (Global Interpreter Lock) により基本的には1つのCPUしか使わないようになっているから、複数のCPUがある環境ではCPUのパワーを存分に発揮することは出来ないし、Rubyの文法は並列処理を意識したものではない。 ClojureRuby と同じく動的型付け言語だけど、 関数にメタデータを設定することで Ruby よりも入力値・出力値の安全性を上げられそうだと感じた。なにも Haskell のような型の考え方だけが正解ではないだろう。それに僕は未だに動的型付け言語の方が好きだ。確かに今まで幾度となくダックタイピングを悪用したひどいコードを見たことは有るけど、僕がそういうコードを書いたわけじゃないしね。 上記の2つは Ruby 3 で対応が宣言されていることでも有るから、 Clojure はほぼ Ruby 3 と考えてもいいんじゃなかろうか。これはもちろん暴論だけど、僕はそんなふうにとらえた。

次の本ももっているので読んで見るつもりだ。

Clojure for the Brave and True: Learn the Ultimate Language and Become a Better Programmer

Clojure for the Brave and True: Learn the Ultimate Language and Become a Better Programmer

プログラミングClojure 第2版

プログラミングClojure 第2版