src/Pure/Syntax/syn_trans.ML
changeset 922 196ca0973a6d
parent 639 c88d56f7f33b
child 987 32bb5a8d5aab
--- a/src/Pure/Syntax/syn_trans.ML	Thu Mar 02 12:07:20 1995 +0100
+++ b/src/Pure/Syntax/syn_trans.ML	Fri Mar 03 11:48:05 1995 +0100
@@ -34,6 +34,7 @@
     val abs_tr': term -> term
     val prop_tr': bool -> term -> term
     val appl_ast_tr': ast * ast list -> ast
+    val applC_ast_tr': ast * ast list -> ast
     val pt_to_ast: (string -> (ast list -> ast) option) -> parsetree -> ast
     val ast_to_term: (string -> (term list -> term) option) -> ast -> term
   end
@@ -51,8 +52,15 @@
 
 (* application *)
 
-fun appl_ast_tr (*"_appl"*) [f, args] = Appl (f :: unfold_ast "_args" args)
-  | appl_ast_tr (*"_appl"*) asts = raise_ast "appl_ast_tr" asts;
+fun appl_ast_tr [f, args] = Appl (f :: unfold_ast "_args" args)
+  | appl_ast_tr asts = raise_ast "appl_ast_tr" asts;
+
+fun applC_ast_tr [f, arg] =
+      let fun unfold_ast_c (y as Appl (Constant _ :: _)) = [y]
+            | unfold_ast_c (Appl xs) = xs
+            | unfold_ast_c y = [y];
+      in Appl ((unfold_ast_c f) @ [arg]) end
+  | applC_ast_tr asts = raise_ast "applC_ast_tr" asts;
 
 
 (* abstraction *)
@@ -124,6 +132,24 @@
 fun appl_ast_tr' (f, []) = raise_ast "appl_ast_tr'" [f]
   | appl_ast_tr' (f, args) = Appl [Constant "_appl", f, fold_ast "_args" args];
 
+fun applC_ast_tr' (f, []) = raise_ast "applC_ast_tr'" [f]
+  | applC_ast_tr' (f, arg::args) =
+      let (* fold curried function application *)
+          fun fold [] result = result
+            | fold (x :: xs) result =
+                fold xs (Appl [Constant "_applC", result, x]);
+      in fold args (Appl [Constant "_applC", f, arg]) end;
+(*
+        f a b c  ()
+        ("_applC" f a)
+
+        b c      ("_applC" f a)
+	("_applC" ("_applC" f a) b)
+
+        c	 ("_applC" ("_applC" f a) b)
+	("_applC" ("_applC" ("_applC" f a) b) c)
+*)
+
 
 (* abstraction *)
 
@@ -253,9 +279,11 @@
 (** pure_trfuns **)
 
 val pure_trfuns =
- ([(applC, appl_ast_tr), ("_lambda", lambda_ast_tr), ("_idtyp", idtyp_ast_tr),
-    ("_bigimpl", bigimpl_ast_tr)],
-  [("_abs", abs_tr), ("_aprop", aprop_tr), ("_ofclass", ofclass_tr), ("_K", k_tr)],
+ ([("_appl", appl_ast_tr), ("_applC", applC_ast_tr),
+   ("_lambda", lambda_ast_tr), ("_idtyp", idtyp_ast_tr),
+   ("_bigimpl", bigimpl_ast_tr)],
+  [("_abs", abs_tr), ("_aprop", aprop_tr), ("_ofclass", ofclass_tr),
+   ("_K", k_tr)],
   [],
   [("_abs", abs_ast_tr'), ("_idts", idts_ast_tr'), ("==>", impl_ast_tr')]);