#include<iostream>
using std::pair;
using nil = std::nullptr_t;
template<class T> auto car(T lst) { return lst.first; }
template<class T> auto cdr(T lst) { return lst.second; }
template<class CAR, class CDR>
auto cons(CAR car, CDR cdr) { return pair<CAR, CDR>(car, cdr); }
auto list() { return nullptr; }
template<class CAR, class... CDR>
auto list(CAR car, CDR... cdr) { return cons(car, list(cdr...)); }
template<class T1, class L2>
auto append(pair<T1, nil> lst1, L2 lst2) { return cons(car(lst1), lst2); }
template<class L1, class L2>
auto append(L1 lst1, L2 lst2) { return cons(car(lst1), append(cdr(lst1), lst2)); }
template<class T> void print_lst(T lst);
template<class C>
void print_item(C item) { std::cout << item; }
template<class C1, class C2>
void print_item(pair<C1, C2> item) { print_lst(item); }
template<class T>
void print_lst_re(pair<T, nil> lst) {
print_item(car(lst));
std::cout << ")";
}
template<class C>
void print_lst_re(C lst) {
print_item(car(lst));
std::cout << " ";
print_lst_re(cdr(lst));
}
template<class T>
void print_lst(T lst) {
std::cout << "(";
print_lst_re(lst);
}
int main() {
auto lst1 = append(list(1, 2), list(3, 4));
static_assert(std::is_same<
decltype(lst1),
pair<int,
pair<int,
pair<int,
pair<int,
nil> > > > >::value);
print_lst(lst1);
std::cout << std::endl;
auto lst2 = list(1, list(2, 3), list("hello", list("0.1", 0.1), "goodbye"));
print_lst(lst2);
static_assert(std::is_same<
decltype(lst2),
pair<int,
pair<pair<int,
pair<int,
nil> >,
pair<pair<const char*,
pair<pair<const char*,
pair<double,
nil> >,
pair<const char *,
nil> > >,
nil> > > >::value);
}
I2luY2x1ZGU8aW9zdHJlYW0+Cgp1c2luZyBzdGQ6OnBhaXI7CnVzaW5nIG5pbCA9IHN0ZDo6bnVsbHB0cl90OwoKdGVtcGxhdGU8Y2xhc3MgVD4gYXV0byBjYXIoVCBsc3QpIHsgcmV0dXJuIGxzdC5maXJzdDsgfQp0ZW1wbGF0ZTxjbGFzcyBUPiBhdXRvIGNkcihUIGxzdCkgeyByZXR1cm4gbHN0LnNlY29uZDsgfQoKdGVtcGxhdGU8Y2xhc3MgQ0FSLCBjbGFzcyBDRFI+CmF1dG8gY29ucyhDQVIgY2FyLCBDRFIgY2RyKSB7IHJldHVybiBwYWlyPENBUiwgQ0RSPihjYXIsIGNkcik7IH0KCmF1dG8gbGlzdCgpIHsgcmV0dXJuIG51bGxwdHI7IH0KdGVtcGxhdGU8Y2xhc3MgQ0FSLCBjbGFzcy4uLiBDRFI+CmF1dG8gbGlzdChDQVIgY2FyLCBDRFIuLi4gY2RyKSB7IHJldHVybiBjb25zKGNhciwgbGlzdChjZHIuLi4pKTsgfQoKdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIEwyPgphdXRvIGFwcGVuZChwYWlyPFQxLCBuaWw+IGxzdDEsIEwyIGxzdDIpIHsgcmV0dXJuIGNvbnMoY2FyKGxzdDEpLCBsc3QyKTsgfQoKdGVtcGxhdGU8Y2xhc3MgTDEsIGNsYXNzIEwyPgphdXRvIGFwcGVuZChMMSBsc3QxLCBMMiBsc3QyKSB7IHJldHVybiBjb25zKGNhcihsc3QxKSwgYXBwZW5kKGNkcihsc3QxKSwgbHN0MikpOyB9Cgp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIHByaW50X2xzdChUIGxzdCk7Cgp0ZW1wbGF0ZTxjbGFzcyBDPgp2b2lkIHByaW50X2l0ZW0oQyBpdGVtKSB7IHN0ZDo6Y291dCA8PCBpdGVtOyB9Cgp0ZW1wbGF0ZTxjbGFzcyBDMSwgY2xhc3MgQzI+CnZvaWQgcHJpbnRfaXRlbShwYWlyPEMxLCBDMj4gaXRlbSkgeyBwcmludF9sc3QoaXRlbSk7IH0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgcHJpbnRfbHN0X3JlKHBhaXI8VCwgbmlsPiBsc3QpIHsKCXByaW50X2l0ZW0oY2FyKGxzdCkpOwoJc3RkOjpjb3V0IDw8ICIpIjsKfQoKdGVtcGxhdGU8Y2xhc3MgQz4Kdm9pZCBwcmludF9sc3RfcmUoQyBsc3QpIHsKCXByaW50X2l0ZW0oY2FyKGxzdCkpOwoJc3RkOjpjb3V0IDw8ICIgIjsKCXByaW50X2xzdF9yZShjZHIobHN0KSk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgcHJpbnRfbHN0KFQgbHN0KSB7CglzdGQ6OmNvdXQgPDwgIigiOwoJcHJpbnRfbHN0X3JlKGxzdCk7Cn0KCmludCBtYWluKCkgewoJYXV0byBsc3QxID0gYXBwZW5kKGxpc3QoMSwgMiksIGxpc3QoMywgNCkpOwoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8CgkJZGVjbHR5cGUobHN0MSksCgkJcGFpcjxpbnQsCgkJICAgICBwYWlyPGludCwKCQkJICAgICAgcGFpcjxpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxpbnQsCgkJCQkgICAgICAgICAgICBuaWw+ID4gPiA+ID46OnZhbHVlKTsKCXByaW50X2xzdChsc3QxKTsKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CglhdXRvIGxzdDIgPSBsaXN0KDEsIGxpc3QoMiwgMyksIGxpc3QoImhlbGxvIiwgbGlzdCgiMC4xIiwgMC4xKSwgImdvb2RieWUiKSk7CglwcmludF9sc3QobHN0Mik7CglzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTwKCQlkZWNsdHlwZShsc3QyKSwKCQlwYWlyPGludCwKCQkgICAgIHBhaXI8cGFpcjxpbnQsCgkJICAgICAgICAgICAgICAgcGFpcjxpbnQsCgkJICAgICAgICAgICAgICAgICAgICBuaWw+ID4sCgkJICAgICAgICAgIHBhaXI8cGFpcjxjb25zdCBjaGFyKiwKCQkgICAgICAgICAgICAgICAgICAgIHBhaXI8cGFpcjxjb25zdCBjaGFyKiwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPGRvdWJsZSwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbD4gPiwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxjb25zdCBjaGFyICosCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsPiA+ID4sCgkJICAgICAgICAgICAgICAgbmlsPiA+ID4gPjo6dmFsdWUpOwp9