088: Binding Groups について調べる

↑up

概要

Binding Groups について調べる。

現状の toBg 実装は、Thih の仕様をみたしていないように見える。

11.6.3 結合されたバインディング・グループ より:

「es 内の束縛は、グループ内のどの束縛に依存してもよいが、少なくとも isn に含まれるものには依存する はずである。そうでないなら、グループはおそらく最小になっていない。また、es が空なら n=1 になる」

073 の問題は、これにかかわっているようにも思えるが、まだわからない。

以下の記事なども参照すべきか:

2020-05-22 (Fri)

073 の対策のなかで、tcBind の Type-check の結果 subst を 引き継ぐように修正:

         if null qs then ((v, e'), st{tcNum=num, tcSubst=s})
         else ((v, Lam (mkVs n qs) e'), st{tcNum=num, tcSubst=s})

さらに、概要で引用した BindGroup の要件を鑑み、 Expl が null のときには、[[Impl]] のサイズが1になるように、let binding をばらす 仮対処をいれた(Rename):

@@ -703,7 +705,12 @@ renExp (A.LetExp ds e) = do
   e' <- renExp e
   exitLevel
   let bgs = toBg tbs
-  assert (length bgs == 1) $ return (Let (head bgs) e') -- TODO: (head bgs) is temporary
+      (es, iss) = head bgs
+      f []        bdy = bdy
+      f (is:iss') bdy = Let ([],[is]) (f iss' bdy)
+  if null es
+    then return $ f iss e'
+    else return (Let (head bgs) e')

これによって、068 でいれていた仮対処、つまり、AsPat の処理で、 以下のように case の検査項に直接右辺値を書いていた回避策を解除できた。

  x = (1, 2)
  a = case (1, 2) of
   (x, y) -> x