[isabelle-dev] [PATCH 1 of 1] Fix top-level printing of exception messages containing forced-line breaks

Makarius makarius at sketis.net
Mon Apr 8 18:06:06 CEST 2013

On Tue, 2 Apr 2013, David Greenaway wrote:

> # HG changeset patch
> # User David Greenaway <david.greenaway at nicta.com.au>
> # Date 1364864695 -39600
> # Node ID 27bd348e777a3ffa4a4bf5bb18faa0a8428e468f
> # Parent  d40aec502416a0eaa094e5aef1f317f7c4867852
> Fix top-level printing of exception messages containing forced-line breaks.
> Both Isabelle and PolyML have pretty printers. One problem arises when
> converting from Isabelle's format to PolyML's format, in that the former
> supports "forced line breaks" while the latter does not. The current solution
> is to expand such line-breaks into a large number of spaces (99999, to be
> precise), preventing PolyML from fitting the spaces on a line, and hence
> forcing it to produce a line-break.
> This approach, unfortunately, falls down in two areas: "PolyML.makestring"
> renders the large amount of spaces, producing undesirable results. Similarly,
> "General.exnMessage" in PolyML simply calls "PolyML.makestring", and hence has
> the same problem.
> The problem can be seen with the following testcase:
>     definition "test a b ≡ undefined"
>     notation (output) test ("test // (_) // (_)")
>     ML {* raise (CTERM ("test", [@{cterm "test x y" }])) *}
> This patch fixes one instance of this problem by using an alternative mechanism
> to pretty-print unhanded exceptions which prevents the large number of spaces
> being rendered.
> diff --git a/src/Pure/Isar/runtime.ML b/src/Pure/Isar/runtime.ML
> --- a/src/Pure/Isar/runtime.ML
> +++ b/src/Pure/Isar/runtime.ML
> @@ -65,6 +65,10 @@
>          SOME exns => maps (flatten context) exns
>        | NONE => [(context, identify exn)]);
> +fun str_of_exn (exn : exn) =
> +  PolyML.prettyRepresentation (exn, ! Pretty.margin_default)
> +  |> pretty_ml |> Pretty.from_ML |> Pretty.string_of

Sorry, I did not mean to re-open this messy thread anytime soon, but David 
Matthews had offered his help with forced breaks in Poly/ML in privite 
mail.  Since I did not want to waste his time as well, I've looked through 
the situation in Isabelle/ML once more, eventually resulting in 

Doing this, I cross-checked with the above proposal, just as part of the 
normal professional routine, despite all the annoyances caused on this 
mailing list.

This revealed a genuine "bug" in the change, one of the rare sort that are 
easily pointed out: "! Pretty.margin_default" should be "get_print_depth ()"
as can be seen from existing uses of this function, e.g. here 

"This patch fixes ..." nothing, it introduces a subtle bug that could 
easily take years to rediscover.  I don't want to blame anybody.  And I am 
not repeating anything I've tried to explain earlier on this (and related) 
threads.  I just hope that lessons are learned eventually.

This is why we have this mailing list: to learn how things are done 
properly, despite all the challenges caused by this sophisticated system.

[Thread closed, as far as I am concerned.]


More information about the isabelle-dev mailing list