2010-03-01から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のようなものが使えるライブラリがどこかにあるはず。どこにあるんだろう…

ふざけてましたすいません。

ANSI Common Lisp入門? lispの世界へようこそ 練習問題3

carとcdrを使って、リストの4番目の要素を返す関数を定義せよ。 4を渡したときにcarとcdrを使って、リストの4番目の要素を返す関数を返す関数を定義すればいいのかなー? これは上の2つより簡単そうですね。 (define (repeat$ n f) (apply compose (make-lis…

ANSI Common Lisp入門? lispの世界へようこそ 練習問題2

(a b c)を返すcons式を3通り示せ。 これは(a b c)を渡したときに(a b c)を返す3通りのcons式を返す関数を定義しろという問題ですね。分かります>< (use util.match) (define (cons: x y) `(cons ,x ,y)) (define (f xs) (match xs [() '()] [(x . xr) (con…

ANSI Common Lisp入門? lispの世界へようこそ 練習問題1

http://d.hatena.ne.jp/sDaigo/comment?date=20100325#c lisp難しいです><。分からないのでschemeで回答します。 以下の式が評価された時何が起こるか説明せよ (+ (- 5 1) (+ 3 7)) (list 1 (+ 2 3)) (if (listp 1) (+ 1 2) (+ 3 4)) (list (and (listp 3)…

.emacsの設定に役立つ関数

.emacsの中で定義していて便利だなと感じる関数/マクロの紹介。 とりあえず、aifとand-let*はUtilityとして必要かなと思います。 他にon-offを切り替えるトグルスイッチ見たいな関数を楽に定義できるdef-toggleというものを定義して使っています。 utilitie…

カーソルの色を変えるelisp

何だか面白そうだったので http://d.hatena.ne.jp/kitokitoki/20100322/p3 http://d.hatena.ne.jp/hitode909/20100322/1269232929 違い emacs上で名前がつけられている全ての色からランダムで選ぶようにした run-with-idle-timerを使ってみた*1 blink-modeと…

pythonのrangeをschemeで

http://d.hatena.ne.jp/jdg/20100323/1269346849 どうしてたくさんのerror処理が入っているのかよく分からないのですが、単純にpythonのrangeをschemeに直すとこのような感じになるのではないでしょうか? (define (step$ n) (lambda (x) (+ n x))) (define …

結構かんたんにtraceって書けるものなんだなー

(use gauche.parameter) (define *depth* (make-parameter 0)) (define *origin-fun* (make-parameter #f)) (define-macro (trace f) `(begin (*origin-fun* ,f) (set! ,f (lambda args (let* ((d (*depth*)) (padding (make-string d #\space))) (print pad…

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 …

一気にuse

こんなの便利かな-。 (define-macro (use* prefix args) `(begin ,@(map (lambda (x) (let1 xs (map symbol->string (list prefix x)) `(use ,(string->symbol (string-join xs "."))))) args))) (use* binary (io pack)) ;;(begin (use binary.io) ;; (use …

新たな変数名の作成

http://d.hatena.ne.jp/yagiey/20100305/1267761841 手元にプログラミングgaucheがないので不確かなことを言っているかもしませんが、新たな変数名の作成というのは、渡された引数をマクロの中で変換して創り出した新しいsymbolを利用した手続きや変数の定義…

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" "@…

やる気が起きない。