半空洞男女関係

思ったこととかプログラミングしてるときのメモとか色々かいてます。メールはidそのままgmail

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))

defndeffnシンタックスシュガーだと書いてあったけど、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"
)

参考にしたサイト