CookBook/Recipes/Antiquotes.thy
changeset 58 f3794c231898
parent 53 0c3580c831a4
child 59 b5914f3c643c
--- a/CookBook/Recipes/Antiquotes.thy	Tue Dec 16 17:37:39 2008 +0100
+++ b/CookBook/Recipes/Antiquotes.thy	Tue Dec 16 17:28:05 2008 +0000
@@ -21,12 +21,12 @@
   provides a sanity check for the code and also allows one to keep documents
   in sync with other code, for example Isabelle.
 
-  We first describe the antiquotation @{text "@{ML_checked \"\<dots>\"}"}. This
-  antiquotation takes a piece of code as argument; this code is then checked
+  We first describe the antiquotation @{text "@{ML_checked \"expr\"}"}. This
+  antiquotation takes a piece of code as argument. The argument is checked
   by sending the ML-expression @{text [quotes] "val _ = \<dots>"} containing the
-  given code to the ML-compiler (i.e.~the function @{ML "ML_Context.eval_in"}
-  in the snippet below). The code for @{text "@{ML_checked \"\<dots>\"}"} is as
-  follows:
+  given argument to the ML-compiler (i.e.~the function @{ML "ML_Context.eval_in"}
+  in Line 4 in the code below). The code of @{text "@{ML_checked \"expr\"}"} 
+  is as follows:
 
 *}
 
@@ -44,12 +44,12 @@
 text {*
 
   Note that the parser @{ML "(Scan.lift Args.name)"} in line 9 parses a string, 
-  in this case the code. This code is send to the ML-compiler in the line 4.  
+  in this case the code given as argument. This argument is send to the ML-compiler in the line 4.  
   If the code is ``approved'' by the compiler, then the output function @{ML
   "ThyOutput.output_list (fn _ => fn s => Pretty.str s)"} in the next line pretty prints the
   code. This function expects that the code is a list of strings where each
-  string correspond to a line (therefore the @{ML "(space_explode \"\\n\" txt)" for txt} 
-  which produces this list).  There are a number of options for antiquotations
+  string correspond to a line. Therefore the @{ML "(space_explode \"\\n\" txt)" for txt} 
+  which produces this list.  There are a number of options for antiquotations
   that are observed by @{ML ThyOutput.output_list} when printing the code (for
   example @{text "[display]"}, @{text "[quotes]"} and @{text "[source]"}).
 
@@ -63,8 +63,7 @@
 
 *}
 
-ML {*
-fun output_ml ml src ctxt (txt,pos) =
+ML %linenumbers {* fun output_ml ml src ctxt (txt,pos) =
   (ML_Context.eval_in (SOME ctxt) false pos (ml txt);
   ThyOutput.output_list (fn _ => fn s => Pretty.str s) src ctxt 
                                             (space_explode "\n" txt))
@@ -75,35 +74,40 @@
 *}
 
 text {*
+  where in Lines 1 and 2 the positional information is properly treated.
+
   (FIXME: say something about OuterParse.position)
 
   We can now write in a document @{text "@{ML_checked \"2 + 3\"}"} in order to
   obtain @{ML_checked "2 + 3"} and be sure that this code compiles until
-  somebody changes the definition of @{ML "(op +)"}.
+  somebody changes the definition of \mbox{@{ML "(op +)"}}.
 
 
-  The second antiquotation extends the first by allowing to also give
-  hints what the result of the ML-code is and check consistency of these
-  hints. For this we use the antiquotation  @{text "@{ML_response \"\<dots>\" \"\<dots>\"}"}
-  whose first argument is the ML-code and the second is the result. 
+  The second antiquotation extends the first by allowing also to give
+  hints what the result of the ML-code is and check the consistency of 
+  the actual result with these hints. For this we use the antiquotation  
+  @{text "@{ML_response \"expr\" \"pat\"}"}
+  whose first argument is the ML-code and the second is a pattern specifying
+  the result. To add some convenience we allow the user to give a partial
+  specification using @{text "\<dots>"}.
 
-  In the antiquotation @{text "@{ML_checked \"\<dots>\"}"} we send the expresion 
-  @{text [quotes] "val _ = \<dots>"} to the compiler. Now we will use the hints
-  to construct a pattern for the @{text "_"}. To add some convenince we allow
-  the user to give partial hints using @{text "\<dots>"}, which however need to
-  be replaced by @{text "_"} before sending the code to the compiler. The
-  function 
+  In the antiquotation @{text "@{ML_checked \"expr\"}"} we send the expression 
+  @{text [quotes] "val _ = expr"} to the compiler. Instead of the wildcard
+  @{text "_"}, we will here use the hints to construct a proper pattern. To
+  do this we need to replace the @{text "\<dots>"} by @{text "_"} before sending the 
+  code to the compiler. The function 
 
 *}
 
-ML {*
+ML {* 
 fun ml_pat (rhs, pat) =
 let val pat' = implode (map (fn "\<dots>" => "_" | s => s) (Symbol.explode pat))
 in "val " ^ pat' ^ " = " ^ rhs end;
 *}
 
 text {* 
-  will do this. Next we like to add a response indicator to the result using:
+  will construct the pattern that the compiler can use. Next we like to add 
+  a response indicator to the result using:
 *}
 
 
@@ -152,7 +156,6 @@
 *}
 
 
-
 end