diff options
author | Adam Chlipala <adam@chlipala.net> | 2012-04-21 15:09:02 -0400 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2012-04-21 15:09:02 -0400 |
commit | ab2b3d31f0236cf5dec6c5fccd4de6b97ca37851 (patch) | |
tree | 284e45d1278dd22ad46b658933da8e24019a8ffc | |
parent | 00786579bad72b41600a54441dbfc09625ada1ea (diff) |
Pretty-print tuple types using tuple syntax
-rw-r--r-- | src/elab_print.sml | 36 | ||||
-rw-r--r-- | tests/tupleError.ur | 3 |
2 files changed, 31 insertions, 8 deletions
diff --git a/src/elab_print.sml b/src/elab_print.sml index 46ad9285..69607056 100644 --- a/src/elab_print.sml +++ b/src/elab_print.sml @@ -112,14 +112,34 @@ fun p_con' par env (c, _) = string "=>", space, p_con env c3]) - | TRecord (CRecord (_, xcs), _) => box [string "{", - p_list (fn (x, c) => - box [p_name env x, - space, - string ":", - space, - p_con env c]) xcs, - string "}"] + | TRecord (CRecord (_, xcs), _) => + let + fun isTuple (n, xcs) = + case xcs of + [] => n > 2 + | ((CName s, _), _) :: xcs' => + s = Int.toString n andalso isTuple (n+1, xcs') + | _ => false + in + if isTuple (1, xcs) then + case xcs of + (_, c) :: xcs => + parenIf par (box [p_con' true env c, + p_list_sep (box []) (fn (_, c) => box [space, + string "*", + space, + p_con' true env c]) xcs]) + | _ => raise Fail "ElabPrint: surprise empty tuple" + else + box [string "{", + p_list (fn (x, c) => + box [p_name env x, + space, + string ":", + space, + p_con env c]) xcs, + string "}"] + end | TRecord c => box [string "$", p_con' true env c] diff --git a/tests/tupleError.ur b/tests/tupleError.ur new file mode 100644 index 00000000..d9b21fff --- /dev/null +++ b/tests/tupleError.ur @@ -0,0 +1,3 @@ +fun f (x : int * float) : string = x +fun g (x : int * float * bool) : string = x +fun h (x : {A : int, B : float, C : bool}) : string = x |