読者です 読者をやめる 読者になる 読者になる

Code Aquarium

minazoko's blog -*- 水底のブログ -*-

(Clojure) vsClojureを触ってみた

Clojure ClojureCLR

この記事は Clojure Advent Calendar 2014 - Qiita 15日目の記事です。

まえおき

去る2014/11/12、無償オープンソース版VisualStudio である VisualStudio Community 2013 が公開されました。Pro相当で機能的な制限はなし。となれば、Clojureの.Net版である Clojure CLR にも今後何らかの動きがあるかもしれない、という期待を抱きつつ久しぶりに触ってみました。このエントリはそのすったもんだです。

vsClojureの導入

VisualStudio(以下 VSと略)のClojure拡張は「vsClojure」です。ツールメニューの「拡張機能と更新プログラム」からインストールできます。

f:id:minazoko:20141215205625p:plain
今回は触れませんが、Clojurescriptという記述もありますね。
インストール後VSを再起動するとプロジェクトテンプレートにClojure向け4種のテンプレートが選択できるようになります。

  1. ASPNet.MVC
  2. Class Library
  3. Console Application
  4. Windows Forms Application

上二つはライブラリ、下二つは実行形式アセンブリのプロジェクトです。といいつつも、実は3と4のプロジェクト形態は違いが無く、Windows Forms を選んでも実行時にコマンドプロンプトを表示してしまいます。
C#等のプロジェクトのようなプロジェクト設定ペインは見当たらず、プロンプトを表示せずに実行する方法はわかりませんでした。無いのかも。
プロジェクトプロパティを開くとこんなシンプルすぎるダイアログが開くのみです。
f:id:minazoko:20141215211045p:plain
Clojure Version 1.5 です。なんと変更できません!*1...このあたりがテンションを下げるところです。どうなってんの? 責任者はどこだ?
githubですかねやっぱ。

で、github

プロジェクトページを開くと最初に目に飛び込むのはビートルズばりのシャウトで始まるREADME.md

!!!HELP!!! THIS PROJECT NEEDS DEVELOPERS !!!HELP!!!

お察しください。

仕方がないのでプラグイン開発に必要な Visual Studio2013 SDK をインストールし、git clone作ってビルドしようとしましたが、どうもVS2010辺りじゃないとバージョンが合わないらしくあえなく挫折。ああ...。

まーでも、1.5ならギリギリ許容できるラインかなーと納得して次に行きます。納得するしかないし。

vsClojureの開発環境はこんな感じ

書き忘れてますが、vsClojureの開発環境はこんな感じです。
f:id:minazoko:20141215215712p:plain
一見良さそうですが「プログラムのデバッグ出力」「repl」「エラー表示」は連携が取れてなくて行ったり来たりすることになります。ブレークポイントのマークは付きますがブレークしません。インテリセンスは有ります、が、Ctrl+Space を押した後候補が出るまで5秒くらい待たされます。当然その間はフリーズしてます。

ま、でもオブジェクトブラウザでアセンブリの中を眺められるのはいいかもしれませんね。gensymっぽいシンボルでいっぱいですが。
f:id:minazoko:20141215215341p:plain

さて、ノープランですが

グチばかりではアレですので、簡単なプログラムでお茶を濁したいと思います。
手抜きreplでも作りますか。

f:id:minazoko:20141216215739p:plain
ソースコードをutf8で保存しないと、ソース内の日本語が化けますのでご注意を。

おわりに

vsClojureは大いに進展してほしいプロジェクトです。
来年は頑張ってね。

追記 (12/16)

コードを修正しました。

  • システムコントロール系のdynamic Var の binding をすることで、set! による挙動の変更が可能に。
  • 初期 *ns* を user に移動。
  • マクロ等をevalした時に CompilerException で落ちてしまうので、catch を追加 (Exceptionじゃ捕まえられない?)
  • pool-vec と line を連結するとき スペースじゃなく 改行を挟むように変更。read-lineで読んでいるので改行文字が欠落してしまう。それをスペースで連結するとコードが変わってしまう。

プログラム実行例も作り直しました。以前の画像では.Netらしさが無かったので、Formsアセンブリを使ってみました。PowerShellになっているのは特に意味はありません。

*1:nugetではclojure.dllは安定板が1.6, 開発版は1.7α版がダウンロードできるのですが、vsClojureには固定で 1.5しか扱ってくれません。このへんハードコードされているっぽい?