Geek-Side

Resource > Clojure Memo

cond

Gaucheと比べると、
  • cond節の 条件 + 戻り値 をカッコで囲わないのでカッコの数が減る
  • どの条件にも合わない場合の戻り値は :else キーワードに続いて書く
(defn length [x]
(cond (= '() x) 0
:else (+ 1 (length (rest x)))))

let

変数バインディングを[]内で行う
(let [binding] expression)

letfn

関数内で使う関数を定義する。
(letfn [binding] expression)
cl
 (defn hoge []
   (letfn [(fuga [] (print "foo"))]
     (do (print "bar") (fuga))))

ドット対

ドット対がない

マップ

mapは{}でくくって表記する。
キーワードを使用した場合は、mapの検索が柔軟になる。
 (def valu {:hoge "foo" :fuga "bar"})
 (:hoge valu)
 (valu :hoge)
 "foo"

キーワードを使用しない場合は、mapの検索は キーをmapに渡す形となる。
 (def valu {"hoge" "foo", "fuga" "bar"})
 (valu "hoge")
 "foo"

immutable

Clojureではほとんどのオブジェクトは変更不可。
setq, setf, rplacd, rplaca等はない。
refによりmutableな変数を作ることはできる。

metadata

metadataの付与
 (defn hoge #^{:test ....} hoge-function)
metadataの見る
 ^#'hoge-function

述語

string? (string? "hoge") => true
number? (number? 1) => true
seq? (seq? '(1 2 3)) => true

Sequence

(ffirst '((1 2) 3)) (first (first '((1 2) 3))) => 1
(fnext '(1 2 3)) (first (next '(1 2 3))) => 2

classpath

*** classpathの表示
 (use 'clojure.contrib.classpath)
 (classpath)

classpathの設定

ClojureBoxの場合は.emacsを編集

  (setq swank-clojure-classpath
     (list "c:/hoge.jar" "c:/dev/my-lib.jar"))