2009年12月6日日曜日
slime + swank-clojureの続き
どうもClojure1.1との組み合わせの問題のようなので
http://github.com/stuarthalloway/swank-clojure/tree/clojure-1.1
のswank-clojureを使ったらうまく動いた。
(追記)
結局
http://github.com/technomancy/swank-clojure/tree/clojure-1.1
の方に変更した。
2009年12月5日土曜日
slime + swank-clojureが動かない
最近のslimeとswank-clojureの組み合わせがこける。
SLIME REPL broken
を参考に、
"/home/hokari/opt/swank-clojure/src/main/clojure/swank/core/protocol.clj"
を
@@ -4,6 +4,20 @@
;; Read forms
+ (def #^{:private true}
+ *percent-re* #"%")
+
+(defn- fix-percent
+ "Replace double colons with a /."
+ ([text] (.replaceAll (re-matcher *percent-re* text) "?")))
+
+(def #^{:private true}
+ *double-colon-re* #"::")
+
+(defn- fix-double-colon
+ "Replace double colons with a /."
+ ([text] (.replaceAll (re-matcher *double-colon-re* text) "/")))
+
(def #^{:private true}
*namespace-re* #"(^\(:emacs-rex \([a-zA-Z][a-zA-Z0-9]+):")
(defn- fix-namespace
@@ -50,7 +64,7 @@
([#^java.io.Reader reader]
(let [len (Integer/parseInt (read-chars reader 6 read-fail-exception) 16)
msg (read-chars reader len read-fail-exception)
- form (read-string (fix-namespace msg))]
+ form (read-string (fix-namespace (fix-double-colon (fix-percent msg))))]
(if (seq? form)
(deep-replace {'t true} form)
form))))
のようなかんじにしたら動いた。
Common LispとClojureで"%"や"::"の意味とか許可/不許可が違うせい、
ということみたい。
2009年11月16日月曜日
ClojureのvectorやlistをJavaの配列にキャストする方法
ClojureのvectorからString[]やint[]などにキャストする必要がある場合、
to-arrayやinto-arrayを使うとキャストできる。
user> (to-array ["a" "hello"])
#
2009年6月5日金曜日
UsedのThinkpad X60s購入
Ubuntuを入れて快調です。メモリは2G追加。
インストールはUSBメモリからで、ひっかかることもなく
とても簡単にできました。無線LANもデフォルトで使用できました。
右パームレスト部分が無線LANカードの発熱のために熱くなりますが、
これは仕様なようです。無線OFFにしておくと熱くならなかったし、
無線もともと使わない予定なので問題なし。
久方ぶりにマイノートPCを手に入れ感無量。
半年くらいしたらSSDにしたいなぁと妄想は膨らむ。
2009年5月31日日曜日
JavaOne 2009 Script Bowl
Script Bowlでは、JavaVM上のスクリプト言語同士でプログラミング対決をしたり、
言語の特長を紹介したりするようです。
去年は、Scala,Groovy,JRuby, Jythonだったのですが、
今年はこれにClojureが加わって5つの言語で対決するようです。
JavaVM上のスクリプト言語は、他にも山ほどあるわけで、
JavaOneで5つめに選ばれたってことは、けっこう注目度がたかいということでしょうか。
これをきっかけにさらに盛り上がるといいなぁ。
2009年5月19日火曜日
Clojure勉強の進捗
マクロの練習に、パターンマッチングのマクロを書いた。
マクロの基本的な書き方や、mapやvector、sequenceの基本もわかってきた。
gitの使い方を覚えて、antの使い方の基礎を覚えたら、
githubにのせてみたい。
2.Clojureでモナド
Clojure.contrib.monadsの使い方を下記の解説をみて覚える。
Monads in Clojure
A monad tutorial for Clojure programmers (part 1)
part 2
part 3
part 4
http://stefan-klinger.de/
のところにある
The Haskell Programmer's Guide to the IO Monad — Don't Panic.
をもう一度読む。
Arrow syntax
8.10. アロー記法
も読んでArrowも理解したい。
3.その他
軽くJavaの復習。antやJDEEなども。
あとConcurrent-Programming-Java-TM-Principles
を注文したのできたら読む。
LWGL - Lightweight Java Game Library
というのを見つけた。よさそう。
2009年5月10日日曜日
Tokyo CabinetをUbuntuにインストール
Tokyo CabinetはHirabayashi Mikio 氏により新しく実装された高速なDBMです。
DBMというのは、Database Managerの略で、非常にシンプルなキー:バリュー型の
データベースです。プログラミングでいうところのハッシュマップや連想配列、辞書と同じような機能を、ファイル上に永続化して使用できるというようなものです。
Berkeley DBなどが有名です。
Tokyo Cabinetは、とても新しく実装されたDBMで、
高速な処理や非常に大きいデータベースファイルを扱えるなどのすぐれた
特徴を持ち、Java,Perl,Ruby,Lua用のAPIが公式に用意されています。
ClojureでオレオレDBMSを実装するためのバックエンドとして使いたいと思っているので、
今回はまず、UbuntuにTokyo CabinetとJava APIをインストールします。
sudo apt-get update
wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.20.tar.gz
sudo apt-get install build-essential
sudo apt-get install zlib1g-dev
sudo apt-get install libbz2-dev
wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.20.tar.gz
tar xzvf tokyocabinet-1.4.20.tar.gz
cd tokyocabinet-1.4.20
export CPPFLAGS="-I/usr/lib/jvm/java-6-openjdk/include/"
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export PATH=$JAVA_HOME/bin:$PATH
./configure
make
ここで前回インストールしたPacoを使用して
sudo make install
のかわりに、
sudo paco -D make install
としてインストールしてみた。
つぎにJava用APIをインストール。
wget http://tokyocabinet.sourceforge.net/javapkg/tokyocabinet-java-1.18.tar.gz
tar xzvf tokyocabinet-java-1.18.tar.gz
cd tokyocabinet-java-1.18
./configure
make
make check
sudo paco -D make install
http://tokyocabinet.sourceforge.net/javadoc/
にあるサンプルを実行。
import tokyocabinet.*;
% cat TCHDBEX.java
import tokyocabinet.*;
public class TCHDBEX {
public static void main(String[] args){
HDB hdb = new HDB();
if(!hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT)){
int ecode = hdb.ecode();
System.err.println("open error: " + hdb.errmsg(ecode));
}
if(!hdb.put("foo", "hop") ||
!hdb.put("bar", "step") ||
!hdb.put("baz", "jump")){
int ecode = hdb.ecode();
System.err.println("put error: " + hdb.errmsg(ecode));
}
String value = hdb.get("foo");
if(value != null){
System.out.println(value);
} else {
int ecode = hdb.ecode();
System.err.println("get error: " + hdb.errmsg(ecode));
}
hdb.iterinit();
String key;
while((key = hdb.iternext2()) != null){
value = hdb.get(key);
if(value != null){
System.out.println(key + ":" + value);
}
}
if(!hdb.close()){
int ecode = hdb.ecode();
System.err.println("close error: " + hdb.errmsg(ecode));
}
}
}
% javac TCHDBEX.java
% ls
TCHDBEX.class TCHDBEX.java% java TCHDBEX
hop
foo:hop
bar:step
baz:jump
% ls
TCHDBEX.class TCHDBEX.java casket.tch
インストールは成功した模様。