fork download
  1. #include<iostream>
  2.  
  3. using std::pair;
  4. using nil = std::nullptr_t;
  5.  
  6. template<class T> auto car(T lst) { return lst.first; }
  7. template<class T> auto cdr(T lst) { return lst.second; }
  8.  
  9. template<class CAR, class CDR>
  10. auto cons(CAR car, CDR cdr) { return pair<CAR, CDR>(car, cdr); }
  11.  
  12. auto list() { return nullptr; }
  13. template<class CAR, class... CDR>
  14. auto list(CAR car, CDR... cdr) { return cons(car, list(cdr...)); }
  15.  
  16. template<class T1, class L2>
  17. auto append(pair<T1, nil> lst1, L2 lst2) { return cons(car(lst1), lst2); }
  18.  
  19. template<class L1, class L2>
  20. auto append(L1 lst1, L2 lst2) { return cons(car(lst1), append(cdr(lst1), lst2)); }
  21.  
  22. template<class T> void print_lst(T lst);
  23.  
  24. template<class C>
  25. void print_item(C item) { std::cout << item; }
  26.  
  27. template<class C1, class C2>
  28. void print_item(pair<C1, C2> item) { print_lst(item); }
  29.  
  30. template<class T>
  31. void print_lst_re(pair<T, nil> lst) {
  32. print_item(car(lst));
  33. std::cout << ")";
  34. }
  35.  
  36. template<class C>
  37. void print_lst_re(C lst) {
  38. print_item(car(lst));
  39. std::cout << " ";
  40. print_lst_re(cdr(lst));
  41. }
  42.  
  43. template<class T>
  44. void print_lst(T lst) {
  45. std::cout << "(";
  46. print_lst_re(lst);
  47. }
  48.  
  49. int main() {
  50. auto lst1 = append(list(1, 2), list(3, 4));
  51. static_assert(std::is_same<
  52. decltype(lst1),
  53. pair<int,
  54. pair<int,
  55. pair<int,
  56. pair<int,
  57. nil> > > > >::value);
  58. print_lst(lst1);
  59. std::cout << std::endl;
  60. auto lst2 = list(1, list(2, 3), list("hello", list("0.1", 0.1), "goodbye"));
  61. print_lst(lst2);
  62. static_assert(std::is_same<
  63. decltype(lst2),
  64. pair<int,
  65. pair<pair<int,
  66. pair<int,
  67. nil> >,
  68. pair<pair<const char*,
  69. pair<pair<const char*,
  70. pair<double,
  71. nil> >,
  72. pair<const char *,
  73. nil> > >,
  74. nil> > > >::value);
  75. }
Success #stdin #stdout 0.01s 5528KB
stdin
Standard input is empty
stdout
(1 2 3 4)
(1 (2 3) (hello (0.1 0.1) goodbye))