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
楽しいな!