Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
18
Help us understand the problem. What is going on with this article?
@ksato9700

JavaScript、森でClojureに出会う

More than 5 years have passed since last update.

Moriというライブラリを見つけた。

どうやら、Clojure永続データ構造 (persistent data structure)をJavaScript環境に提供するモノらしい。ライブラリ自体はClojureScriptで書かれていて、それがJavaScriptやCoffeeScriptから使えるようになっている。

永続データ構造は「不変オブジェクト(immutable object)」とも呼ばれるが、要は作成後に値が変更できないデータ。C++のconst指定された変数やJavaのString Classのインスタンスがそれに当たる。Clojureでは基本的にデータはimmutableで、オブジェクトに操作が加わる度に新しいオブジェクトができる。

「それって非効率!」って思うがそれ相当の利点もある。例えば、JavaScriptで以下の操作を考える。

var a = [1,2,3];
var b = a;
b.push(4);
console.log(b); // --> [1,2,3,4]  (bに4が追加された)
console.log(a); // --> [1,2,3,4]  (aも変わっちゃった!)

aとbは同じオブジェクトを参照しているので当たり前の結果だが、こういった参照コピーを繰り返すと思わぬところでの変更が他に波及したりする。まぁ、それが起きないように設計するのが筋なのだが、bだけに変更を加えるにはコピーしてから使うか、Array.concat()の様に元のデータに影響を与えないメソッドを使うしかない。

で、Clojureが取っているのは後者のアプローチ。つまりデータを直接いじるメソッドは無い。代わりにデータを受け取り、変更して返す関数を色々と取り揃えている。

効率に関しても、元データがimmutableであることが保証されるとコピーの際も元のデータを参照した上で変更分だけ記録なんてことができるのでそれほどおかしな事にはならない。

そしてMoriはそれをJavascriptの世界に持ってきた。

以下はnode.jsで使う場合だが、まずインストールはいつもの様にnpmで。

$ npm install mori

そして上記の例はこうなる。

var mori = require("mori");

var a = mori.vector(1,2,3);
var b = mori.conj(a, 4);
console.log(b); // --> [1,2,3,4] (bに4が追加された)
console.log(a); // --> [1,2,3] (aの値は不変)

さらにfunctional programming 風にこんなことも。

var mori = require("mori");

var inc = function(n) {
  return n+1;
};
var sum = function(a, b) {
  return a + b;
};

var a = mori.list(1,2,3,4,5);
var b = mori.map(inc, a);
var c = mori.reduce(sum, b);

console.log(a); // --> (1 2 3 4 5) (もちろんaの値は不変)
console.log(b); // --> (2 3 4 5 6) (それぞれの値に1が足されている)
console.log(c); // --> 20 (bの値の総和)

当然CoffeeScriptでも使えて、上記例を思いっきり短くするとこうなる。

mori = require "mori"

inc = (n)-> n+1
sum = (a, b)-> a+b

c = mori.reduce sum, mori.map inc, mori.list 1,2,3,4,5
console.log c # --> 20

さすがにここまでカッコを省略すると判りにくいか ...

18
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
caddi
製造業の受発注プラットフォーム「CADDi」を提供しています。 モノづくりに携わるすべての人が、本来持っている力を最大限に発揮できる社会を実現する。産業の常識を変える「新たな仕組み」をつくります。 「CADDi」は金属加工品のCAD・設計図の解析から複雑な物流を表現するUIまで幅広い開発をしており、常に開発環境に最新の技術をとり入れて、より良いプロダクトを作るように心がけております。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
18
Help us understand the problem. What is going on with this article?