2011-01-01から1年間の記事一覧

続・Javaで複合モナド

前回の自分用宿題 ・ 拡張スタイルの関数(というかbind)の導出 これをやってみる。あと逆に拡張スタイルから代数スタイルの導出もやる。 unit, flatten, mapからのbindの導出 unit, bindからのflatten, mapの導出 e_unit, e_bind, l_unit, l_bind, combinati…

Javaで複合モナド

実験的にテンプレートエンジンを書き始めたのはいいけど、早くもかなりpurityが失われている感じなので整理したい。実装をざっと見て、 テンプレートのモナド コンテキスト(ステートモナド) (あと多分リストも) が混ざった感じの実装になっているので綺麗に…

単純なXMLをhashrefに変換する。

急にPerlの仕事が来たので。 属性は使用しない 同一階層で要素名が重複しない 要素の中身は要素のリストかテキストデータ というとても単純なXML(というよりSML?)を返す会員情報取得APIがあったのでhashrefで受け取れるようにしたよ。XML::Parser::Liteを使…

続・比較モナド

モナドのこと検索してたら次のようなtweet見かけた。 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "h…

比較モナド

前回は「ソート順(order by句)の情報から、特定レコードの上界/下界を求めるクエリ(where句)を自動生成する」というのをやった。 その時のwhere句の形 ... AND ((t0.pub_date < t2.pub_date) OR ((t0.pub_date = t2.pub_date) AND (t0.id > t2.id))))を見て…

一覧用の検索条件からいろいろ自動で取得する

一覧で要素を一つ選択して詳細ページでその内容を表示するようなサイトを作ることは良くあると思うけど、その為のDBアクセス処理を毎回一機能ずつ書くのは面倒なのでどうにかする方法を考える。 今回はフレームワークとしてはCayenneを使うけど、実例を挙げ…

関数型のテンプレートエンジンで何が出来るか

まず関数型のテンプレートエンジンの定義なんだけど、とりあえず以下を満たすもので考える。 各テンプレートが独立した静的スコープを持つ テンプレート(の一部)がファーストクラスのオブジェクトとして扱える。 変数に代入したり、引数で渡せる。 折角なん…

関数型のテンプレートエンジンを作ってみる(0.3) - 条件分岐・繰り返しの導入

前回追加したdefineタグ、insertタグに加えて、今回は条件分岐タグ(ifタグ)と繰り返しタグ(foreachタグ)を導入する。 ifタグは以下のように、条件が満たされた時にその内部がレンダリングされる。 // 会員のみメッセージを表示 {if condition="customer.isMe…

関数型のテンプレートエンジンを作ってみる(0.2.3) - 実行系を書く

前回の続きで、テンプレートエンジンのエンジン部分を書く。 今回実装したところまでをVers_0.2というブランチにしてみた。 方針 0.1の時点ではモナド則とか考えたけど、あんまり純粋さには拘らない。 パース結果をASTとして実行部分は別個に評価器として実…

関数型のテンプレートエンジンを作ってみる(0.2.2) - パーサを書く

前回の続きで、前回作ったトークナイザからパーサを書く。パーサの作成には引き続きJParsecのライブラリを使用する。 おさらい&今日のミッション 前回作ったnewTokenizer(Terminals)で生成するトークナイザ(字句解析部)は、Stringを受け取りListを生成するP…

関数型のテンプレートエンジンを作ってみる(0.2.1) - パース用のトークナイザを書く。

関数型のテンプレートエンジンを作ってみる(0.2) - スコープ・変数定義の導入 - terazzoの日記で定義したタグのパーサを書く。 パーサの実装にはJparsec*1を使用する。シンボルと属性名はJparsecに用意されているTerminals.Identifierを、属性値のExpression…

関数型のテンプレートエンジンを作ってみる(0.2) - スコープ・変数定義の導入

前回は、テンプレート中のプレースホルダ(変数)を置き換える部分を作ったので、次はテンプレート中で変数を定義できるようにする。また、変数の有効な範囲(スコープ)を明確にする。スコープは静的スコープにしたい。 要素がプレースホルダだけなら単純に「{…

関数型のテンプレートエンジンを作ってみる(0.1) - 変数の置き換え

最もシンプルなテンプレートエンジンは、あらかじめテキストを用意しておき、テキスト内の特定の箇所(プレースホルダ)を随時好きな値で置き換えて使用するようなものだと思う。とりあえずそれから実装する。 「圏論やモナドが、どうして文書処理やXMLと関係…

関数型のテンプレートエンジンを作ってみる

以下のあたりで言及していた、「関数型言語としてのテンプレートエンジン」というのがどういうものなのか、とりあえず作ってみる事にする。 HTMLテンプレートと関数型言語について - terazzoの日記 テンプレートエンジンと関数型言語(思案中) - terazzoの日…

HotSpot JVMの最適化オプションについて調べる

Javaの最適化の議論で「インライン展開」「エスケープアナリシス」などの用語が出てきていて、気になって調べたところ、java実行時のオプションで最適化の方法を指定したり実行過程を表示したり出来るらしい。 主なオプションについて Java HotSpot VM Optio…

数値のFizz、Buzz等への変換を、Javaで通常より直感的に表現したい

お題: 数値のFizz、Buzz等への変換を、Smalltalk(とRuby)で通常より直感的に表現したい - Smalltalkのtは小文字です ここで #fizz には n (#fizz の文脈ではレシーバーである self)が 3 で割り切れるときに、'Fizz' を返す代わりに「キー -> 値」で生成…

これはモナドですか?

はい、只のメソッドチェーンです。 前回のはあんまりに簡単に済ませすぎたので、もう少し掘り下げてみる。 前回のコードの振り返り モナドっぽいところがないかといえば、この辺がそうかも。 unit(or return)っぽい部分: final Option<T> option = target == nu</t>…

Option型をmaybe風に使ってみたかった

例によって実用性皆無の実験的なコードですが…… id:j5ik2oさんの作られたOption型 Javaでも、ScalaのOption型と似て非なるOption型を作れないかなーと思い、思いつきと勢いでコード書いてみました。 は良いアイデアだと思うのだけど、メソッドチェーンのよう…

[Java]Java 59 bytes FizzBuzz

お題: Java 30byte FizzBuzz - プログラマーの脳みそ ぎ「FizzBuzzが110文字で書けるなら、1文字2bitの文字コードで記述すれば220bitで記述できる。byteに直すと28byteになる」 な「無茶言うなあ」 せ「だいたい、1文字2bitじゃ文字が4種類しか扱えないじゃ…

Javaで末尾再帰最適化をする。(?)

お題: http://d.hatena.ne.jp/wasabiz/20110118/1295335821 Rubyで末尾再帰最適化をする。 - Homoiconic Days Javaなどの言語では、通常、再帰を使ったプログラムは、呼び出しが深くなるといつかはStack Overflowで実行時エラーになってしまう。それに対して…

[Java]IVSの異体字を元の字と同一視して比較する

IVSと正規化について - Togetter正直あまりちゃんと付いていけてないんだけど、結局のIVS入りの文字列をVS抜きのものとを同一と看做してワンメソッドで比較するような仕組みはJava 6でも入ってないらしい。リンク先より引用: @ogwata @moji_memo IVSがそもそ…