2013-12-14

生まれて約三時間目のHashlog

これはClojure Advent Calendar 14日目のエントリです。


(最近自作したライブラリ、Hashlogについて書きます。)


複雑な難しいプログラムを書くのはつらくとも面白いけど、煩雑なプログラムを書くのはつまらないです。

煩雑
事柄がこみいっていてまとまりがつかず,わずらわしいこと(さま)。

例えばこんなコードを読んだことが有ります(実物じゃないですよ)。

// 擬似コードです
function calc($value1,$value2,$value3,$flag)
{
  if($value1>0) {
    if($value1>=5)
      return  5;
    elseif($flag===true)
      return 4;
  }
  elseif($value2>0)
    return 3;
  elseif($value3>0)
    return 2;
  else
    return 1;
}


ある計算をする関数なんですが、if-ifelse、ifのネストで返り値を決めています。
これコード自体は「まぁしゃーない」で済ませられると思います。
しかしこの関数が30箇所にベタ書きで書いてあって、微妙な違い($value5まである/$value2までしかない、$flag2がある)があったらどうでしょう。
さらに30のなかの5個ぐらいはまったく違う引数を取って、別々の数式で返り値を計算している。

ビルの屋上で「F****CK!」と叫びたくなってきます。



if-elseif、ifのネストの何がダメなのか


2013-12-11

core.unify - 単一化をサポートするClojureライブラリ

(この記事はClojure Contrib Library Advent Calendar 2013の11日目の記事です)


概要

core.unifyは「単一化」をClojureで扱うためのライブラリです。作者は『Joy of Clojure』の著者の一人、Fogusさんです。

単一化はPrologなど論理プログラミングなどで使われる処理で、与えられた条件から未知の値を推論する仕組みです。単一化自体について詳しく説明するのは私には難しいので、詳しくはWikipedia等で調べて下さい;−)

ユニフィケーション - Wikipedia

抽象度が高いライブラリなので利点が分かりにくいですが、同じくFogusさんの作ったcore.constractsで使われているそうです。

fogus: Using unification to write readable Clojure macros?



Clojure Contirib Libraryにはcore.logicという論理プログラミングをするためのライブラリがあり、そちらでも単一化の機能は提供してます。ではなんでcore.unifyがあるんでしょう?
READMEを読むとcore.logicとの違いについて次のように書いてあります。