ハバネロブリーダーこの広告は、90日以上更新していないブログに表示しています。JavaやC#のような言語でプログラムを書いていると、処理本体は短いのに、なんでこんなに長くなっちゃうんだろう......ということがよくあります。関数の頭でnullチェックをして、Exceptionをキャッチするためにtry...finallyで囲んで、等とやっていると本体がどこにあるのかわからなくなるということは日常茶飯事です。いったコードはどこが重要な場所なのかがわかりにくく、メンテナンス性が低いものです。現代的なライブラリや言語ではできるだけ本質的なところだけを書けるようにいろいろな仕組みが導入されています。アクティブパターンを紹介します。社内勉強会のプログラミング添削会(?)で書いたじゃんけんプログラムを例にとって説明します。アクティブパターンを使わないで書いた場合のプログラムがこれです。Rock,Paper,Scissorsのうちどれかを二つ選んで引数として渡すと、左か右のどちらがじゃんけんに勝っているかを判定して表示するものです。fsi.CommandLineArgsアクティブパターンを使った版がこれです。いう関数に変わり、main関数の中のパターンマッチがそれに伴って変化しています。関数の中で引数のパースに失敗したとき、例外が飛んでプログラムがスタックトレースを吐いて終了するようになってしました。説の中に使い方の表示をするコードを書かねばならず、すぐ外側に既に存在している使い方表示とコードが重複してしまいます。アクティブパターンをつかって処理する場合、パースが正常に完了したときにのみパターンにマッチするため、それ以上特別な例外処理を追加することなく、通常の条件分岐(match式、function式)の中で自然に例外的状況を取り扱うことができるようになっています。変更後のコードではおかしな入力があった場合にはスタックトレースを吐いて死ぬのではなく、使い方を表示して終了します。このようにアクティブパターンを使って例外処理を書くことは、単に見た目に簡潔になるだけでなく、網羅的でもあります。あらゆるパターンを網羅していない場合にはコンパイルエラーになるため、XXの場合のケアを忘れていたためプログラムが落ちた、ということが起こり得ないのです。パターンマッチとアクティブパターンはかっこいいif文以上の価値があるので積極的に使っていきたいですね。2011の参加記事です(この記事はTokyo.clj#15で紹介した内容と同じです)Clojureは従来の他のLisp系言語よりカッコを減らそうとしていたり、オブジェクト指向ライブラリとの親和性を高めるための工夫が随所に見られます。いうものの中で今回はClojure特有の便利なマクロを4つ紹介します。clojure.core/..System.getProperties().get("os.name")のようなメソッドチェーンを書くときに便利なマクロです。"os.name"))と書く方が良いです。getParent))......この例もあまりイケてないですね。"user.dir")と書く方が良いです。使いどころだけわかっていただければと思います。MyPanel();panel.setFocusable(focusable);panel.setForeground(fgcolor);panel.setBackground(bgcolor);panel.addKeyListener(panel);panel.addConpomentListener(panel);のようなことを書くときに便利なマクロです。副作用のマーカーになるclojure.core/->>関数呼出の入れ子を(処理の積み重ね)を平坦化するマクロです。a)のように書くことができます。このマクロを使えば入れ子の段数が増えませんし、処理が上から順番に読めるようになります。clojure.core/->関数呼出の入れ子を平坦化するマクロです。'd))のように書くことができます。前の処理の結果が次の処理に渡るところが違います。やっていると無名関数をよく作る羽目になります。使うのですが、最初の引数をパラメータ化して関数として使うことが多くなってきます。すると関数を返すバージョンをデフォルトで用意しておいて欲しくなってきました。構文上の変更もすぐ実装できるのがLispのいいところ。ためしに実装して使ってみることにしました。~@body)))作ってみたけど実プログラムではあまり使いどころがありませんでした。こんなゴルフのためだけのマクロなんてデフォルトで入ってなくて良かったです。インストールそのままだと、infoとチュートリアル用のデータがEmacs.appの外に出てしまうので、Emacs.appの中にインストールされるように設定しました。フルスクリーンパッチが含まれるようになったため、この作業は必要なくなりました。インストールするのが一番手っ取り早いです。