(ClojurClr) clojure.xml の代替品
clojure clr には何故か未だ clojure.xml が移植されていないようです。JavaのSAX APIと .Net の XML APIがまるっきり異なっているので後回しにされている、といったところでしょうか?
代替品もなさそうなので適当に書いてみました。
https://gist.github.com/mnzk/194e226c262513d9ca1c
出力は clojure.xmlのparseコンパチにしているので clojure.zip や clojure.data.zip.xml と連携もできるのではないかと思います。*1
clojure.data.zip.xml は clojure.xml を require しているので、linq.xmlに書き換える作業は必要です。
*1:テストしていませんが
(Clojure) vsClojureを触ってみた
この記事は Clojure Advent Calendar 2014 - Qiita 15日目の記事です。
まえおき
去る2014/11/12、無償オープンソース版VisualStudio である VisualStudio Community 2013 が公開されました。Pro相当で機能的な制限はなし。となれば、Clojureの.Net版である Clojure CLR にも今後何らかの動きがあるかもしれない、という期待を抱きつつ久しぶりに触ってみました。このエントリはそのすったもんだです。
vsClojureの導入
VisualStudio(以下 VSと略)のClojure拡張は「vsClojure」です。ツールメニューの「拡張機能と更新プログラム」からインストールできます。
今回は触れませんが、Clojurescriptという記述もありますね。
インストール後VSを再起動するとプロジェクトテンプレートにClojure向け4種のテンプレートが選択できるようになります。
上二つはライブラリ、下二つは実行形式アセンブリのプロジェクトです。といいつつも、実は3と4のプロジェクト形態は違いが無く、Windows Forms を選んでも実行時にコマンドプロンプトを表示してしまいます。
C#等のプロジェクトのようなプロジェクト設定ペインは見当たらず、プロンプトを表示せずに実行する方法はわかりませんでした。無いのかも。
プロジェクトプロパティを開くとこんなシンプルすぎるダイアログが開くのみです。
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の開発環境はこんな感じです。
一見良さそうですが「プログラムのデバッグ出力」「repl」「エラー表示」は連携が取れてなくて行ったり来たりすることになります。ブレークポイントのマークは付きますがブレークしません。インテリセンスは有ります、が、Ctrl+Space を押した後候補が出るまで5秒くらい待たされます。当然その間はフリーズしてます。
ま、でもオブジェクトブラウザでアセンブリの中を眺められるのはいいかもしれませんね。gensymっぽいシンボルでいっぱいですが。
さて、ノープランですが
グチばかりではアレですので、簡単なプログラムでお茶を濁したいと思います。
手抜きreplでも作りますか。
ソースコードをutf8で保存しないと、ソース内の日本語が化けますのでご注意を。
おわりに
vsClojureは大いに進展してほしいプロジェクトです。
来年は頑張ってね。
追記 (12/16)
コードを修正しました。
- システムコントロール系のdynamic Var の binding をすることで、set! による挙動の変更が可能に。
- 初期 *ns* を user に移動。
- マクロ等をevalした時に CompilerException で落ちてしまうので、catch を追加 (Exceptionじゃ捕まえられない?)
- pool-vec と line を連結するとき スペースじゃなく 改行を挟むように変更。read-lineで読んでいるので改行文字が欠落してしまう。それをスペースで連結するとコードが変わってしまう。
プログラム実行例も作り直しました。以前の画像では.Netらしさが無かったので、Formsアセンブリを使ってみました。PowerShellになっているのは特に意味はありません。
(Racket) draw-text における文字回転
draw-textによる縦書きは、文字列を分割して一文字ずつ置いていくのが簡単です。ただしカタカナの長音記号は横棒のままになっていますので、文字を回転して描画します。
- 回転したい文字の中心に座標原点を移動 (set-origin)
- さらに座標系の回転(rotate)
- そして文字を描画(draw-text)
- その後座標系を元に戻す
予め get-transformation で座標系の状態を取得しておき、回転描画が終わった後に元の状態に戻します (set-transformation)。
そうすることで以降の処理は通常通りの座標系で描画を再開することが可能となります。
なお、割と綺麗に見えるフォントを使っていますが、フォントによっては縦棒の位置がぴったり収まらないこともあるようです。