random-docs (2014年の最初の記事)

あけましておめでとうございます。

昨年末は F# の勉強ばかりしていて、そろそろ Clojure 熱も上がってきたのでなんとなく思いつきで書いてみました。小ネタです。

clojure.core の doc string をたまには思い出そうと。本当は twitterの bot にでもすれば一番いいのですが、doc string が140文字を楽勝で超えてしまう関数もいっぱいあるので、「時折思い出させる」仕掛けをどうするかは、別途考え中です。

(defn get-doc-string
  [ns sym]
  (let [wrt (java.io.StringWriter.)]
    (binding [*out* wrt]
      (->> (ns-resolve ns sym)
           (meta)
           (#'clojure.repl/print-doc)))
    (.toString wrt)))

(def syms (-> 'clojure.core ns-map keys sort))

(def clojure-core-docs (->> syms (map #(get-doc-string 'clojure.core %))))

(defn random-docs
  []
  (println (rand-nth clojure-core-docs)))

clojure.doc/doc 相当のことをやろうとして、clojure.repl/doc を見てみたら、private な関数 clojure.repl/print-doc を呼んでいたので、#' をつけています。

Usage:

user> (random-docs)
-------------------------
clojure.core/not-every?
([pred coll])
  Returns false if (pred x) is logical true for every x in
  coll, else true.

nil
user> (random-docs)
-------------------------
clojure.core/rational?
([n])
  Returns true if n is a rational number

nil
user>

新年一発目は小ネタということで。今年もよろしくお願いします。

comments powered by Disqus