by shigemk2

当面は技術的なことしか書かない

Immutable時代のプログラミング言語 Clojure #渋谷JVM

twitter.com

特長

  • 重要なのはイミュータブルであること
  • Lisp
  • 関数型プログラミング
  • 確固たるプラットフォームと共生(.netやJS上でも動く)
  • 型にこだわる人にはなじまないかも
  • Concurrencyのためにデザイン(マルチコア)

github.com

Simple

  • ひとつの役割
  • ひとつのタスク
  • ひとつの概念
  • ひとつの次元

シンプルな構成要素を定義しようっていうのがClojureの思想

Easy

  • すぐに実現できる
  • IDE
  • apt-get gem install

Complex or Simple

  • 状態やオブジェクトは複雑、値はシンプル
  • メソッドは複雑、関数やネームスペースはシンプル
  • 出来るだけvarは使いたくない

複雑さのもとは組み合わせ

  • 状態=触るもの皆複雑
  • オブジェクト=状態、アイデンティティ、値 → これらのものは分解しよう
  • 文法 意味と順序

Abstraction

計算機プログラムの構造と解釈[第2版]

計算機プログラムの構造と解釈[第2版]

  • 作者: ハロルドエイブルソン,ジュリーサスマン,ジェラルド・ジェイサスマン,Harold Abelson,Julie Sussman,Gerald Jay Sussman,和田英一
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/05/17
  • メディア: 大型本
  • この商品を含むブログ (1件) を見る

  • 10のデータ構造に10の関数操作があるよりも、1つのデータ構造に100の関数操作があるほうがいい
  • seq function

Clojure - sequences

Clojureについて使いたくなる本

Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers)

Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers)

  • 非同期プログラミングのやり方が書いてある

Immutable

  • すべてがイミュータブル
(println "Hello World!")

Sharing Structure

  • イミュータブルっていうともとのデータ構造をコピーしている
  • コレクションに対して変更操作すると新しいコレクションがかえるが、変更のないデータは共有される

Managed refs

あまり実用的じゃない部分があるので、refの仕組みがある

Clojure - refs

  • 参照先を切り替える(若干いんちきくさい)

Epochal time model

www.safaribooksonline.com

過去の事実はそのまま残しておいて、状態を変更する。

Identity/State/Value

  • Identity 普遍的に同一実体
  • State ある時点の集合
  • Value 不変なデータ

STM

  • 複数のrefsを一貫性を持って更新したい
  • STMはロックをしない
  • Clojureが出た最初はSTMが標準実装されていた
  • でもSTMは性能が出にくい
  • ClojureのConcurrencyの対応としてcore.asyncが使われている

core.async

  • イミュータビリティを基礎として作られたライブラリ
  • 別のスレッドで呼び出す

github.com

  • スレッドベース。ひとつの処理はひとつのスレッド、チャネルの入出力でブロック
  • 並列性と多くのスレッドを要求する
  • スレッドプールからスレッドを取り出す
  • スレッドマクロに渡されたコードを実行する

  • コルーチンベース。ブロック地点でpark状態にし、スレッドをプールに戻す。少ないスレッドで並行処理ができるのがメリット。

  • JVMだとサイズが大きくなる。
  • core.asyncはClojureScritpでも、Clojureと全く同じように動く。
  • ただ、JavaScriptはシングルスレッドモデルなので、goのみ対応。

core.asyncのいけてるところ

  • go配下の構文解析
  • ブロック呼び出しの箇所を分割
  • ただのライブラリなので本体とは非依存
  • やっぱりマクロはすごい

Clojureをはじめてみよう

  • 依存性はleiningen(ライニンゲン)
  • IDEはLighttableもしくは Emacs + cider(開発者はEmacsが多い)

独習サイト

4clojure – Welcome!

Clojureはわりと実用的でRubyと同じようなアーキテクチャスタックで開発出来る

  • (Clojure)tomcat jetty Ring Compojure hiccup enlive
  • (Ruby)thin puma Rack Sinatra Haml Erb

Clojurescript

github.com

Google Clojure CompilerをつかってJSに変換。CircleCIなどで実績あり。

Grunt / Gulp layer

  • leiningenに統合されている
  • Aggregate / Minify
  • ライブラリロード

React

  • ReactもClojurescriptから自在に使える(JSX不要 すべてLispっぽく)

業務だとどうなの?

Excel開発も出来る

Excel界隈のつらみをどうにかしたい

qiita.com

github.com

仕事の開発

Job Streamer

www.slideshare.net

あなたとClojure今すぐイミュータブル

  • Lispのコンセプトを学びたくてClojure
  • 習得する際はClojureで何がしかのアプリを書いてみる