ほんのすこしだけClojureで遊びました。

( defn argcount ( [] 0 ) ( [x] 1 ) ( [x y] 2 ) ( [x y & more] ( + ( argcount x y ) ( count more ))))

こんなにシンプルに書けてすごい。

( defn make-adder [x] ( let [y x] ( fn [z] ( + y z )))) ( def add2 ( make-adder 2 )) ( add2 4 ) -> 6

これはJSでも似たように書けるっすね。

const make_adder = x => { let y = x return z => { return y + z } } const add2 = make_adder(2) console.log(add2(4))

defn は def と fn のシンタックスシュガーだと書いてあったけど、JSで言うなら、 const func = () => { } みたいなもんだな。別に const func = function () { } でもいいですけど。

let はどういう使い方をするのだろうと思ったけど、 (let [pi 3.1415, num 42]) という風にカンマ区切りで指定していけば良いんですね。

// 追記: でもカンマ区切りっておかしいだろうなあ、どういう意味合いになるんだろうと思っていたのだけれど、 , は空白とか、スペースとかと同じで無視されるみたいだった。

Clojure - Functional Programming

関数型プログラミングは難しそうだなと思っていたけど、これを関数型プログラミングというなら、JavaScriptの流れでやっていけばとっつきやすいですね。

user=> ( defn number-size [number] ( cond ( < number 50 ) "small" ( and ( <= 50 number ) ( < number 100 )) "midium" :else "large" ))

Clojure言語基本の「き」（その２） - 達人プログラマーを目指して より

この例で登場した :else とは何者なんだろう…と思っていたのだけれど、これはシンボルなら何でもいいんですね。試しにこんなコードを書いてみましたが "b" が出力された。

( cond ( == 0 1 ) "a" :hoge "b" )

参考にしたサイト