レイアウトの述語(Level 1)
こないだからレイアウトは述語と合成がいいとチラチラ言っているので、今のところ考えている述語を晒す。
type point = int * int type size = int * int type rect = point * size type independent = (* 自らsizeが決まるもの *) [ `Fix of size | `Prefer of size | `Arrange of independent list * arrange (* independentなものを自由に配置する関数 *) ] and arrange = independent list -> rect list * size type t = [ independent | `Pack of dependent ] (* これがLayout.t。最上位 *) and dependent = t list * pack (* 外側からsizeを与えて初めてレイアウトが決まるもの *) and pack = size -> t list -> rect list (* sizeを与えて内部のものを配置する関数 *)
まずこの述語は「含む・含まれる」関係を記述したもの。並列に並べるところは関数に押し込んでまだ詳細を決めていない。でも、そのおかげでかなり抽象的。私の着眼では、「含む・含まれる」の関係を元にレイアウトを決定する上で不可避な分解として、下位構造から大きさが決まるのか(independnt)、上位から大きさを与えるのか(dependent)という二分割がある。こう分解すると、今まで混乱の元になっていた制約条件の矛盾がすっきりと見通しが良くなる(と思う)。まだこれから練っていかなきゃ欠点も分からないけど、とりあえず。