diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-01-22 19:45:12 -0800 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-05-18 08:11:25 -0700 |
| commit | e5034d3a668fbf0a4367bb582d759ba82b5576a3 (patch) | |
| tree | b0b658d254fe6a710183e60e792bb068263e77df /generate-show-syntax.sml | |
| parent | 06624f3183f4d773cf1023cabe2e370ebba5dee1 (diff) | |
| download | sml-e5034d3a668fbf0a4367bb582d759ba82b5576a3.tar.zst | |
Support struct expressions
Diffstat (limited to 'generate-show-syntax.sml')
| -rw-r--r-- | generate-show-syntax.sml | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/generate-show-syntax.sml b/generate-show-syntax.sml index 7e7e38a..d58d73d 100644 --- a/generate-show-syntax.sml +++ b/generate-show-syntax.sml @@ -17,17 +17,18 @@ val header = ^ "fun listToString (_ : string -> 'a -> string) (_ : string) ([] : 'a list) : string = \"[]\"\n" ^ " | listToString show indent [x] = \"[\" ^ show indent x ^ \"]\"\n" ^ " | listToString show indent xs =\n" - ^ " let val indent' = indent ^ \" \" in\n" - ^ " \"[\\n\" ^ indent' ^ String.concatWith (\",\\n\" ^ indent') (map (show indent') xs) ^ \"\\n\" ^ indent ^ \"]\"\n" - ^ " end\n" + ^ " let val indent' = indent ^ \" \" in\n" + ^ " \"[\\n\"\n" + ^ " ^ indent' ^ String.concatWith (\",\\n\" ^ indent') (map (show indent') xs) ^ \"\\n\"\n" + ^ " ^ indent ^ \"]\"\n" + ^ " end\n" fun showTy (Syntax.Tyvar var) : string = var ^ "ToStringI" | showTy (Syntax.Tycon ([ty], con)) = con ^ "ToString (" ^ showTy ty ^ ")" | showTy (Syntax.TyTuple tys) = - let val vars = List.tabulate (length tys, fn i => "x" ^ Int.toString i) - in - "(fn indent => fn (" ^ String.concatWith ", " vars ^ ") => let val indent' = indent ^ \" \" in \"(\\n\" ^ indent' ^ " ^ String.concatWith " ^ \",\\n\" ^ indent' ^ " (map (fn (var, ty) => showTy ty ^ " indent' " ^ var) (ListPair.zip (vars, tys))) ^ " ^ \"\\n\" ^ indent ^ \")\" end)" - end + let val vars = List.tabulate (length tys, fn i => "x" ^ Int.toString i) in + "(fn indent => fn (" ^ String.concatWith ", " vars ^ ") => let val indent' = indent ^ \" \" in \"(\\n\" ^ indent' ^ " ^ String.concatWith " ^ \",\\n\" ^ indent' ^ " (map (fn (var, ty) => showTy ty ^ " indent' " ^ var) (ListPair.zip (vars, tys))) ^ " ^ \"\\n\" ^ indent ^ \")\" end)" + end | showTy _ = "(fn _ => fn _ => \"UNHANDLED\")" val opts = { o = ref "/dev/stdout" } @@ -43,23 +44,22 @@ val ast = | Result.Right x => x val (structName, decls) = case ast of - Syntax.ELet (Syntax.DStruct str :: _, _) => str + Syntax.ELet (Syntax.DStruct (structName, Syntax.SStruct decls) :: _, _) => (structName, decls) | _ => raise Fail "ast has unexpected format (I can't print it sorry)" val out = TextIO.openOut (!(#o opts)) val _ = TextIO.output (out, "(*\n This file was generated by generate-show-syntax.sml. Do not edit manually.\n To regenerate, use\n\n sml generate-show-syntax.sml -o " ^ !(#o opts) ^ " " ^ filename ^ "\n*)\n\n") val _ = TextIO.output (out, "structure Show" ^ structName ^ " = struct\n") val _ = TextIO.output (out, header) val _ = map - (fn (i, Syntax.DDatatype (typeName, cases)) => ( - TextIO.output (out, + (fn (i, Syntax.DDatatype (typeName, cases)) => + (TextIO.output (out, "\n" ^ (if i = 0 then "fun" else "and") ^ " " ^ String.concatWith "\n | " (map - (fn (caseName, NONE) => typeName ^ "ToStringI (indent : string) (" ^ structName ^ "." ^ caseName ^ " : " ^ structName ^ "." ^ typeName ^ ") : string =\n \"" ^ caseName ^ "\"" - | (caseName, SOME ty) => typeName ^ "ToStringI (indent : string) (" ^ structName ^ "." ^ caseName ^ " x : " ^ structName ^ "." ^ typeName ^ ") : string =\n \"" ^ caseName ^ " \" ^ " ^ showTy ty ^ " indent x") + (fn (caseName, NONE) => typeName ^ "ToStringI (indent : string) (" ^ structName ^ "." ^ caseName ^ " : " ^ structName ^ "." ^ typeName ^ ") : string =\n \"" ^ caseName ^ "\"" + | (caseName, SOME ty) => typeName ^ "ToStringI (indent : string) (" ^ structName ^ "." ^ caseName ^ " x : " ^ structName ^ "." ^ typeName ^ ") : string =\n \"" ^ caseName ^ " \" ^ " ^ showTy ty ^ " indent x") cases) - ^ "\n"); - TextIO.output (out, "and " ^ typeName ^ "ToString (x : " ^ structName ^ "." ^ typeName ^ ") : string = " ^ typeName ^ "ToStringI \"\" x\n") - ) + ^ "\n") ; + TextIO.output (out, "and " ^ typeName ^ "ToString (x : " ^ structName ^ "." ^ typeName ^ ") : string = " ^ typeName ^ "ToStringI \"\" x\n")) | _ => ()) (ListPair.zip (List.tabulate (length decls, fn i => i), decls)) val _ = TextIO.output(out, "end\n") |
