clojure

ClojureでMongoDBにアクセスしてみる2

マップの中にマップがあるような場合のアクセス方法。 get-in関数を使って、キーを順番に指定して取り出す。 実行結果 user> (use 'somnium.congomongo) nil user> (mongo! :db "mydb") true user> (insert! :robots {:name1 "robby1" :name2 {:name-2-1 "ro…

ClojureでMongoDBにアクセスしてみる

MongoDBというのをちょっと触ってみたかったので、Clojureからアクセスしてみた。Clojureのライブラリにはcongomongoを使用。ググったらこれが出てきたので、ひとまずこれを使ってみた。基本的にはcongomongoのページに書いてあったものをベースに、少しだけ…

ClojureによるDBアクセス

SQLiteを使用して、ClojureによるDBアクセス処理を行う。 処理の流れは、以下の通り。 テーブル削除 テーブル作成 レコード登録 レコード更新 レコード削除 レコード削除後、例外を発生させてロールバック 実行結果にある(1 1)、(1)、(2)は更新件数。更新処…

clojureでgmailを使ってメールを送信してみる

Clojureでgmailを使ってメール送信するコードを書いてみた。サンプルなのであくまで単純に。 leiningenを使っているので、project.cljも一緒に乗せておく。 commons-emailを使っているので、dependenciesに記述しています。 (defproject send-gmail "1.0.0-S…

clojureでマルチメソッドを試してみる

JavaのオーバーロードをClojureではどうやって表現するだろうと疑問に思い調べてみました。 結論としては、マルチメソッドを使用すれば可能。 以下は簡単なサンプル。 user> (defmulti hoge class) #'user/hoge user> (defmethod hoge String [x] (str "Stri…

clojureでMapオブジェクトを相互変換してみる

JavaのMapオブジェクトとClojureのMapオブジェクトを相互変換する場合、どうしたら良いのだろうと思い、少し調べてみた。まず、java.util.HashMapを使った場合の動きを確認してみる。 HashMapの場合、シンボルをキーにしているとClojureっぽく呼び出せる。そ…

java.util.DateクラスのtoStringメソッドの文字列からjava.util.Dateオブジェクトを生成する

これまた通常あまり使うことはない気もするけど、ハマったので記録として残しておく。 java.util.DateクラスでtoStringメソッドを呼び出すと「Wed Apr 07 21:26:05 JST 2010」のような形式の文字列を表示する。こいつから逆にjava.util.Dateオブジェクトを生…

clojureでtar.gzファイルにアクセスしてみる

元々はJavaでtar.gzファイルにアクセスする方法を調べていて、Clojureの勉強も兼ねてそっちのコードも書いてみる。 leiningenでプロジェクト作って試していたので、-main関数とかも書いて、引数でファイル名を受け取れるようにしている。 ポイントはloopマク…

clojureでnslookupコマンドもどきを試してみる

これもJavaで調べていた物をClojureの勉強兼ねてコードを書いたもの。 ドメインを渡すとIPアドレスを返すという、nslookupコマンドもどきです。 こちらはREPL環境でちょっと試しただけ。 単純にjava.net InetAddressを使っているだけなので、目新しさは無い…

clojureでtwitterの検索機能を試してみる

こちらもclojureの勉強を兼ねて。タイムラインを取得するときにはユーザ名とパスワードを指定したけど、普通に検索するだけなら不要。 search関数の引数にQueryオブジェクトを渡す必要があるので、若干見づらいかな。 検索結果はgetTweetsで取り出さないと行…

clojureでtwitterのタイムラインを取得してみる

clojureの勉強を兼ねてるけど、twitter4jなるJavaライブラリがあることをしったので、それを少し試してみる。 同じコードはtwitterにも書いたけど、あれは改行無しのワンライナー状態なのでちょっと整形。 (import '(twitter4j TwitterFactory)) (map #(str …

clojureでリストとベクタに値を追加してみる

"->"マクロを使って、リストやベクタに値を追加することも出来るけど、そんな面倒なことしなくても良いと言うことで、clojure.contrib.accumulatorsを使ってみる。 user=> (use 'clojure.contrib.accumulators) nil user=> (add-items () '(1)) (1) user=> (…

clojureでメタデータを試してみる

自分が見ていたアローマクロのソースでは、何故か内部でmeta関数を使っていました。ただ、その後別のバージョンのソースを見ると使っていなかったりして、よく分からない。 それはともかく、ついでにメタデータを少し試してみた。 メタデータは使い方次第で…

clojureでアローマクロを試してみる

"->"をアローマクロと呼ぶのか分からないけど、他の呼び方が分からないので、とりあえずそう呼ぶ。 アローマクロを使ってマップに値を追加する方法 以下のように使用する。 user=> (-> {} (assoc :a 1)) {:a 1} user=> (-> {} (assoc :a 1) (assoc :b 2)) {:…

clojureで無名関数に複数の引数を渡してみる

無名関数って、複数の引数渡せないかと思ったらそんな事無かった。 途中に引数が多かったり少ない場合なども試してみた。 %1とか%2が第1引数、第2引数に相当する。%&を使うと残りの引数をまとめてリストで受け取れる。 user=> (#(str %) 1) "1" user=> (#(st…

clojureで関数を合成してみる

2つ以上の関数をcomp関数を使って合成してみる。関数を合成した場合、右から左に関数が適用される。 最初の例は、引数で与えられた1をインクリメントしてから2乗する。 次の例は、引数で与えられた1を2乗してからインクリメントする。 user=> ((comp (fn [x]…

clojureで変数にドキュメントを付けてる見る

プログラミングClojureの144ページを読んでいたら、clojureでは変数にドキュメントを付けられると言うことが分かったので試してみた。 まずはuseをつかってライブラリを読み込み、変数を定義する。その時にドキュメント文字列も一緒にセット。それから、doc…

clojureの関数定義で可変長引数を使ってみる

引数につく"&"って何だろうと思ったら、可変長引数を表す記号だったのか。 引数固定の場合、引数が1つの関数に2つ以上渡すとエラーになる。 user=> (defn func1 [arg] (str arg)) #'user/func1 user=> (func1 1) "1" user=> (func1 1 2) java.lang.IllegalAr…

clojureでプラスとかマイナス演算子を変数に突っ込んでみる

実際には、clojureの場合、プラスとかマイナスは演算子ではなく関数です。 関数ということは変数に入れられます。 まずはプラスの場合。変数fにプラス関数を入れてみる。 user=> (def f +) (def f +) #'user/f user=> (f 100 200 300) (f 100 200 300) 600 …

clojureで関数を変数に突っ込んでみる

toUpperCaseというのは、JavaのStringクラスにあるメソッドです。 clojureでそれを使ってみる。 まずは普通に呼び出してみる。 user=> (.toUpperCase "hoge") "HOGE" 次に一度fという変数に入れてから、後から呼び出してみる。 user=> (def f #(.toUpperCase…

clojureのイコール関数を使っていろいろ比較してみる2

こんな比較をしてみた。 リスト、ベクタ、list関数、vec関数、vector関数を使って比較。 user=> (= [1 1] '(1 1) (list 1 1) (vec [1 1]) (vec '(1 1)) (vector 1 1)) true

clojureのイコール関数を使っていろいろ比較してみる1

引数が2つ以上でも普通に比較が可能。リストとベクタが混在していても比較が可能。 user=> (= 1 1) true user=> (= 1 1 1) true user=> (= 1 1 2) false user=> (= [1 1] [1 1]) true user=> (= [1 1] [1 2]) false user=> (= [1 1] '(1 1)) true user=> (= …

clojureでセットを使ってみる

clojure勉強中。 clojureで空セットを作ってみる hash-set関数の場合は、引数無しでも実行可能。 set関数の場合は、空のリストの指定が必要。 user=> #{} #{} user=> (hash-set) #{} user=> (set ()) #{} user=> (set '()) #{} user=> (set []) #{} clojure…

clojureでハッシュを使ってみる

ハッシュを使ってみる。 "{}"の中に、"key value"という順番で記述する。 user=> {:a 1 :b 2} {:a 1, :b 2} キーの値を取得する場合には、キーを関数、ハッシュを引数にする。 以下の場合、":a"というキーの値である"1"を取得している。 user=> (:a {:a 1 :b…

clojureでrangeを使ってみる

range関数を使って、一覧を取得する。 指定する引数によって初期値、ステップする数が変わる。 user=> (range 10) (0 1 2 3 4 5 6 7 8 9) user=> (range 2 10) (2 3 4 5 6 7 8 9) user=> (range 2 10 3) (2 5 8)

clojureで関数の定義

clojure勉強中。 関数を定義する user=> (defn func1 "This is a test function." [arg1 arg2 arg3] (println arg1 arg2 arg3)) #'user/func1 user=> (func1 "hoge" "foo" "bar") hoge foo bar nil 関数の説明を見る user=> (find-doc "func1") ------------…

clojure-modeのインストール

EmacsでClojureのソースを見やすくするために、clojure-modeを入れる。 clojure-modeをgitでダウンロード git clone git://github.com/jochu/clojure-mode.git .emacsの編集 ここでは~/opt/直下にgitでclojure-modeをダウンロードした場合を想定。 (nconc lo…

Clojureのインストール

Clojureをインストールする sudo port install clojure プログラミングClojureのサンプルコードをダウンロードする git clone git://github.com/stuarthalloway/programming-clojure.git