LINUX.ORG.RU

Метапрограммирование на препроцессоре

 , , , , санитары


1

7

Привет, ЛОР!

В принципе, я считаю, Rust больше не нужен. В Си наконец завезли не только сабж, но и реализацию алгебраических типов да с паттерн матчингом на нём! Ну и там ООП с интерфейсами, вот это вот всё. Примеры кода ниже.

Факториал в функциональном стиле:

#define factorial(n)          ML99_natMatch(n, v(factorial_))
#define factorial_Z_IMPL(...) v(1)
#define factorial_S_IMPL(n)   ML99_mul(ML99_inc(v(n)), factorial(v(n)))

ML99_ASSERT_EQ(factorial(v(4)), v(24));

Алгебраические типы:

#include <datatype99.h>

datatype(
    BinaryTree,
    (Leaf, int),
    (Node, BinaryTree *, int, BinaryTree *)
);

int sum(const BinaryTree *tree) {
    match(*tree) {
        of(Leaf, x) return *x;
        of(Node, lhs, x, rhs) return sum(*lhs) + *x + sum(*rhs);
    }

    return -1;
}

Интерфейсы (почти как трейты в Rust):

#include <interface99.h>

#include <stdio.h>

#define Shape_IFACE                      \
    vfunc( int, perim, const VSelf)      \
    vfunc(void, scale, VSelf, int factor)

interface(Shape);

typedef struct {
    int a, b;
} Rectangle;

int  Rectangle_perim(const VSelf) { /* ... */ }
void Rectangle_scale(VSelf, int factor) { /* ... */ }

impl(Shape, Rectangle);

typedef struct {
    int a, b, c;
} Triangle;

int  Triangle_perim(const VSelf) { /* ... */ }
void Triangle_scale(VSelf, int factor) { /* ... */ }

impl(Shape, Triangle);

void test(Shape shape) {
    printf("perim = %d\n", VCALL(shape, perim));
    VCALL(shape, scale, 5);
    printf("perim = %d\n", VCALL(shape, perim));
}

Я считаю, на этом все попытки убить Сишечку можно закапывать. Ссылка: https://github.com/hirrolot/metalang99

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от tinykey

Нужен, поэтому у std::atomic есть методы для случая volatile atomic :

Когда у человека нет мозгов, то это надолго.

eao197 ★★★★★
()
Ответ на: комментарий от i-rinat

Доказать что-то анониму

Почему anonymous'у? hateyoufeel'у же. Я не уверен, что это что-то поменяет в твоей остальной логике, но само по себе это действительно важное исправление.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Ты же не можешь не понимать, как это выглядит с другой стороны.

А это не важно, как это выглядит с её стороны. Багиня тут вещает, что она мегакрутой программист и пишет код без багов, поэтому мне и не только мне очень любопытно увидеть подтверждение этому.

Я вот сразу всем говорю, что я – тот ещё говнокодер, и мой код на Си и плюсцах в первых итерациях может течь или падать, а потом я обильно обмазываю его всякими анализами, санитайзерами и тестами, требую у коллег ревью, а сам внимательно перечитываю списки UB и доки к кумпелятору. Ну и по возможности пишу на хачкелерастах.

И ты конечно же сразу же нарушаешь взятые на себя обязательства и публикуешь код, чтобы… Чтобы что? Доказать что-то анониму из интернета?

Код, отправленный во впопенсорц, тоже подойдёт, если это что-то сложнее хелловорлда и замены констант под Musl. Потому что без доказательств вышеупомянутый гонор выглядит как тупое хвастовство. Это как если бы я тут заявлял, что у меня елдак в полметра, но фоточки с линейкой не показывал.

Кстати, у меня член полметра. Фоток не будет.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 3)
Ответ на: комментарий от i-rinat

А при чём тут фио? Это не единственный вариант имени. По мне так hateyoufeel@lor - вполне себе имя, ничем не хуже паспортного, и вполне может побуждать показать свой код чтобы похвастаться его качеством. А вот если я его вдруг встречу в виде фио - как раз не пойму кто это, и будет он для меня анонимом-прохожим, и зачем ему что-то показывать будет я не знаю. Это государству, когда оно обращает внимание на своих граждан, обязательно нужен именно их паспорт, а в обычной жизни всё может быть наоборот.

Другое дело, что если там NDA - то есть мотивы код не показывать, вне зависимости от того кто его спрашивает (ну кроме работодателя этот NDA выдавшего).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от shdown

Компилятор поместил buffer_ready = 1 (movl $0x1,…) до цикла for (rep stos …).

Точнее сказать, компилятор поместил цикл for ... после buffer_ready = 1. Очень коварно с его стороны, как по мне.

kawaii_neko ★★★★
()
Ответ на: комментарий от firkax

Другое дело, что если там NDA - то есть мотивы код не показывать, вне зависимости от того кто его спрашивает (ну кроме работодателя этот NDA выдавшего).

Да насрать на NDA 10 раз. Писечка в том, что Багиня проповедует существования каких-то там элитных программистов на Си, которые пишут код 100% без багов, дыр и UB, и даже причисляет себя к этой касте. Но ни свой код, ни какие-либо проекты этих программистов показывать или хотя бы называть наотрез отказывается.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от firkax

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

hateyoufeel ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.