diff --git a/Makefile b/Makefile
index 5900294b0363d5549235a4b3cb34e39617e78150..6e3f159c960ebc3e2428cc2b1301239add10be82 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 all: absyn lex yac rest
 
 absyn:
-	mosmlc -c Absyn.sml
+	mosmlc -c ast.sml
 
 lex:
 	mosmllex l.lex
diff --git a/ast.sml b/ast.sml
index 13d699207442fbe1cdf4c9a18d2c2f7910a21651..720042cea596621de3fb85ff602bc0cfb6bc519c 100644
--- a/ast.sml
+++ b/ast.sml
@@ -2,11 +2,41 @@ (* AST for a K-like language *)
 
 app load ["Word8"];
 
-datatype atom = Num of Word8.word
-              | Fun of (arr -> arr)
+datatype func = F0 of unit -> arr
+              | F1 of arr -> arr
+              | F2 of (arr * arr) -> arr
+and      atom = Num of Word8.word
+              (* | Fun of func *) (* FIXME: we want functions as atoms! *)
 and      arr  = Scalar of atom
               | Array of arr list;
 
-datatype ast = Nothing
-             | Leaf of arr
-             | Node of (arr -> arr) * ast * ast;
+datatype ast = Leaf of arr
+             | Nilad of unit -> arr
+             | Monad of (arr -> arr) * ast
+             | Dyad of ((arr * arr) -> arr) * ast * ast;
+             (* TODO: higher-arity functions, projections &c.  Unless you just
+                want to do an APL rather than a K? *)
+
+(* Test data *)
+fun dup(x) = Array([x]@[x]);
+val x = Leaf(Scalar(Num(0w2)));
+val y = Leaf(Array([Scalar(Num(0w3)),Scalar(Num(0w4))]));
+val m = Monad(dup,x);
+(* val n = Dyad(dup,x,y);
+val t0 = Dyad(dup,n,n);
+val t1 = Dyad(dup,t0,n}); *)
+
+fun eval_atom(a) = case a of
+                        Num(x) => x;
+                      (* | Fun(x) => 0wxff; (* FIXME *) *)
+
+fun eval_arr(a) = case a of
+                       Scalar(x) => eval_atom(x)
+                     | Array(x) => 0wxaa; (* FIXME *)
+
+fun eval_ast(t) = case t of
+                       Leaf(a) => eval_arr(a)
+                     | Nilad(f) => eval_arr(f())
+                     | Monad(f,r) => Leaf(f(eval_ast(r)));
+                     (* | Dyad(f,l,r) => eval_arr(f(eval_ast(l),eval_ast(r)));
+                     * *)
