doc-src/MacroHints
author wenzelm
Thu, 11 Nov 1993 10:00:43 +0100
changeset 106 7a5d207e6151
parent 103 30bd42401ab2
child 107 b4a8dabc7313
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
106
7a5d207e6151 *** empty log message ***
wenzelm
parents: 103
diff changeset
     1
103
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     2
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     3
Hints
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     4
=====
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     5
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     6
This is an incomprehensive list of facts about the new version of the syntax
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     7
module (the macro system).
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     8
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
     9
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    10
- Syntax of "translations" section is list of <xrule> where: (metachars: [ | ])
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    11
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    12
    <xrule> ::= [(<id>)] <string> [ => | <= | == ] [(<id>)] <string>
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    13
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    14
  One such line specifies a parse rule (=>) or a print rule (<=) or both (==).
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    15
  The optional <id> before each <string> specifies the name of the syntactic
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    16
  category to be used for parsing the string; the default is logic. Note that
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    17
  this has no influence on the applicability of rules.
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    18
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    19
  Example:
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    20
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    21
    translations
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    22
      (prop) "x:X"  == (prop) "|- x:X"
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    23
      "Lam x:A.B"   == "Abs(A, %x.B)"
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    24
      "Pi x:A.B"    => "Prod(A, %x.B)"
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    25
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    26
  All rules of a theory will be shown in their internal (ast * ast) form by
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    27
  Syntax.print_trans.
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    28
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    29
- Caveat: rewrite rules know no "context" nor "semantics", e.g. something
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    30
  like "('a, Nil)Cons", "% Nil Cons. Cons(a, Nil)" or "Cons(a, [])" will be
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    31
  rewritten by the rules "[x]" <= "Cons(x, [])", "[]" <= "Nil"; (this is a
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    32
  general problem with macro systems);
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    33
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    34
- syn_of: theory -> Syntax.syntax
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    35
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    36
- Syntax.print_gram shows grammer of syntax
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    37
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    38
- Syntax.print_trans shows translations of syntax
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    39
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    40
- Syntax.print_syntax shows grammer and translations of syntax
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    41
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    42
- Ast.stat_normalize := true enables output of statistics after normalizing;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    43
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    44
- Ast.trace_normalize := true enables verbose output while normalizing and
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    45
  statistics;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    46
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    47
- eta_contract := false disables eta contraction when printing terms;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    48
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    49
- asts: (see also Pure/Syntax/ast.ML *)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    50
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    51
    (*Asts come in two flavours:
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    52
       - proper asts representing terms and types: Variables are treated like
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    53
         Constants;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    54
       - patterns used as lhs and rhs in rules: Variables are placeholders for
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    55
         proper asts.*)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    56
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    57
    datatype ast =
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    58
      Constant of string |    (* "not", "_%", "fun" *)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    59
      Variable of string |    (* x, ?x, 'a, ?'a *)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    60
      Appl of ast list;       (* (f x y z), ("fun" 'a 'b) *)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    61
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    62
    (*the list of subasts of an Appl node has to contain at least 2 elements, i.e.
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    63
      there are no empty asts or nullary applications; use mk_appl for convenience*)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    64
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    65
- ast output style:
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    66
    Constant a              ->  "a"
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    67
    Variable a              ->  a
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    68
    Appl [ast1, ..., astn]  ->  (ast1 ... astn)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    69
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    70
- sext: (see also Pure/Syntax/sextension.ML)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    71
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    72
    (** datatype sext **)
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    73
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    74
    datatype xrule =
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    75
      op |-> of (string * string) * (string * string) |
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    76
      op <-| of (string * string) * (string * string) |
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    77
      op <-> of (string * string) * (string * string);
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    78
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    79
    datatype sext =
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    80
      Sext of {
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    81
        mixfix: mixfix list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    82
        parse_translation: (string * (term list -> term)) list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    83
        print_translation: (string * (term list -> term)) list} |
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    84
      NewSext of {
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    85
        mixfix: mixfix list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    86
        xrules: xrule list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    87
        parse_ast_translation: (string * (ast list -> ast)) list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    88
        parse_preproc: (ast -> ast) option,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    89
        parse_postproc: (ast -> ast) option,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    90
        parse_translation: (string * (term list -> term)) list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    91
        print_translation: (string * (term list -> term)) list,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    92
        print_preproc: (ast -> ast) option,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    93
        print_postproc: (ast -> ast) option,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    94
        print_ast_translation: (string * (ast list -> ast)) list};
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    95
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    96
- local (thy, ext) order of rules is preserved, global (merge) order is
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    97
  unspecified;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    98
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
    99
- read asts contain a mixture of Constant and Variable atoms (some
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   100
  Variables become Const later);
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   101
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   102
- *.thy-file/ML-section: all declarations will be exported, therefore
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   103
  one should use local-in-end constructs where appropriate; especially
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   104
  the examples in Logics/Defining could be better behaved;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   105
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   106
- [document the asts generated by the standard syntactic categories
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   107
  (idt, idts, args, ...)];
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   108
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   109
- print(_ast)_translation: the constant has to disappear or execption
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   110
  Match raised, otherwise the printer will not terminate;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   111
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   112
- binders are implemented traditionally, i.e. as parse/print_translations
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   113
  (compatibility, alpha, eta, HOL hack easy);
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   114
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   115
- changes to the term/ast "parsetree" structure: renamed most constants
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   116
  (_args, _idts, ...), unified typ applications, _tapp/_tappl, type atoms
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   117
  no Const rather than Free;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   118
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   119
- misfeature: eta-contraction before rewriting therefore bounded quantifiers,
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   120
  Collect etc. may fall back to internal form;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   121
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   122
- changes and fixes to printing of types:
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   123
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   124
    "'a => 'b => 'c" now printed as "['a,'b] => 'c";
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   125
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   126
    constraints now printed iff not dummyT and show_types enabled, changed
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   127
    internal print_translations accordingly; old translations that intruduce
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   128
    frees may cause printing of constraints at all occurences;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   129
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   130
    constraints of bound vars now printed where bound (i.e. "%x::'a. x" rather
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   131
    than "%x. x::'a") and put in braces if necessary ("%(x::'a) y::'b. f(x,y)");
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   132
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   133
    constraints of bound var printed even if a free var in another scope happens
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   134
    to have the same name and type;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   135
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   136
- [man: toplevel pretty printers for NJ];
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   137
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   138
- (syntactic constants "_..." (e.g. "_idts") are reserved, you may use "@..."
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   139
  or "*..." instead);
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   140
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   141
- Printer: clash of fun/type constants with concrete syntax type/fun
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   142
  constants causes incorrect printing of of applications;
30bd42401ab2 Initial revision
lcp
parents:
diff changeset
   143