Clojureの基礎〜Clojureの特徴〜

Clojureの基礎〜名前空間〜 - oknknicの日記」に引き続き基礎メモ。
基本に立ち返って、Clojureの特徴を整理。

Lispである

構文をほとんどもたず、同図像性がある
  • 言語を拡張し易い
    • コードはデータであるため、コードを生成するコード(メタプログラム)を簡潔に記述できる
    • コードを生成するコードを記述する仕組みであるマクロ
    • マクロにより、実装対象の領域に合わせて言語拡張(DSL開発)(ボトムアップ開発)
関数型言語(ただし非純粋)
  • 関数が第一級のオブジェクト
    • 実行時に関数を生成できる
    • 関数を引数にした関数を定義できる(高階関数
    • 関数を返す関数を定義できる
  • 純粋関数は副作用をもたない
    • データは不変になるため、必然的にスレッドセーフ
    • 複数の関数を組み合わせても、想定外の相互作用が発生し辛い
  • 純粋関数は参照透過性をもつ
    • 遅延評価できる
    • メモ化できる
    • 並列化できる
  • 関数実行に必要な情報は引数のみである
    • 引数のみ準備すればよいため、テストし易い
非純粋関数型言語としての特徴
  • 副作用のサポート
    • 参照、エージェント、アトム、そしてソフトウェアトランザクショナルメモリ
    • 動的束縛

JVM上で動く

  • JVMは安定した基盤である
  • 多くの環境に導入されているため、実行環境の敷居が低い
  • 豊富なライブラリを直接利用可能である
  • 再帰における末尾呼び出し最適化はできない(JVMの制約)
    • 自己再帰(recur)や遅延評価による対処は可能

JVM以外でも動く

  • ClojureScript
  • ClojureCLR

その他便利な点

参考文献

プログラミングClojure 第2版

プログラミングClojure 第2版