Кресты / Говнокод #22496 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
#include <iostream>

//
#define PROGRAM i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,o,s,i,o,i,i,i,i,i,i,i,s,s,s,o
//

template <char n, typename Ns>
struct Cons {
  static void print() {
    Ns::print();
    std::cout << n;
  }
};

struct Nil {
  static void print() {}
};

template <typename Ms, typename Ns> struct Append;

template <typename Ns>
struct Append<Nil, Ns> {
  typedef Ns String;
};

template <char m, typename Ms, typename Ns>
struct Append<Cons<m, Ms>, Ns> {
  typedef Append<Ms, Ns> Next;
  typedef Cons<m, typename Next::String> String;
};

#define INS(name, expr) \
  struct name { \
    template <int n, typename Out> struct Result { \
      static const int value = expr; \
      typedef Out Output; \
    }; \
  }

INS(i, n + 1);
INS(d, n - 1);
INS(s, n * n);

template <int n> struct DecimalLoop;

template <> struct DecimalLoop<0> {
  typedef Nil String;
};

template <int n> struct DecimalLoop {
  typedef DecimalLoop<n / 10> Next;
  typedef Cons<'0' + (n % 10), typename Next::String> String;
};

template <int n> struct ToDecimal;

template <> struct ToDecimal<0> {
  typedef Cons<'\n', Cons<'0', Nil>> String;
};

template <int n> struct ToDecimal {
  typedef Cons<'\n', typename DecimalLoop<n>::String> String;
};

struct o {
  template <int n, typename Out> struct Result {
    static const int value = n;
    typedef typename Append<typename ToDecimal<n>::String, Out>::String Output;
  };
};

template <int n> struct Wrap {
  static const int value = n < 0 || n == 256 ? 0 : n;
};

template <typename... Is> struct Seq;

template <typename I, typename... Is>
struct Seq<I, Is...> {
  template <int n, typename Out> struct Result {
    typedef typename I::template Result<n, Out> A;
    typedef typename Seq<Is...>::template Result<Wrap<A::value>::value, typename A::Output> B;
    typedef typename B::Output Output;
  };
};

template <> struct Seq<> {
  template <int n, typename Out> struct Result {
    typedef Out Output;
  };
};

int main() {
  Seq<PROGRAM>::Result<0, Nil>::Output::print();
}

Запостил: dm_fomenok dm_fomenok, (Updated )

Комментарии (30) RSS

    • Кто-то опять балуется с мета-погромированием. С виду это простой калькулятор, который умеет делать инкремент, декремент, возведение в квадрат и вывод результата в std::cout.
      Скука.
      Ответить
        • да, я как то про это же и подумал - транслятор бф в кресты. с constexpr строками или туплами? - интересно насколько быстро нагнется компилер.
          Ответить
      • а потом нубы читают такой код, и говорят что крестыговно, и идут писать на пхп
        Ответить
        • другими словами, кресты наконец таки достигли уровня перла?
          Ответить
          • Ещё нет. Осталось сделать так, чтобы линтер для плюсов принципиально невозможно было написать.
            Ответить
            • > Ещё нет

              Ещё есть культурный фактор: писать непонятный простым смертным код умеет каждый перловик, а крестовые мета-заклинания — только особо упоротые крестолюбы.
              Ответить
              • покажи простому смертному визитер с парой адаптеров, и попроси описать что там происходит. а я пока буду стоять в сторонке, посмеиватся и "красненьким разминаться."
                Ответить
                • Ну если человек читал банду четырех то поймет даже визитор и даже flyweight
                  Ответить
              • то-есть обычный код на C++ чистый и понятный, да?
                Ответить
                • Да. Обычный код на C++ называется "си с классами". Он чистый и понятный. А крестошаблоны придумали анскиллябры заедушные, потому что они не хотят думать о том, как работает процессор.
                  Ответить
                  • правильно-ли я понимаю что все проблемы сей++ в шаблонах и метапрограммировании?

                    Я довольно хорошо умею ObjectiveC. Это тоже си с классами (ну и всякой лабудой типа лямбд)
                    Значит-ли что я могу быть хорошим крестовиком?
                    Ответить
                    • > Я довольно хорошо умею ObjectiveC

                      Думаете, в C++ много разных конструкций и возможностей языка? Вы просто не видели ObjectiveC++...
                      Ответить
                      • А его проапгрейдили до с++14? А то с++14 будет пожирнее, чем с++03 + objc.
                        Ответить
                  • ц препроцессор - ацтой. что у лиспа что у асмов - препроцы на порядок лучше, круче, удобнее, безопастнее и полезнее.
                    Ответить
                    • ну у асмов он не от хорошей жизни

                      Асмовец сойдет с ума реализовывать руками колконвешены в каждой процедуре, да и циклы там тоже унылы

                      куда без макросов?
                      Ответить
                • > то-есть обычный код на C++ чистый и понятный

                  Не существует абсолютно "чистого и понятного", чистоту и понятность разные люди могут понимать по-разному. Опять же, довольно очевидно, что ясность и понятность определяется не столько языком, сколько программистом, который пишет код. Я даже не утверждаю, что C++ является хорошим, понятным и удобным языком для написания программ.

                  На мой взгляд, в плюсах в среднем, проще понять, "что" происходит, чем в perl. Понять, "зачем" это происходит, обычно трудно независимо от языка.

                  P.S. Меня недавно спросили, какой из опен-сорсных проектов можно почитать, чтобы посмотреть, как выглядит "хороший", "идиоматичный" плюсовый код. Честно говоря, я даже и не знаю, что ответить.
                  Ответить
                  • > P.S. Меня недавно спросили, какой из опен-сорсных проектов можно почитать, чтобы посмотреть, как выглядит "хороший", "идиоматичный" плюсовый код. Честно говоря, я даже и не знаю, что ответить.

                    а чем Qt и KDE не угодили? у них достаточно хороший стиль сырцов.
                    Ответить
                      • не, ну есть ку них пляска с метамагией, от неё никуда не денешься с таким функционалом.

                        У QtCreator'а хороший код
                        Ответить
                        • Думаю, речь была о том, что кутэ - это совсем не идиоматичные плюсы.
                          Ответить
              • Мета-заклинания нынче активно применяются в бусте и стандартной библиотеке, так что это печально, что средний крестушок эти заклинания не знает. Я не говорю, что их надо применять (скорее не надо), но знать свой язык стоит.
                Ответить
            • причем тут линтер то?...

              даже если линтер поймёт что ты написал, это еще не значит что ты сам понимаешь что ты написал.
              Ответить
              • Перловый код невозможно статически анализировать. Плюсовый вроде ещё можно.
                Ответить
                • перловый невозможно - не потому что синтакс сложный (к слову - синтакс у перла "относительно" простой (*)), а потому что нет доминирующего стиля программирования.

                  (*) парсер перла на бизоне сделан. 1+К строк. лексер сложнее и извращенее - но синтакс сам по себе на удивление детерминистический.
                  Ответить
                • а все потому что не нужно мочалкой забивать гвозди

                  перл нужен чтобы писать скрипты для парсинга логов, а люди хуячат на нем CRM и возмущаются что ах -- на перле тяжело писать сложную бизнеслогику или хайлоад на пол ляма юзеров
                  Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8