ClojureでHello World
前口上
基本的にJava屋で、たまにpythonを使っている。.NET は C#よりVB.NETの方が面白いと感じている。なぜかといえば、 なんとなく文法が似ていてJava -> C#という流れに魅力を感じない。 同じ理由でScalaも辛い。界隈の人が声高にコンパイル遅いと叫んでいる事に、まだ手を出すべき時期じゃないかなあ感を抱いているというのもあるけど。
VisualBasicは.NETの機能を手に入れているというのに熟練者にはあまり好かれない空気があって残念だな。可能性を突き詰めれば今と違う世界か見えそうな気がするんだけど。まああのへんの好きなひとはF#にいってるのかねえ。
というわけで、 Clojureをやってみようと言う気になった。 教科書はコレだ

- 作者: Stuart Halloway and Aaron Bedra,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2013/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (9件) を見る
今回のテーマは Hello World
なぜ Hello World か
ハマったからである
今回の環境
- Mac OS X Mavericks.
- JDK 1.8.0
Closure のインストール
LeiningenというMaven的なことをやってくれるツールが、Clojureのインストールもしてくれるらしい。
https://github.com/technomancy/leiningen
レイニンゲン?人の名前かな。元ネタはこちらのようだ http://en.wikipedia.org/wiki/Leiningen_Versus_the_Ants
REPL の起動(できない)
REPLがあるらしい。Leiningenを使って起動するようだ。
$ lein repl
でREPLが起動してClojureの勉強を開始できる・・・らしいが、以下の例外が出て起動できない。
Exception in thread "Thread-3" java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ...
REPLがいきなり例外はいて死ぬってちょっとハードル高いな。
ググってみるとGithubのIssueが立っている https://github.com/technomancy/leiningen/issues/1321
どうも内部的にはクライアントサーバ型になっていて、サーバだけ起動するとか、サーバを指定してクライアントを指定するとか色々できるようだ。普通に起動すればサーバとクライアントを起動してプロンプトを出すのだろう。 しかしそこで接続に問題が発生している。理由としてはどうもlocalhostが何に解決されるかで違うんじゃないかとかWifi切れば起動できるとかJava8だと発生するけどJava7なら大丈夫とか、色々あるみたい。自分の場合、ホスト名を設定してやる事でクリアできたようだ。
$ sudo scutil --set HostName kitchen-mac.local
しかし今度は違う例外が発生する
$ lein repl nREPL server started on port 56857 on host 127.0.0.1 - nrepl://127.0.0.1:56857 REPL-y 0.3.2, nREPL 0.2.0-beta5NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I clojure.tools.nrepl.middleware.session/session-out/fn--7630 (session.clj:43)NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I clojure.tools.nrepl.middleware.session/session-out/fn--7630 (session.clj:43)Exception in thread "nREPL-worker-0" java.lang.NoSuchMethodError: clojure.tools.nrepl.StdOutBuffer.length()I
REPLでNoSuchMethodってどんだけハードル高いんだよなどと思いつつ再びGoogle先生に聞くとコレもやっぱりIssuesが立っている
https://github.com/technomancy/leiningen/issues/1625
in non-project REPL とあったので、教科書のサンプルコードのプロジェクトをダウンロードしてみた。 そこで実行する分には問題ないようだ。
$ lein repl nREPL server started on port 56906 on host 127.0.0.1 - nrepl://127.0.0.1:56906 REPL-y 0.3.2, nREPL 0.2.3 Clojure 1.3.0 Java HotSpot(TM) 64-Bit Server VM 1.8.0-b132 Docs: (doc function-name-here) (find-doc "part-of-name-here") Source: (source function-name-here) Javadoc: (javadoc java-object-or-class-here) Exit: Control+D or (exit) or (quit) Results: Stored in vars *1, *2, *3, an exception in *e user=> (println "Hello World") Hello World nil