FreeBSDでもclojure(2)


Sun が Oracleに買収された。IBMが買収交渉をしてたそうだけど、金額の面で
折り合いがつかず、暗礁に乗り上げていた時に、さっと、Oracleが出てきて
話をまとめてしまったようだ。
さすがプレーボーイのOracle会長、ラリーエリクソンだけあるわい、手が早いと
言うか、話が旨いと言うか、私も見習いたいものである。

SunがOracleの軍門に下ると、Sparcはどうなる? Solarisはどうなる? Javaは
どうだ? MySQLとかStartOfficeはどうなるとか、いろいろ心配はあるようで
あるが、OracleがOSSに対してどういう態度を取るかが、私の興味の的ですね。
JavaやOpenSolaris等が、今まで通りに自由にDL出来る事を望みますだ。

この際だから、FreeBSDでもJavaがコンパイル出来るようにしておこう。
そう思って、sun-jdk6のインストールを始めたのはいいのですが、最初から
ゲンナリ。だって、jdkをコンパイルするには、2.5GのHDDと大量のメモリーが
必要でっせと、インストールを拒むような殺し文句を言われたんですもの。

しゃーない、この際だからdiablo-jdk16を試してみよう。こちらは、FreeBSD用に
バイナリーが用意されてて、それを取ってきて入れるだけのようです。
早速取り掛かったのですが、tzupdater-1_3_12-2009a.zipだけは、Sunのサイトか
ら貰ってきてね、ですって。Sunに行ってみたけど、アカウントが必要みたい、
昔アカウントを取っていたけど、もう忘れてるわな。
tzupdaterなんてこの際無視無視作戦を決行。
例によって、Makefileをちょいと書き換えてあげたら、無事に入りました。

そうなると、試運転をしたくなる。portsにclojureが有ったので、正式に
インストールしましたよ。ちゃんとclojureが起動したけど、clojure-contribが
惜しいかな入っていない。
Debianから持ってきてもいいんだけど、それじゃ折角jdkを入れた意味が無くなって
しまう。
FreeBSDだけで何とかしたいよね。という事で、svnを使ってcontribを取り寄せ。
コンパイルしましたよ。

後は、.bashrcに
export CLASSPATH=/usr/local/share/java/classes/jline.jar
export CLASSPATH=/usr/local/share/java/classes/clojure-contrib-slim.jar:$CLASSPATH
を追加したら、動くようになりました。

でも、lispの方言であるclojureをやるなら、やっぱり、emacsの上でslimeだよね。
どうやるん?
ネットを探してみたら、ぴったりの Clojure Japan様に行き着いた。
インストールLinux編はちょっと目的にそぐわないので、リンクされてた Clojure Boxを先に
試してみる事にした。(Windows用だけど、emacsの設定事など、参考になろうと言う
目論見です。)

Clojure Box

早速動かしてみたら、早速エラーが出ましたよ。先客で clisp/slime/emacs を 動かす環境を作っていたので、それと喧嘩したみたい。.emacsを見えないように してあげたら、動きました。 はて、この仕組みどうなってるん? 私は、emacsのアイコンをクリックしただけ なのに、ちゃんとslime/clojureが立ち上がってくるんです。 説明書をちらちらと眺めていたら、site-lisp内のdefault.elから実行するようです。 そっか、そういう事なら、それを翻訳すればいいんだ。 早速、.emacsに移植しましたよ。そして、Clojure Boxは没にしたのでした。 (すいません、作者様、アイデアだけ頂いちゃいました。)

FreeBSDでも Clojure Box

BSDでも、clispを動かしているので、それもまとめて、.lisps.el なんていう ファイルに押し込んだ。 ;;;;; clojure ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun clj () (interactive) (progn (add-to-list 'load-path "/usr/local/share/emacs/site-lisp/swank-clojure/") (add-to-list 'load-path "/usr/local/share/emacs/site-lisp/clojure-mode/") (require 'clojure-mode) (setq swank-clojure-jar-path "/usr/local/share/java/classes/clojure.jar") (setq swank-clojure-extra-classpaths (list "/usr/local/share/java/classes/clojure-contrib-slim.jar")) (require 'swank-clojure-autoload) (require 'slime) (slime) (slime-setup '(slime-repl)) )) ;;;; clisp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq inferior-lisp-program "/usr/local/bin/clisp") (require 'slime) (slime-setup '(slime-repl)) ;;;;;;;; Common lisp hyper-spec --> C-c C-d h (require 'hyperspec) (setq common-lisp-hyperspec-root (concat "file://" (expand-file-name "~/.HyperSpec/")) common-lisp-hyperspec-symbol-table (expand-file-name "~/.HyperSpec/Data/Map_Sym.txt")) (require 'w3m) (setq browse-url-browser-function 'w3m-browse-url) こやつを、.emacs内でロードしてあげるようにしました。 ちょっと怪しい所がありますが、まっいいか。

ちょっと動かす

emacsを起動したら、M-x clj すれば、replが動き出します。 後は、こういう参考書と首っぴきになりながら、実験実験 ; SLIME 2009-04-03 user> (use 'clojure.contrib.repl-utils) nil user> (source cons) (def #^{:arglists '([x seq]) :doc "Returns a new seq where x is the first element and seq is the rest."} cons (fn* cons [x seq] (. clojure.lang.RT (cons x seq)))) nil user> (source reverse) (defn reverse "Returns a seq of the items in coll in reverse order. Not lazy." [coll] (reduce conj () coll)) user> (source source) (defmacro source "Prints the source code for the given symbol, if it can find it. This requires that the symbol resolve to a Var defined in a namespace for which the .clj is in the classpath. Example: (source filter)" [n] `(println (or (get-source '~n) (str "Source not found")))) nil user> (source get-source) (defn get-source "Returns a string of the source code for the given symbol, if it can find it. This requires that the symbol resolve to a Var defined in a namespace for which the .clj is in the classpath. Returns nil if it can't find the source. For most REPL usage, 'source' is more convenient. Example: (get-source 'filter)" [x] (when-let [v (resolve x)] (when-let [strm (.getResourceAsStream (RT/baseLoader) (:file ^v))] (with-open [rdr (LineNumberReader. (InputStreamReader. strm))] (dotimes [_ (dec (:line ^v))] (.readLine rdr)) (let [text (StringBuilder.) pbr (proxy [PushbackReader] [rdr] (read [] (let [i (proxy-super read)] (.append text (char i)) i)))] (read (PushbackReader. pbr)) (str text)))))) nil 楽しいな!