/* I heard that you could annotate annotations, so immediately I had to see if
 * one could construct a programming language from annotations of annotations.
 *
 * It turns out that you can't annotate annotations.  You can annotate the
 * declaration of annotation type, but you cannot annotate the use of an
 * annotation (in @a @b @c x, a-c are annotations of x, not one another),
 * nor can annotations nest.  If they could...
 */

@interface defun {
	String name();
	Object value();
}
@interface if_ {
	Object test();
	Object then();
	Object else_();
}
@interface lessthan {
	Object x1();
	Object x2();
}
@interface add {
	Object x1();
	Object x2();
}
@interface sub {
	Object x1();
	Object x2();
}
@interface recurse1 {
	Object x1();
}

@defun(name = "fib",
       value = @if_(test = @lessthan(x1 = "x1", x2 = 3),
                    then = 1,
                    else_ = @add(x1 = @recurse1(x1 = @sub(x1 = "x1", x2 = 1)),
                                 x2 = @recurse1(x1 = @sub(x1 = "x1", x2 = 2)))))
class AnnotationsCannotNest {}

