# HG changeset patch # User Christian Urban # Date 1243723157 -7200 # Node ID 03145998190bb4dbc578a2b1594f14e8d548b663 # Parent ce0f60d0351e4506bde281e48439fd706183df11 slightly modified index generation diff -r ce0f60d0351e -r 03145998190b ProgTutorial/FirstSteps.thy --- a/ProgTutorial/FirstSteps.thy Sat May 30 23:58:05 2009 +0200 +++ b/ProgTutorial/FirstSteps.thy Sun May 31 00:39:17 2009 +0200 @@ -1009,8 +1009,8 @@ (FIXME: Explain the following better.) Occasionally you have to calculate what the ``base'' name of a given - constant is. For this you can use the function @{ML [index] extern_const in Sign} or - @{ML base_name in Long_Name}. For example: + constant is. For this you can use the function @{ML [index] "Sign.extern_const"} or + @{ML [index] Long_Name.base_name}. For example: @{ML_response [display,gray] "Sign.extern_const @{theory} \"List.list.Nil\"" "\"Nil\""} diff -r ce0f60d0351e -r 03145998190b ProgTutorial/Parsing.thy --- a/ProgTutorial/Parsing.thy Sat May 30 23:58:05 2009 +0200 +++ b/ProgTutorial/Parsing.thy Sun May 31 00:39:17 2009 +0200 @@ -288,7 +288,6 @@ where the function @{ML [index] not_eof in Symbol} ensures that we do not read beyond the end of the input string (i.e.~stopper symbol). - \indexdef{unless@ {\tt\slshape{unless}}}{in {\tt\slshape Scan}} The function @{ML "Scan.unless p q" for p q} takes two parsers: if the first one can parse the input, then the whole parser fails; if not, then the second is tried. Therefore diff -r ce0f60d0351e -r 03145998190b ProgTutorial/antiquote_setup.ML --- a/ProgTutorial/antiquote_setup.ML Sat May 30 23:58:05 2009 +0200 +++ b/ProgTutorial/antiquote_setup.ML Sun May 31 00:39:17 2009 +0200 @@ -6,16 +6,17 @@ open OutputTutorial (* functions for generating appropriate expressions *) -fun ml_val_open ys xs txt = - let fun ml_val_open_aux ys txt = +fun ml_val_open ys istruc txt = +let + fun ml_val_open_aux ys txt = "fn " ^ (case ys of [] => "_" | _ => enclose "(" ")" (commas ys)) ^ " => (" ^ txt ^ ")"; - in - (case xs of - [] => ml_val_open_aux ys txt - | _ => ml_val_open_aux ys ("let open " ^ (space_implode " " xs) ^ " in " ^ txt ^ " end")) - end; +in + (case istruc of + NONE => ml_val_open_aux ys txt + | SOME st => ml_val_open_aux ys ("let open " ^ st ^ " in " ^ txt ^ " end")) +end -fun ml_val txt = ml_val_open [] [] txt; +fun ml_val txt = ml_val_open [] NONE txt; fun ml_pat (lhs, pat) = let @@ -41,26 +42,26 @@ #> implode #> string_explode "" -(* checks and prints open expressions *) -fun output_ml {context = ctxt, ...} (txt, (ovars, structs)) = - (eval_fn ctxt (ml_val_open ovars structs txt); - if structs = [] - then output_indexed (transform_cmts_str txt) {main = Code txt, minor = ""} - else output_indexed (transform_cmts_str txt) - {main = Code txt, minor = ("in {\\tt\\slshape{}" ^ (implode structs) ^ "}")}) +(* checks and prints open expressions, calculates index entry *) +fun output_ml {context = ctxt, ...} (txt, (ovars, istruc)) = + (eval_fn ctxt (ml_val_open ovars istruc txt); + case (istruc, Long_Name.base_name txt, Long_Name.qualifier txt) of + (NONE, bn, "") => output_indexed (transform_cmts_str txt) {main = Code txt, minor = NoString} + | (NONE, bn, qn) => output_indexed (transform_cmts_str txt) {main = Code bn, minor = IStruc qn} + | (SOME st, _, _) => output_indexed (transform_cmts_str txt) {main = Code txt, minor = IStruc st}) val parser_ml = Scan.lift (Args.name -- (Scan.optional (Args.$$$ "for" |-- OuterParse.!!! (Scan.repeat1 Args.name)) [] -- - Scan.optional (Args.$$$ "in" |-- OuterParse.!!! (Scan.repeat1 Args.name)) [])) + Scan.option (Args.$$$ "in" |-- OuterParse.!!! Args.name))) (* checks and prints types and structures *) fun output_struct {context = ctxt, ...} txt = (eval_fn ctxt (ml_struct txt); - output_indexed (string_explode "" txt) {main = Code txt, minor = "structure"}) + output_indexed (string_explode "" txt) {main = Code txt, minor = Plain "structure"}) fun output_type {context = ctxt, ...} txt = (eval_fn ctxt (ml_type txt); - output_indexed (string_explode "" txt) {main = Code txt, minor = "type"}) + output_indexed (string_explode "" txt) {main = Code txt, minor = Plain "type"}) (* checks and expression agains a result pattern *) fun output_response {context = ctxt, ...} (lhs, pat) = diff -r ce0f60d0351e -r 03145998190b ProgTutorial/output_tutorial.ML --- a/ProgTutorial/output_tutorial.ML Sat May 30 23:58:05 2009 +0200 +++ b/ProgTutorial/output_tutorial.ML Sun May 31 00:39:17 2009 +0200 @@ -27,8 +27,10 @@ end datatype qstring = - Plain of string -| Code of string + NoString +| Plain of string +| Code of string +| IStruc of string datatype entry = No_Entry @@ -62,17 +64,19 @@ else error ("Underspecified index entry only for single words allowed! Error with " ^ quote str) end -fun get_qstring (Plain s) = get_word s +fun get_qstring NoString = "" + | get_qstring (Plain s) = get_word s | get_qstring (Code s) = let val w = get_word s in (w ^ "@{\\tt\\slshape{}" ^ w ^ "}") end + | get_qstring (IStruc s) = "in {\\tt\\slshape{}" ^ (get_word s) ^ "}" fun is_empty_qstr (Plain "") = true | is_empty_qstr (Code "") = true | is_empty_qstr _ = false fun get_index_info {main = m, minor = n} = - (if n = "" + (if n = NoString then "\\index{" ^ (get_qstring m) ^ "}" - else "\\indexdef{" ^ (get_qstring m) ^ "}{" ^ n ^ "}") + else "\\indexdef{" ^ (get_qstring m) ^ "}{" ^ (get_qstring n) ^ "}") fun index_entry entry index_info = case entry of diff -r ce0f60d0351e -r 03145998190b progtutorial.pdf Binary file progtutorial.pdf has changed