Няшная / Говнокод #27494 Ссылка на оригинал

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
/*
https://habr.com/ru/post/523688/

Так как мы работаем с макросистемой C/C++, то аналог функций — макрос, этой
абстракцией мы и будем пользоваться. Мы будем передавать идентификатор первого
рекурсивного макроса в следующий рекурсивный макрос, и тот, в свою очередь, по
мере завершения своего исполнения будет передавать поток исполнения в первый
рекурсивный макрос, так называемое продолжение. Нам также понадобиться терминальное
продолжение — ML99_PRIV_REC_STOP — оно будет являться продолжением, поставляющимся
в самый-самый первый рекурсивный макрос, ведь логично, что никуда, кроме как
закончить исполнение программы на данном месте, нам перепрыгивать не нужно. Жилка
двигателя рекурсии — это цепочка из макросов-раскрывателей следующего вида:
*/

#define ML99_PRIV_REC_0(choice, ...)    ML99_PRIV_REC_NEXT(1, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_1(choice, ...)    ML99_PRIV_REC_NEXT(2, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_2(choice, ...)    ML99_PRIV_REC_NEXT(3, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_3(choice, ...)    ML99_PRIV_REC_NEXT(4, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_4(choice, ...)    ML99_PRIV_REC_NEXT(5, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_5(choice, ...)    ML99_PRIV_REC_NEXT(6, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_6(choice, ...)    ML99_PRIV_REC_NEXT(7, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_7(choice, ...)    ML99_PRIV_REC_NEXT(8, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_8(choice, ...)    ML99_PRIV_REC_NEXT(9, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_9(choice, ...)    ML99_PRIV_REC_NEXT(10, choice)(__VA_ARGS__)
//...


//И так до 1023:

Интересно, этот чувак сидит на говнокоде?

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

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

  • Надо бы показать ему какой-нибудь LISP, чтобы он перестал херней маяться
    Ответить
  • ML99_PRIV_REC_EXPAND( \
            ML99_PRIV_REC_NEXT(0, choice)(__VA_ARGS__) \
        ))))))))))))))))


    какой ))))))))))))))))
    Ответить
  • Я думаю нет, иначе он бы подсмотрел приёмы из boost pp. Там всё-таки не копипастили тыщу шагов, а лупы очень долго могут работать.
    Ответить
    • З.Ы. А, судя по первой статье чел смотрел их, но хотел именно рекурсию... Ну х.з., ФВП тоже неплохо практические задачки решают, даже если труъ рекурсия недоступна.
      Ответить
    • Поскольку нормальная рекурсия в сишном препроцессоре невозможна (макрос не может раскрыть себя же), тут сделана кривая имитация этой рекурсии, через накопипащивания хуйни много раз.
      Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8