Commits

camlspotter committed 06f290c

updated documents

Comments (0)

Files changed (1)

         (* t -> t。 [is_optional label] の際には引数の型は
            必ず option 型になっている。 
            
-           commutable 
+           commutable について
 
-               and commutable =
-                   Cok
-                 | Cunknown
-                 | Clink of commutable ref
+                   and commutable =
+                       Cok
+                     | Cunknown
+                     | Clink of commutable ref
+    
+               let f g = g ~x:1 ~y:true in   f (fun ~y:_ ~x:_ -> ());;
+    
+               は型エラーになるのだが、これは g の Tarrow が Cunknown だから。
+               現在の OCaml では外からくる型不明の関数にかんして引数順入れ替えのコンパイルを
+               おこなわない、つまり
+    
+                  let f g = g ~x:1 ~y:true in f (fun ~x ~y -> (fun ~y:_ ~x:_ -> ()) ~y ~x);;
+    
+               というコードに変換しない。 多分これをやると abstraction が入るので
+               一般的には副作用のタイミングがおかしくなってしまう
+                
+                  let g = fun ~y:_ ~x:_ -> () in
+                  let f = g ~x:1 ~y:true in f 
+    
+               これは前もって順序がわかっており、 Cok なので型エラーにならない。
+               順序の入れ替えは g の定義ではなく g の呼び出し側で行われる:
 
-           let f g = g ~x:1 ~y:true in   f (fun ~y:_ ~x:_ -> ());;
+                  let g = fun ~y:_ ~x:_ -> () in
+                  let f = g ~y:true ~x:1 in f
 
-           は型エラーになるのだが、これは g の Tarrow が Cunknown だから。
-           現在の OCaml では外からくる型不明の関数にかんして引数順入れ替えのコンパイルを
-           おこなわない、つまり
-
-              let f g = g ~x:1 ~y:true in f (exchange (fun ~y:_ ~x:_ -> ()));;
-
-           というコードに変換しない。 exchange はもちろん y:bool -> x:int -> unit
-           を受け取り x:int -> y:bool -> unit に変換するためのコード。
-           多分これをやると abstraction が入るので副作用のタイミングがおかしくなってしまう
-            
-              let g = fun ~y:_ ~x:_ -> () in
-              let f = g ~x:1 ~y:true in f 
-
-           これは前もって順序がわかっており、 Cok なので型エラーにならない。
+               こんな感じだと思われる(仔細未確認)。OCaml は引数の評価順は未定義なので
+               問題ないはず 
         *)
   | Ttuple of type_expr list
         (* タプル *)
            新しい空のキャッシュを使わなければならない。
 
            Head alias の expansion は、
-           try_expand_once
+           try_expand_once             <--- なんだろう書きかけだが、覚えていない
 
         *)
   | Tobject of type_expr * (Path.t * type_expr list) option ref
            [!nm] が [Some ..] の場合はクラス名付きのオブジェクトの型。
                [Some (p, ty :: tyl)] の場合、
                [(tyl) p] という型である
-               CR jfuruse: [ty] は何か?
 
-               [Some (p, [])] というのはありえない状態 :-(
+               [ty] は何か?
+                   Printer では [ty] は generalize されているかどうかの判定に使われている
+                   See [Printtyp.tree_of_typobject]
+
+                   [nm] が新たに [Some] を introduce するケースは、とても見つけにくいが、
+                   [Btype.set_name] そしてそれを呼ぶ [Ctype.set_object_name] である。
+                   [set_object_name] の [rv] がこの [ty] になる。
+
+                        let set_object_name id rv params ty =
+
+                   この [rv] は常に [Ctype.row_variable ty] であるので、row variable
+                   であるらしい。これは OCaml の型にはプリントされないのと合致する。
+
+               [Some (p, [])] というのはありえない状態 :-( だと思われる
 
            [!nm] が [None] の場合は無名オブジェクト型。 [field_type]
            には [Tfield] や [Tnil] (おそらく [Tlink]も?) 入っている。
            最後の [type_expr] はリストの cons の様な働きをする。
            Ctype.flatten_fields で普通のリストに展開してくれる。
            最後は Tvar や Tunivar だと open なオブジェクト型、
-           Tnil だと closed。なんと Tconstr が来ることがあるようだが
-           これはよく判らない。 (Printtyp.tree_of_typfields)
+           Tnil だと closed。これは Tobject での [!nm = Some (p, ty :: tyl)]
+           の [ty] と row variable であるようである。
 
+           が、なんと Tconstr が来ることがあるようだが
+           これは… (Printtyp.tree_of_typfields)
+           Tconstr が来ると、プリンタでは Otyp_object の最後が Some false になる。
+           そしてこれは < _..> とプリントされるようなので、 non generalized raw var を指すようだ:
+
+             let f x o = o#m + x
+             let g = f 1
+           
+           とすると val g : < x : int; _..> -> int
+
+           と表示されるので、これ以上知りたい場合はこの場合の最後の型を調べるべきである。 
         *)
 
   | Tnil