clojure

clojureの再帰とスタックオーバーフロー(remove-first)

たまたまcljureのMLを見ていた時に、nickiktさんという人が 「"scheme-remove-first"という関数を 書いたのだけれど、自分の実装ではstack overflowしてしまうので気に入らない。 誰かだれかもっと良いバージョンを書いてみてくれ https://groups.google.com…

久しぶりの更新。treeコマンドを作った。

はじまり 何だか最近は更新も滞って何も書いていませんでした。 たまたま、clojureでtreeコマンドを実装しているのをみて作ってみました。treeコマンドをsequenceだけを使って実装できそうな気がしたのです。 例えば、1,2,3…という数列を作る時には、iterate…

lazy-sequenceって重要ですね><

http://d.hatena.ne.jp/kencoba/20100405/1270433351 速度が全然違う>< (defn move [a b] ['move a 'to b]) (defn hanoi [a b c n] (if (< n 1) nil (if (= n 1) (list (move a c)) (concat (hanoi a c b (- n 1)) (cons (move a c) (hanoi b a c (- n 1))…

clojureでテスト

clojure.testを使ってテストを書いてみる。テストの書き方には2つ方法がある。 defnでの関数定義と一緒にテストを書く deftestで個別にテストを書く テスト書く->(run-tests)という感じで大丈夫 簡単な例 (use 'clojure.test) ;;metaに:testを定義することも…

googleAPIから天気を取得2

http://d.hatena.ne.jp/trotr/20100328 昨日のは無駄な再実装をしていた。 zip-filterあたりを使えば良かったようです。t (require '[clojure.zip :as z]) (require '[clojure.contrib.zip-filter :as zf]) (require '[clojure.contrib.zip-filter.xml :as z…

googleAPIから天気の取得

clojure.xmlのparseにhtmlの文字列を渡せば{:tag :attrs :content)の木として取り出せる。 これをlazy-sequenceにしてfilterをかけていって取り出せばいいのかな? たぶんだけどxpathのようなものが使えるライブラリがどこかにあるはず。どこにあるんだろう…

repl-serverを立ち上げてclojureの起動時間を短縮

はじめに clojure,scala,jrubyとかjvmの上に乗った言語は起動がとても遅い。*1 そんなわけで、これをどうにかしたいと思っていたのでした。 emacsclientのようにserverを立ち上げてそれにアクセスするという形にすれば起動は一回で済みそうです。 まだまだ改…

project-euler1〜20

clojureで書くことに慣れるために簡単な問題を解いてみる。 my.math.prime 自分用の個人的なライブラリはどのあたりに置くのが良いのだろう(今は~/mylib/clojure以下に置いている) (ns my.math.prime (:use clojure.contrib.math)) (defn prime? [n] (let [s…

雑にだけれどtransient+persistent!の評価

すごく簡単な初期化のような処理じゃない限りそこまで速度に差はない。 (let [xs (range 1 1000)] (time (dotimes [i 1000] (reduce conj [] xs))) (time (dotimes [i 1000] (persistent! (reduce conj! (transient []) xs))))) ;; ; => ;; "Elapsed time: 1…

1ファイルだけのcall-graph

そのファイルで定義された関数だけ見る。let-fnやletの中で定義された関数は無視。 (use '[clojure.contrib.duck-streams :only (reader writer with-out-writer)]) (use '[clojure.contrib.str-utils :only (re-gsub)]) (defn read-sexps "Like read-lines …

contrib.str-utils

str-utilsはdefaultで利用できるようになっている方が便利だなー。 (use 'clojure.contrib.str-utils)が必要 re-sub/re-gsub rubyのString#sub,String#gsubと同様 (re-sub #"a" "@" "abc is abc in abcmart") ; => "@bc is abc in abcmart" (re-gsub #"a" "@…

contrib.seq-utilsを使ってみた。

使い方のカタログ的なもの。 (use 'clojure.contrib.seq-utils)が必要。 separate gaucheのpartitionみたいなもの。述語をひとつ取り真か偽かで仕分けする。 (def nums (take 10 (iterate inc 0))) (filter odd? nums) ; => (1 3 5 7 9) (filter (complement…

clojureのファイルIO

プログラミングclojureは読み物としては面白いのですが、実際に自分でclojureのコードを書こうとするとすこし手間取ってしまいます。*1 ファイルIOもそのようなうちのひとつなのですが、clojureでのファイルIOについて少し調べてみました。 とりあえず以下の…

練習問題 - プログラミングスレまとめ in VIPをやってみる

全体的にlazy-seqをたくさん使っているみたい。 FizzBuzz 無限ストリーム(sequence)なこと以外特筆することはなさそう。 (def fizzbuzzs (for [i (iterate inc 1)] (cond (= 0 (rem i 3) (rem i 5)) "fizzbuzz" (= 0 (rem i 3)) "fizz" (= 0 (rem i 5)) "buz…

逆引きclojure文字列の部分(途中)

合っているのか自信がないのでblogに貼るだけにしておく 今のところ 文字のリスト(sequence)から文字列を作成する上手い方法が見つかっていない。 暫定的な対応策は以下 (defn cs-to-str [cs] (String. #^"[C" (into-array Character/TYPE cs))) 文字列を結…

clojureの中を覗く

classpathのリスト 現在のnamespaceで利用できる関数 classが持っているmethod classpath clojureはjavaのSystemClassLoader以外のところにclasspathを格納していた。 (defn current-classpath [] (let [xs (list (.. java.lang.ClassLoader getSystemClassL…

clojureでAAを生成する。

何だかまだclojureには慣れないなー*1 read-lines*とか自分で作らなければいけないはずがないとおもうのだけと。*2 (ns tool.aa (:use [clojure.contrib.command-line :only (with-command-line)] [clojure.contrib.duck-streams :only (reader)]) (:import …

clojureで簡易grepコマンドを作ってみる。

必要なこと ファイルの読み込み方(できればseqで取り出したい) clojure.contrib.duck-streamsのread-linesとreaderを使えばいい。 正規表現の使い方 re-find,re-pattern .classファイルの生成の仕方 (compile ) code ;;file:tgrep.clj (ns tgrep (:gen-class…

現在のclojure用のemacsの設定

http://gist.github.com/297284 docstringとかまったく書いていない。defcustomも存在しない。

3と3の倍数(正規表現の使い方)

正規表現は自己適用的じゃないみたい。re-findを使えば良いらしい。 x->stringのようなものが何なのか分からない。とりあえず、with-out-strを利用している。 (map (fn [i] (if (or (zero? (rem i 3)) (re-find #"3" (with-out-str (print i)))) "@" i)) (ra…

class-pathを追加するのが面倒。

jvm系の言語はclass-pathを追加する機会が頻繁にあるのかな?良く分かっていないけれど、~/.clojureに読み込む必要がありそうなファイルを列挙してそれを読み込む関数を書いた。(ファイルならそれ自身、ディレクトリなら直下の.jarファイル) http://d.hatena…

clojure用emacsの設定

slimeとか良く分からないので、必要そうなものを自分で書いた。 あとでここに書いてある設定が不要になることもあるかもしれない。 run-clojure schemeの設定と同様に"C-c S"でclojureのreplを立ち上げる。 既にreplが立ち上がっている場合には、other-windo…