2010-06-01から1ヶ月間の記事一覧

対応する括弧で閉じてくれる elisp

3種類の括弧の閉じ分けが面倒なので作ってみた。デバッグ不十分なので不具合あるかも。あと、ナローイングとか考慮されていません。 ;; 開き括弧 { or ( or [ に対応した閉じ括弧 } or ) or ] を挿入する (defun clj-close-sexp () (interactive) (let ((cl…

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について知識不足と言うこともあると思いますが、ググって簡単に解決できる問題ではなさそうです。 透明/半透明フレーム 検索するといくつか解決法がヒッ…