Clojureを触った
ほんのすこしだけ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言語基本の「き」(その2) - 達人プログラマーを目指して より
この例で登場した:else
とは何者なんだろう…と思っていたのだけれど、これはシンボルなら何でもいいんですね。試しにこんなコードを書いてみましたが"b"
が出力された。
(cond (== 0 1) "a" :hoge "b" )