S式から(X|HT)MLに変換する簡易的なコマンドラインツール作った
Lispの仏様と言われた竹内郁雄先生は、XMLを分厚いカッコのあるLispとおっしゃっているそうです。
実際に、S式で(HT|X)MLを書くと、自然でシンプルに書けるので、S式を(HT|X)MLに変換する単純なコンバータを作りました。
作ったもの
Buakko - Simple s−expression to (X|HT)ML converter.
ネーミングのBuakkoは「分厚いカッコ」をもじりました。
シンプルなコンバータです。むしろ、現時点ではいろいろ機能が足りない感じです。
S式といっても、データの表記方法の一つとして採用しているだけで、Lispとの関連性は強くはありません。演算機能もありませんし。
ツールはPerlで書かれています。
使い方
インストールするとbuakkoというコマンドラインツールがインストールされるので、それを使います。
$ buakko sample > sample.html
これで、sampleというS式で記述したHTMLファイルを、sample.htmlというHTMLに変換します。
リダイレクトしなければ、標準出力にプリントされます。
例
以下の様なS式形式のファイルを
(html (@lang "ja") (head # ヘッダ (meta (@charset "utf-8")) (title "EXAMPLE")) (body (@class "example home") # ボディ (h1 "example!") (p (a (@href "http://example.com/" @target "_blank") "example web site."))))
以下のようなHTMLファイルに変換します。
<!doctype html><html lang="ja"><head><!--ヘッダ--><meta charset="utf-8" /><title>EXAMPLE</title></head><body class="example home"><!--ボディ--><h1>example!</h1><p><a href="http://example.com/" target="_blank">example web site.</a></p></body></html>
その他、細かい仕様とかインストール方法は、下記のREADMEをご覧ください。
作った動機
hiccupをとても気に入っていて、Clojureを利用する時には、これを利用すればよいのですが、Clojureを使わなくても気軽にS式をHTMLに変換できるツールがあるといいなぁと思っていました。
何かのモジュールで出来ればよかったんですけど、なかなかズバリなものがなかったので、パーサ部分から書くことにしました。
Perlで作った理由は、Movable Typeで利用したいと思っているからです。これでテンプレートを書けるようにしたい。
このコンバータには、演算機能がありませんが、Movable Typeには、MTVarやら、MTIFやら、MTForやらいろいろあるので、これくらいの機能でも充分かなと思います。
汎用性はすごく低いので、必要に応じてバージョンアップできたらいいですね。
気づいたこと
パーサを書かないといけないというのはわかっていたものの、自分のレベルでは、正規表現でパーサ書くのは厳しいと思ったので、いろいろ調べてみると、Parse::RecDescentという超便利なツールを見つけました。
このツールを作る大半が、Parse::RecDescentの使い方を調べる時間になった気がしますが、これを使えば、Perlで使うちょっとしたミニ言語が作れそうです。
それでも正しく書けているのかどうかよくわからないし、それ以前にコンパイラ周りのこと、全然知らないので、このツールに頼らなくても、ミニ言語が作れるようになりたいですね。
他に、野良モジュールをインストールしてもらう方法とか全然知らなかったので、いろいろ苦戦しました。
まとめ
S式とは言いつつも、ただ、記法を利用しただけなので、別にLispができるできないは関係なく使ってくれる人がいるといいなぁと思います。S式もDOMも、同じく木ですし、S式はそんなに難しいものではないです。
とりあえず、タイプ数は減るし、zen-coding感覚で使ってもらえれば良いかと。
そのままLispに目覚めても良いと思いますよ; )
時間のある時に、Movable Typeのプラグインとして利用できるようと思います。
次の13日の金曜日というサービスをリリースしました
最近、なかなかプログラミングする機会がないので*1、作って放置していたプログラムを編集して、Webサービスにしてみました。
サイト
作ってみて
ClojureでWebサービス作りたいなーとは思ってはいたものの、なかなかそんな時間もモチベーションもなく、今に至ります。
作った背景とかサイトの使い方は、リポジトリのREADME.mdに書いてあります。
Clojureの基本は、4Clojureで概ね学んだので、新たに学んだのは、noirの使い方です。
noirのテンプレートは標準だとviewが別ファイルになっていますが、これくらい小規模であれば1ファイルで書く方が楽でした。
noirは、シンプルで、Mojolicious::Liteみたいに気軽に使えて良いのと、標準のテンプレートエンジンのhiccupがかなり良いです。zen-codingのような感覚で記述できます。zen-codingみたいに、手動でHTMLに展開する手間ないし、プログラムも埋め込めるし、勝手にminifyするし。
noirを使ってて困ったのは、JSONに出力する時に、charsetがISO-8859-1になってしまう点です。ただ、バージョンアップで改善されるっぽいので安心しました。(Google Groups)
Clojureらしく、無限シーケンスで処理したり、小さな関数を組み合わせて処理を組み立てるってところは意識しながら作りましたが、そもそも関数脳になりかかってるので、他の言語使うより、Lisp系統である、Clojure使った方がストレスなく記述できるようになってきました。ただ、Javaの主要のクラスとメソッドはなんとなくでも覚えておいた方がいいなぁとは思います。副作用はdotoの中に押し込んでしまえば、そんなに抵抗なく使えます。
なんというか、関数型言語は、小さな関数作って、拡張してみて、挙動変えてみて、入れ替えてみて、最後に欲しいのはこれ、って感じでルーズにプログラミングできる感じがして、自分の性格的に合ってるような気がするんですよね。
Clojure + noirでモノ作って、herokuに上げる流れは、ひと通り把握したので、また機会を見つけて、Clojureで何か作りたいですね。
たらい回しの塔
たらい回し関数(竹内関数)とProcessing.jsを使って塔を建てる。
たらい回しの塔 - jsdo.it - share JavaScript, HTML5 and CSS
えげつなさが可視化される。
はじめてのはてなブログ
はてなダイアリーからはてなブログへのインポート機能を追加しました - はてなブログ開発ブログという記事が出たので、とうとう重い腰を上げて、はてなブログに移行することにしました。
人柱になっているかもしれませんが、とりあえずはうまく移行できたように見えます。
今後、あと味のURLは、http://taiju.hatenablog.comに変わります。
スタイル(見た目)について
ほとんどテーマのデフォルトそのままですが、コードを貼る機会が増えてきたので、ワンカラムのスタイルにしました。個人的にワンカラムがシンプルで好きってのもあります。
コードの1行も長めになる傾向があるので、広々使えた方がいいですね。
後は、ど近眼にやさしく、文字を大きめにしました。これも自分の好みです。
他は特に弄ることないかなという気がします。
まとめ
今後とも、あと味をよろしくお願いいたします。
CoffeeScriptでチャーチ数(CoffeeScriptとラムダ式)
ラムダ計算では、数値すら関数で表現できるらしいです。
数値を関数で表現する方法のひとつにチャーチ数というものがあるとのこと。
何で書いてみようかなと迷ったのですが、この手の処理をシンプルに書けそうだと思ったので、CoffeeScriptで書いてみることにしました。多分、正解だったと思います。
サンプルコード
church.coffee
church.js
関数適用の数で自然数を表現するってのが面白いし、まず発想できないですね。
ややこしかったので間違ってるかもしれませんが、簡約していくと、こんな感じになるのでしょうか。
最初は関数がメタな表現過ぎて、何をしたいのか頭で整理しきれませんでしたが、参考サイトを見ながら、書いてみて、実行して、理解できました。生JavaScriptで書こうとしていたら、もっと理解に苦しんだでしょう。
なんでも関数で表現できるラムダ計算ってすごいですね。データ構造や条件分岐も関数で表現できるそうです。
まとめ
CoffeeScriptは、以前の記事で、OCamlっぽいっとか言ったことがありましたが、確かにOCaml並にラムダ式が簡潔に書けます。
今回のように、ラムダ式の表現をその言語での書き方に置き換える時、JavaScriptだと苦行で、Schemeでもちょっと面倒です。
生まれた背景からして当然なのですが、OCamlだとラムダ式をほとんどそのままでOCamlのコードとして書けるので、CofeeScriptよりも簡潔です。*1
OCamlの話は置いといて、上杉周平さんの作ったプログラミング学習サイトのchibicodeでも、CoffeeScriptを採用されたそうですが、CoffeeScriptは教育用言語としては、アリだと思います。Rubyみたいに実行可能な擬似コードして使用できる側面を感じます。
とりあえず、ラムダ計算の勉強には使えそうだなと思いました。
参考記事等
Clojureで文字列を整数にする
4Clojureで数値の各桁をゴニョゴニョするという問題に何度か遭遇しました。
各桁に対して何か処理をしようとする時は、文字列が文字のシーケンスで、シーケンス系の関数を適用できるシーケンシャルな型であることを知っていれば、一旦、数値を文字列にしてからシーケンス処理して、数値に戻すという発想が思いつきます。
数値を文字列に変換するのは、str
関数を適用すれば良いだけなので簡単です。
その後、mapなりで処理して、数値に戻す時が問題です。数値を文字列にする関数は、先ほど書いたように、str
関数が用意されているのですが、数値を文字列にする関数は、ClojureDocsを見る限り見当たりません。
ググってみると、JavaのInteger/parseInt
で変換すると書いてあるものがほとんどで、何か負けた気がしました。高階関数にそのまま渡すこともできませんし。
4Clojureの回答で見つけた例
数値の各桁に対してゴニョゴニョする問題の回答例を見てみると、str
関数を使う例が案の定ほとんどだったのですが、文字列を数値のシーケンスする処理で不思議なコードを見かけました。
#(- (int %) (int \0))
何やってんだろ?ということで実際実行してみると、(int \0)
は48という数値を返しました。
実際の数値を当てはめてみて
(- (int \9) (int \0))
と実行してみたら、9を返しました。これでなんとなくやってることの意味がわかったんですが、char
をint
で変換すると、文字コード番号を返すようです。
それを利用して、数値の文字の文字コード番号から、0の文字コード番号を引いて、数値の文字を数値そのものに変換しているということなんですね。
0の文字コード番号が48で、9の文字コード番号が57なので、その差を取れば、9になります。
目からうろこでした。
そもそも
そもそも、自分が知らなかっただけで、文字(数値)を数値に変換する時に、よく使われるテクニックのようです。知らないテクニックを遊びながら学べる4Clojureは本当に素晴らしいですね。
文字列を整数に変換する関数
ということで、上記のテクニックを使って、文字列を整数に変換する関数を実装してみました。
こんな感じになりました。
よりSchemerフレンドリなJavaScriptへ in kyoto.lisp
土曜日にKyoto.lispに行ってきました。
無謀にもスピーカー枠で参加したので、ちょっとドキドキでしたが、話したいことは話せたので良かったです。
スライドは以下に置いておきました。
感想
Lispの勉強会というのは、東京でSICPの読書会みたいなものに参加したことがあるだけで、ほとんど初めてのような感じでした。
なかなか敷居の高い勉強会で話すことにはなったものの、JavaScriptからSchemeに興味を持った者として、こういったテーマで話ができたのは嬉しかったなと思います。
TL見る限り、JavaScriptに多少、興味を持ってくれた人も見受けられたのでよかったです。逆にJavaScriptが好きな人はSchemeにもハマると思います。
割とマジに将来的にはSchemerになりたいと思っているので、もっとSchemeに没頭していきたいですね。(その前にClojurianになることを目標にしますが)
参加者の多くは、懇親会の話など聞いていても、計算機科学勉強してる人がほとんどだったので、逃げちゃダメですね。
参加者、スピーカー、主催者のみなさん、ありがとうございました。