Resource > Clojure Memo
(cond (= '() x) 0
:else (+ 1 (length (rest x)))))
(let [binding] expression)
(letfn [binding] expression)
キーワードを使用した場合は、mapの検索が柔軟になる。
キーワードを使用しない場合は、mapの検索は キーをmapに渡す形となる。
setq, setf, rplacd, rplaca等はない。
refによりmutableな変数を作ることはできる。
cond
Gaucheと比べると、- cond節の 条件 + 戻り値 をカッコで囲わないのでカッコの数が減る
- どの条件にも合わない場合の戻り値は :else キーワードに続いて書く
(cond (= '() x) 0
:else (+ 1 (length (rest x)))))
let
変数バインディングを[]内で行う(let [binding] expression)
letfn
関数内で使う関数を定義する。(letfn [binding] expression)
(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"))