Clojure

seq? sequential? coll?

コレクションっぽいデータ構造にたいして、それぞれどうなるか調べてみた。 結果 seq? sequential? coll? Java配列(int-array 2) false false false 文字列"12" false false false セット#{1 2} false false true マップ{:a 1 :b 2} false false true ベクタ…

非矩形Windowで画像表示

こちらの記事を参考にClojureで書いてみた。 画像はこちらからお借りしました。二重ループでピクセル単位の処理をしている部分がなんとなく嫌だったので全座標を要素とするシーケンスをつくり、それを加工しまくって最終的に不透明領域を表すRectangleオブジ…

bindingとvarについて

bindingってなんだろう? プログラミングClojureを読んでいまいちピンと来なかったので考えてみました。 bindingは新しい変数を作らない ;; program-1 (let [x 10] x) ;=> 10 (binding [x 10] x) ;=> java.lang.Exception: Unable to resolve var: x in this…

-?> と .?.

nilを返す関数 こんな階乗関数を書いたとします。 (defn fact [n] (when (>= n 0) (loop [n n acc 1] (if (< n 2) acc (recur (dec n) (* acc n)))))) 最初に引数チェックを行い、引数が0以上の時のみ処理をおこないます。引数が負数だと何もせず何も返さな…

別解 ClojureでJavaクラスのコンストラクタをapplyする。

以前こんな記事を書きましたが、ライブラリ探索していて new-by-name という関数を見付けました。これを使えば次のように apply + new が実現できます。 (use '[clojure.contrib.core :only (new-by-name)]) (use '[clojure.contrib.str-utils :only (re-spl…

解決 Clojure+Linuxで透明/半透明フレーム

やり方が分かりました。 環境によるかもしれませんが、うちの環境では以下のコードでうまくいきました。 Ubuntu 9.10 + gnome + compiz 環境です。 (import 'javax.swing.JFrame) (import 'com.sun.awt.AWTUtilities) (def frame (doto (JFrame. "半透明フレ…

遅延シーケンスでFizzBuzz

(defn cycle-pattern [n s] (lazy-cat (take (dec n) (repeat "")) [s])) (def fizz-seq (cycle (cycle-pattern 3 "fizz"))) (def buzz-seq (cycle (cycle-pattern 5 "buzz"))) (def fizzbuzz-seq (->> (map str fizz-seq buzz-seq) (map #(if (empty? %2) %…

Clojure+Linuxで実現難しそうなこと。

一週間ほどあれこれ調べて実現が難しそうに思った点。どちらもJavaに起因するものです。単に自分がJavaについて知識不足と言うこともあると思いますが、ググって簡単に解決できる問題ではなさそうです。 透明/半透明フレーム 検索するといくつか解決法がヒッ…

Clojureの正規表現

以下全て、Clojure1.1.0 をベースにしています。 【正規表現オブジェクト】 正規表現(pattern)オブジェクトの作成方法は3通りあります。 ;; どれでも結果は同じ。 ;; javax.util.regex.Patternオブジェクトが生成される。 (def re #"[\da-f]+") (def re (r…

ロケット打ち上げClojure版

Clojureでも書いてみた。(C#版はこちら) この2週間ほどで自分のコーディングスタイルもだいぶ変わったなぁ。今の自分なりの「Clojureらしいプログラム」はこんな感じ。 (use '[clojure.contrib.pprint :only (cl-format)]) (def fmt (partial cl-format f…

ClojureでJavaクラスのコンストラクタをapplyする

複数引数のコンストラクタにシーケンスをわたす。 最初こんなコードを書いてエラーになった。 (apply java.util.GregorianCalendar. [2010 5 20]) ;;=> java.lang.ClassNotFoundException: java.util.GregorianCalendar... 「new class名」の構文糖「class名…

コレクションあれこれ

vector と list は同値判定できる。でも set や hash-map はダメ。 (= [1 2 3] '(1 2 3)) ;=> true (= [1 2 '(3 4)] '(1 2 [3 4])) ;=> true (= [1 2 3] #{1 2 3}) ;=> false (= [:a 1 :b 2] {:a 1 :b 2}) ;=> false コレクションの大小比較(辞書順)は com…

leiningenを使った Clojure 開発

leiningen は clojure版 mavenです。とても便利。 インストールはこのへんを参考にしてください。 現状はlinux版のみ(?)がまともにうごくみたいです。 以降の記事では、clojure 1.1.0 と emacs による開発を想定しています。記事中に間違いなどありましたら…

Clojureいいかもしれない

なんとなくプログラミングClojureを買って一通り読みました。その時は「なるほど結構新しい試みのlispだな〜」くらいの感想でしたが、数日webで調べならがいじったところこれはすごい言語かもしれないと思い始めました。 Javaライブラリが使える Clojure自身…