sequence関係のユーティリティ関数で自分がよく知らないものをまとめておく。
昔はindexed
っていうそのまんまな関数があったけど、1.3くらいからなくなっていた。今はmap-indexed
っていう関数を使う。よく使うのはこんな感じの使い方。
(map-indexed #(vector %1 %2) ["a" "b" "c" "d" "e"])
; ([0 "a"] [1 "b"] [2 "c"] [3 "d"] [4 "e"])
個人的にはコレクションと配列との使用メモリ量比較が参考になりました.1M 個の long を格納するとして,vector だと 30MB, vector-of だと 9MB, 配列だと 8MB というのは覚えておいて損は無さそうです.案外 vector はメモリを食いません.
(defn current-total-memory-usage []
(dolist (var init-form result) S式 ... )
dolist は名前が示すように、リストに関係があります。最初に init-form を評価します。このとき、評価結果はリストでなければいけません。リスト以外の場合はエラーとなります。dolist は、このリストの要素を順番に変数 var に代入して S 式を評価します。リストの要素がなくなったら result を評価し、その値が dolist の返り値になります。次の例を見てください。
;; Clojureでのhashcodeの例 | |
(hash "hoge") ; 3208229 | |
;; clojureのvectorはよい | |
(hash [1 2 3]) ; 30817 | |
;; javaの配列は毎回hashcodeが変わってしまうので注意 | |
(hash (int-array [1 2 3])) ; 1628598432 | |
(hash (int-array [1 2 3])) ; 1172445666 | |
;; feature hashingの例 |
(import edu.stanford.nlp.trees.PennTreeReader) | |
(let [filename "/Users/yasuhisa/Desktop/PENN_TREEBANK3/PARSED/MRG/WSJ/00/WSJ_0001.MRG"] | |
(with-open [rdr (clojure.java.io/reader filename)] | |
(let [ptr (new PennTreeReader rdr) | |
trees (loop [result []] | |
(if-let [t (.readTree ptr)] | |
(recur (conj result t)) | |
result))] | |
(for [^LabeledScoredTreeNode t trees] |
#_(defdeps | |
[[org.clojure/clojure "1.5.1"] | |
[info.yasuhisay/clj-utils "0.1.1"] | |
[org.clojure/tools.cli "0.2.1"]]) | |
(ns info.yasuhisay.dep-util | |
(:use [clojure.string :only (split)]) | |
(:use [clj-utils.random :only (shuffle-with-random)]) | |
(:require [clojure.tools.cli :as cli])) |
test
test