2 #include <AD/strings/quark.h>
4 datatype List<T> :: collectable rewrite = #[] | #[ T ... List<T> ];
5 datatype List2<T> :: collectable rewrite = #{} | #{ T ... List2<T> };
6 datatype Sexpr :: collectable rewrite
11 | #( Sexpr ... Sexpr )
13 law inline LAMBDA(x,e) = #(ATOM(#"lambda"),#(x),e)
16 instantiate datatype List<int>, List2<int>, Sexpr, List<Sexpr>;
18 extern ostream& operator << (ostream& s, Sexpr e);
19 extern ostream& print_list(ostream& s, Sexpr e);
21 ostream& print_list(ostream& s, Sexpr e)
24 { #(h): { s << h; e = #(); }
25 | #(h ... t): { s << h << ' '; e = t; }
30 ostream& operator << (ostream& s, Sexpr e)
32 { ATOM id: { return s << id; }
33 | INTEGER i: { return s << i; }
34 | REAL r: { return s << r; }
35 | #(): { return s << "nil"; }
36 | #( _ ... _ ): { return print_list(s,e); }
41 { Sexpr x = ATOM(#"x");
42 Sexpr succ = LAMBDA(x,#(ATOM(#"+"),x,INTEGER(1)));