09

ClojureでHello World

前口上

基本的にJava屋で、たまにpythonを使っている。.NET は C#よりVB.NETの方が面白いと感じている。なぜかといえば、 なんとなく文法が似ていてJava -> C#という流れに魅力を感じない。 同じ理由でScalaも辛い。界隈の人が声高にコンパイル遅いと叫んでいる事に、まだ手を出すべき時期じゃないかなあ感を抱いているというのもあるけど。

VisualBasicは.NETの機能を手に入れているというのに熟練者にはあまり好かれない空気があって残念だな。可能性を突き詰めれば今と違う世界か見えそうな気がするんだけど。まああのへんの好きなひとはF#にいってるのかねえ。

というわけで、 Clojureをやってみようと言う気になった。 教科書はコレだ

プログラミングClojure 第2版

プログラミングClojure 第2版

今回のテーマは 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