// recursive example #include "ailib.h" int count1(int ls){ int s = 0; while( ls != NIL ){ s++; ls = tail(ls); } return s; } int count2(int ls){ if( ls == NIL ) return 0; return 1 + count2(tail(ls)); } int count3(int ls){ if( ls == NIL ) return 0; if( isatom(head(ls)) ) return 1 + count3(tail(ls)); return count3(head(ls)) + count3(tail(ls)); } int count4(int ls){ if( ls == NIL ) return 0; if( isatom(ls) ) return 1; return count4(head(ls)) + count4(tail(ls)); } int unum1(int n){ int ls; ls = NIL; while(n > 0){ ls = cons(number(1),ls); n--; } return ls; } int unum2(int n){ if( n == 0 ) return NIL; return cons(number(1), unum2(n-1)); } int cat2(int a, int b){ if( a == NIL ) return b; return cat2( tail(a), cons(head(a),b) ); } int uadd(int n, int m){ if( m == NIL ) return n; if( n == NIL ) return m; return uadd( tail(n), cons(head(n),m) ); } int usub(int n, int m){ // assume n >= m if( m == NIL ) return n; return usub( tail(n), tail(m) ); } int reverse2(int ls, int ls1){ if( ls == NIL ) return ls1; return reverse2(tail(ls), cons(head(ls),ls1)); } int reverse(int ls){ return reverse2(ls, NIL); } int main(void){ int a, b, c; a = cons(number(2),cons(number(3),NIL)); b = cons(number(1),list(a)); // print_list(b); // printf("%d\n", cnt4(b)); a = unum1(4); // b = unum2(3); c = cat2(a,b); c = uadd(a,b); c = usub(a,b); c = reverse(b); print_list(c); }