TGViewer
Just code IT Just code IT @justcodeit_channel · 1.32K subscribers
Post #63 2.01K
Метапрограммирование в стандартном C

Препроцессор языка C, конечно, не полон по Тьюрингу, но позволяет выполнять достаточно сложные вычисления, пользуясь моделями, основанными на CPS (continuation passing style). Количество подстановок макросов, доступных для программиста, лимитировано, но достаточно для большинства практических нужд, например для реализации кодогенераторов.

Известны случаи, когда на основе препроцессора создавали интерпретаторы LISP-подобных языков. Но в большинстве случаев это были не законченные инструменты для задач метапрограммирования, а скорее упражнения в написании незаурядного кода, достигающего лимитов языка программирования.

Бывают и практичные исключения, например Metalang99, который позволяет выполнять несложные вычисления и операции со списками на стадии препроцессирования. У Metalang99 есть вполне прагматичное применение: на его основе реализована библиотека Datatype99, привносящая в C99 полноценные алгебраические типы данных с привычным деконструирующим оператором match, совсем как в OCaml и Haskell.

#digest
  • 👍 3
More from @justcodeit_channel
  1. Aug 1, 20243D ландшафт в 256 байт Существуют разные виды intro — небольших динамических сцен, генерир…
  2. Jul 17, 2024Практическое погружение в метакомпиляторы Практически у каждого из наших читателей с образ…
  3. Jul 3, 2024Как создаются 64 intro Уверены, многие наши читатели слышали про демосцену — вид цифрового…
  4. Jun 14, 2024Создание программы 3D моделирования за неделю Недавно обнаружили на просторах сети занимат…
  5. May 28, 2024VPN, созданный по принципам Secure-by-design Много кто пишет про подход SbD (Secure-by-des…
  6. Apr 24, 2024Наследие Никлауса Вирта Как известно, 1 января 2024 года не стало Никлауса Вирта (Niklaus…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →