namespace tysp {
struct nil {
typedef nil first;
typedef nil second;
typedef nil type;
};
struct t {
typedef t first;
typedef nil second;
typedef t type;
};
template<typename T, typename U>
struct list {
typedef T first;
typedef U second;
struct eval {
typedef typename T::eval<U>::type type;
};
};
struct car {
template<typename T>
struct eval {
typedef typename T::first::first type;
};
};
struct cdr {
template<typename T>
struct eval {
typedef typename T::first::second type;
};
};
struct cadr {
template<typename T>
struct eval {
typedef typename list<car, list<typename list<cdr, T>::eval::type, nil> >::eval::type type;
};
};
struct caddr {
template<typename T>
struct eval {
typedef typename list<cadr, list<typename list<cdr, T>::eval::type, nil> >::eval::type type;
};
};
struct cadddr {
template<typename T>
struct eval {
typedef typename list<caddr, list<typename list<cdr, T>::eval::type, nil> >::eval::type type;
};
};
struct eq {
template<typename T, typename U>
struct impl {
typedef nil type;
};
template<typename T>
struct impl<T, T> {
typedef t type;
};
template<typename T>
struct eval {
typedef typename impl<typename list<car, T>::eval::type, typename list<cadr, T>::eval::type>::type type;
};
};
struct atom {
template<typename T>
struct eval {
typedef t type;
};
};
template<typename T, typename U>
struct atom::eval<list<T, U> > {
typedef nil type;
};
struct cons {
template<typename T>
struct eval {
typedef list<typename list<car, T>::eval::type, typename list<cadr, T>::eval::type> type;
};
};
struct find {
template<typename T>
struct eval {
};
};
struct is_pointer {
template<typename T>
struct eval {
typedef nil type;
};
};
template<typename T>
struct is_reference {
template<typename T>
struct eval {
typedef nil type;
};
};
template<typename T1 = nil, typename T2 = nil, typename T3 = nil, typename T4 = nil>
struct make_list {
typedef list<T1, list<T2, list<T3, list<T4, nil> > > > type;
};
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef wchar_t wchar;
typedef list< char, list< uchar, list< short, list< ushort, list< int, list< uint, list< long, list< ulong, nil > > > > > > > > integer;
typedef list< float, list< double, integer > > arith;
template<typename T>
struct parameter_type {
};
}