module Pair :
sig
type t
val ( = ) : t
-> t
-> bool end
=
struct
type t
= { x
: int ; y
: int }
let of_int i = { x = i ; y = i }
let ( = ) a b =
a.x = b.x && a.y = b.y
end
module Ext = struct
module Pair =
struct
include Pair
let ( <> ) a b =
not (a = b)
end
end
let main_std () =
let a = Pair.of_int 1
and b = Pair.of_int 1
and c = Pair.of_int 2 in
Printf.printf
"%B %B\n" (a
= b
) (a
= c
)
let main_ext () =
let open Ext in
(* same part *)
let a = Pair.of_int 1
and b = Pair.of_int 1
and c = Pair.of_int 2 in
Printf.printf
"%B %B\n" (a
= b
) (a
= c
) (* same part end *)
; Printf.printf
"%B %B\n" (a
<> b
) (a
<> c
)
let _ =
main_std () ;
main_ext ()
(* type compatibility *)
let std_pair x =
Pair.of_int x
let ext_pair x =
let open Ext in
Pair.of_int x
let _ =
let a = std_pair 1
and b = ext_pair 1 in
Printf.printf
"%B\n" (a
= b
) (* compiled *)
IAptb2R1bGUgUGFpciA6CiAgc2lnCiAgICB0eXBlIHQKICAgIHZhbCBvZl9pbnQgOiBpbnQgLT4gdAogICAgdmFsICggPSApIDogdCAtPiB0IC0+IGJvb2wKICBlbmQKICA9CiAgc3RydWN0CgogICAgdHlwZSB0ID0geyB4IDogaW50IDsgeSA6IGludCB9CgogICAgbGV0IG9mX2ludCBpID0geyB4ID0gaSA7IHkgPSBpIH0KCiAgICBsZXQgKCA9ICkgYSBiID0KICAgICAgYS54ID0gYi54ICYmIGEueSA9IGIueQoKICBlbmQKCm1vZHVsZSBFeHQgPSBzdHJ1Y3QKCiAgbW9kdWxlIFBhaXIgPQogICAgc3RydWN0CiAgICAgIGluY2x1ZGUgUGFpcgoKICAgICAgbGV0ICggPD4gKSBhIGIgPQogICAgICAgIG5vdCAoYSA9IGIpCgogICAgZW5kCgplbmQKCgoKbGV0IG1haW5fc3RkICgpID0KICBsZXQgYSA9IFBhaXIub2ZfaW50IDEKICBhbmQgYiA9IFBhaXIub2ZfaW50IDEKICBhbmQgYyA9IFBhaXIub2ZfaW50IDIgaW4KICBQcmludGYucHJpbnRmICIlQiAlQlxuIiAoYSA9IGIpIChhID0gYykKCmxldCBtYWluX2V4dCAoKSA9CiAgbGV0IG9wZW4gRXh0IGluCgogICgqIHNhbWUgcGFydCAqKQogIGxldCBhID0gUGFpci5vZl9pbnQgMQogIGFuZCBiID0gUGFpci5vZl9pbnQgMQogIGFuZCBjID0gUGFpci5vZl9pbnQgMiBpbgogIFByaW50Zi5wcmludGYgIiVCICVCXG4iIChhID0gYikgKGEgPSBjKQogICgqIHNhbWUgcGFydCBlbmQgKikKCiAgOyBQcmludGYucHJpbnRmICIlQiAlQlxuIiAoYSA8PiBiKSAoYSA8PiBjKQoKbGV0IF8gPQogIG1haW5fc3RkICgpIDsKICBtYWluX2V4dCAoKQoKCgooKiB0eXBlIGNvbXBhdGliaWxpdHkgKikKCmxldCBzdGRfcGFpciB4ID0KICBQYWlyLm9mX2ludCB4CgpsZXQgZXh0X3BhaXIgeCA9CiAgbGV0IG9wZW4gRXh0IGluCiAgUGFpci5vZl9pbnQgeAoKbGV0IF8gPQogIGxldCBhID0gc3RkX3BhaXIgMQogIGFuZCBiID0gZXh0X3BhaXIgMSBpbgogIFByaW50Zi5wcmludGYgIiVCXG4iIChhID0gYikgKCogY29tcGlsZWQgKikK