メモ

namespace tysp {

	// lisp for type

	// nil
	struct nil {
		typedef nil first;
		typedef nil second;
		typedef nil type;
	};

	// t
	struct t {
		typedef t first;
		typedef nil second;
		typedef t type;
	};

	// list
	template<typename T, typename U>
	struct list {
		typedef T first;
		typedef U second;
		struct eval {
			typedef typename T::eval<U>::type type;
		};
	};

	// car
	struct car {
		template<typename T>
		struct eval {
			typedef typename T::first::first type;
		};
	};

	// cdr
	struct cdr {
		template<typename T>
		struct eval {
			typedef typename T::first::second type;
		};
	};

	// cadr
	struct cadr {
		template<typename T>
		struct eval {
			typedef typename list<car, list<typename list<cdr, T>::eval::type, nil> >::eval::type type;
		};
	};

	// caddr
	struct caddr {
		template<typename T>
		struct eval {
			typedef typename list<cadr, list<typename list<cdr, T>::eval::type, nil> >::eval::type type;
		};
	};

	// cadddr
	struct cadddr {
		template<typename T>
		struct eval {
			typedef typename list<caddr, list<typename list<cdr, T>::eval::type, nil> >::eval::type type;
		};
	};

	// eq
	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;
		};
	};

	// atom
	struct atom {
		template<typename T>
		struct eval {
			typedef t type;
		};
	};
	template<typename T, typename U>
	struct atom::eval<list<T, U> > {
		typedef nil type;
	};

	// cons
	struct cons {
		template<typename T>
		struct eval {
			typedef list<typename list<car, T>::eval::type, typename list<cadr, T>::eval::type> type;
		};
	};

	// find
	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 {
	};
}