beanの逆関数unbean

POJO(一般のJavaオブジェクト)をbeanとみなして、プロパティのマップを返してくれる関数 bean がある。http://clojuredocs.org/clojure_core/clojure.core/beanbeanで作ったマップからオブジェクトに戻したい場合もあると思うので、beanの逆関数 unbean を作…

メタデータを含めたPretty Print

ここから抜粋https://groups.google.com/forum/?fromgroups#!topic/clojure/5LRmPXutah8 (use 'clojure.pprint) (defn ppm [obj] (let [orig-dispatch *print-pprint-dispatch*] (with-pprint-dispatch (fn [o] (when (meta o) (print "^") (orig-dispatch (…

Clojureのパーサコンビネータライブラリ fnparse を使う

前記事と似たような話。プログラミングHaskellの第8章で紹介されているパーサコンビネータと同じようなことができるfnparseというライブラリがClojureにも存在する。パーサコンビネータと言えばScalaのライブラリ(コップ本*1 31章)にもあるが、どれも似たよ…

clojure.core.logicでPrologのような論理型プログラミング

clojure.core.logicというClojureをProlog化するライブラリがある。Prologとは、論理型プログラミング言語。 下記のサイトで詳しい説明をしている方がいらっしゃるので、論理型言語についての説明は省略。 http://www.geocities.jp/m_hiroi/prolog/このProlo…

GTK-Serverを使ってシェルからGUI

Ubuntu Linux 11.10 でBashからGTKを叩く方法。 環境設定 gtk-serverはパッケージからインストールできないので、ソースから入れる。 $ sudo apt-get install libffi-dev $ wget http://downloads.sourceforge.net/gtk-server/gtk-server-2.3.1-sr.tar.gz $ …

遅延シーケンスとwith系マクロの相性の悪さ

(defroutes main-routes (GET "/somecsv" [] (sql/with-connection db ;; DBから大量のデータを取って文字列の遅延シーケンスを返す (some-table-to-csv-lines ...) ))) こういうのを書くと、遅延シーケンスが最後まで計算される前にDBのコネクションがクロ…

メッセージ国際化関連のライブラリを作った

Webアプリなどを作るとき、国際化しておくとかっこいい。 java.utilにそういうものをサポートするResourceBundleという仕組みがあり、Clojureから簡単に使えるものを作成。 類似のライブラリは他にもあるが、これはClojure内でResourceBundleの定義が出来る…

ClojureのSOAPライブラリ

Clojure用のSOAPライブラリを公開。 https://bitbucket.org/taka2ru/clj-soap 準備 Leiningenのproject.cljにこう書くだけで利用可。 project.clj (defproject someproj "0.0.1-SNAPSHOT" :depenencies [[org.clojure/clojure "1.2.1"] [org.clojure/clojure…

vimclojureとcakeのインストール

vimclojureとcakeで簡単にslime/swank的なことができる。 Ubuntu 11.04での設定を書いておく。まあ、ここにも載ってるわけですが・・・ http://ubuntuforums.org/showthread.php?t=1746137 初期設定 まずは必要なパッケージをインストール $ sudo apt-get in…

Clozure CL + HunchentootのPOST時の文字化け対策

Clozure CL(Linux amd64)上でHunchentootを使用したときに、少しハマったので、メモしておく。 現象 POSTのパラメータに日本語を含めると、日本語部分だけが丸ごと消えてしまう。 原因 URLデコード処理のせいかもしれないと思って調べたら、やっぱりそうだっ…

Common LispでXMPPサーバコンポーネントを書くライブラリを作ってみた

https://bitbucket.org/taka2ru/cl-xmpp-ext/srcXMPPというのは、インスタントメッセージ(MSNメッセンジャみたいなやつ)のプロトコル。 Google Talkもこのプロトコルで通信をしており、クライアント次第でボイスチャットやビデオチャットも乗せられるスグレ…

Windows上のClozure CLでhunchentoot

http://d.hatena.ne.jp/t2ru/20101205/1291537110 のやり方でasdf-installを使えるようになったのは良いが、hunchentootをインストールしようとしたときにCL+SSLでエラーが出てしまう。O_NONBLOCKというのがないと言われてた。いいのかどうかは不明だが、下…

Windows上のClozure CLでasdf-install

Windows上のClozure CLでasdf-installを使う方法について、先日のエントリのコメ欄で教えてもらった方法を試した。 http://d.hatena.ne.jp/t2ru/20100807/1281151524#c 意外に悶絶してしまったので、やり方を記録しておく。 ~/ccl-init.lisp ;; asdf-install…

チルダクオート

マクロを組むときには変数捕捉に気をつけないといけないが、実は変数捕捉をうまく使う方法もあって、On Lispにそんな例が載っている。 http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/anaphoricMacros.html一番簡単な例としては、アナフォリックIFがあ…

Common LispでGUIの必勝パターン

Windows上で フリーのCommon Lispを使った GUIアプリケーションの 自分的必勝パターン を作っておきたいと思って、ここ2,3日調べている。結論としては、Clozure CLでCL-GTK2を使うのが今のところ一番楽でパフォーマンスも良いと思われる。 スレッドを使えな…

error-kit解説

clojure.contrib.error-kit*1を使うと、Common Lispのconditionに似たエラー処理ができるようになる。 Clojureのエラー処理では、Javaのtry/throw/catchをそのまま使うが、error-kitのwith-handle/raise/handle/bind-continue/continue*2を使う。bind-contin…

error-kitを使ってretry

error-kitとtrampolineを使ったリトライ処理の実装。 (ns jp.t2ru.retry (:use [clojure.contrib.error-kit])) (defn- do-with-retry [f & args] (with-handler {:result (apply f args)} (bind-continue retry [& args] #(apply do-with-retry f args)))) (…

forマクロ

Clojureでプログラムを組んでいるうちに、forマクロが強力だということにやっと気づいたので、リファレンスを書いてみる。 forマクロとは 普通の(というか、CやJava系列の)言語では、forはループ文を表すが、Clojureではforマクロはループではなく、シーケン…

identityの別名定義でmapを便利にする

Clojureのmapでこういう変換をしたくなるときがよくある。(1 "piyo" :foo) -> ({:hoge 1} {:hoge "piyo"} {:hoge :foo})でも、#()で無名関数の定義をしてみると、エラーが出る。 #()の中身は、関数呼び出しorマクロor特殊形式である必要があるため、(#(1))と…

Leiningenで簡単Clojureプロジェクト

Programming Clojureの訳本がもうすぐ出るということで、ここ数日盛り上がり気味のClojure。Amazonに出たので、即注文。Clojureには、Javaで言うMavenに相当するツールで「Leiningen」というのがある。 http://github.com/technomancy/leiningen これを使え…

[Clojure]Programming Clojureの感想

Programming Clojureを読んだのでその感想、の前に、Clojureの特徴など。 Clojureとは 私見ですが、Clojureの特徴を紹介します。 Lispの方言 Common LispやSchemeの仕様とは互換性はない。Common Lispに比べてなじみやすい関数名になっていたり、Lisp-2では…

[Scala]Scalaでeval

Rubyのように文字列をScalaスクリプトとしてプログラム内でevalする方法。scala-compiler.jarの中にscalaインタプリタが使っているクラスInterpreter(そのまんま)があるので、これでevalできる。 package jp.hogehoge import scala.tools.nsc._ import scala…

[Scala][XML]ScalaでXMLストリームパーザを書いてみた

巨大なXMLファイルを処理するとき、プロセスのメモリにDOMを全部置いたりするのは非常に効率が悪い。なので、世の中にはSAXというイベントベースのAPIがあるわけだが、遅延評価を利用してこれをイベントベースの処理をDOMのストリームに変換してみたい。標準…

Javaに対するScalaのメリット

Javaから他の言語に行きたいという悩み Javaのいけてない書き方には正直うんざりしてる。 でもRubyに移行する勇気はない。 静的な型チェックがないのは実行時のバグが怖い。 特にウォーターフォールで開発をやってるところにとっては、バグの刈り取りを後工…

見送られそうなJava 7のクロージャ

クロージャがJava 7に入らないかもしれないと聞いてテンションが下がった。Javaでクロージャを実装する場合、ローカル変数のエクステントが問題になることを、以前のエントリで述べたが、候補となっていた仕様ではどうなっていたのだろう? http://d.hatena.…

スコープとエクステントまとめ

ABCLのソースを読んでるうちにスコープとエクステントについてだんだんわかってきたので、自分なりに少しまとめてみた。合ってるかどうかはわからないので、すべてに?がついていると考えてください。 スコープ アクセス可能な場所的範囲 エクステント アクセ…

[Scala][Java][Lisp][Ruby]プログラミング言語Scala

Scalaというプログラミング言語を調べてみたので、レポート。 どんな言語か? 手続き型オブジェクト指向と関数型のハイブリッド言語。 静的型だが『型推論』をするため、面倒くさい変数の型宣言をある程度省略可能。 LispやRubyのようにifやfor、ブロック等…

[Common Lisp][Java]ABCLで日本語を使う方法

ABCL(Armed Bear Common Lisp)で日本語を使うためのメモ。 (UTF-8限定) ABCLのコンパイル Readerが使っているストリームをUTF-8対応にする。 src/org/armedbear/lisp/Stream.java の文字コード(InputStreamReaderをnewしている部分)をUTF-8に書き換える。(2…

[Common Lisp]JavaやC++、etcな人向けに説明するCommon Lispの利点

個人的なPractical Common Lisp(実践Common Lisp)を読んだ感想のサマリとして、JavaやC++、Ruby、Python等の言語の人などに説明できるように、Common Lispの利点をまとめます。間違いなどがあったら、ご指摘いただければうれしいです。 マクロ Lisp以外の…

[Trac]エンタープライズ向けのチケットワークフロー例

大人数で開発する人向けのTracチケットワークフローの一例 プラグインを入れる必要がある。http://trac-hacks.org/wiki/AdvancedTicketWorkflowPlugin [ticket] workflow = ConfigurableTicketWorkflow,TicketWorkflowOpOwnerReporter,TicketWorkflowOpOwner…