LINUX.ORG.RU

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

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


1

6

Привет, ЛОР!

В принципе, я считаю, 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)
Ответ на: комментарий от X512

Линукс – говнокод?

Если сравнить с реализацией из queue.h, то Linux проигрывает в типизированности, поскольку все есть list_head.

tinykey
()
Ответ на: комментарий от X512

так мне чего смотреть-то? во-первых, я их видела. я с ними работала. но дело не в этом, а в том, что подобные задачки - написание списков, деревьев и прочего - это уровень изучения Си для начинающих, вроде заданий на проверку знаний в книжках типа K&R. и если у нынешних школотронов совсем плохо с головой и они не умеют думать, то это плохой знак. если они совсем нихрена не понимают даже самые основы языка, то лучше им не заниматься сишкой вообще.

а результаты этой глупости повсюду: запоротый нубами код разных проектов. судя по всему, нубы уже и до кернела добрались. и вот там теперь код компилится долго и распухает, как пишут выше в треде. и это нифига не смешно. это не проблемы сишки, не проблемы компиляторов, это проблемы в головах. а это хуже.

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

Из-за того, что ты напрочь отказываешься ставить заглавные буквы — кстати, почему? — мне всё время кажется, что ты злобно цедишь свои комменты сквозь зубы в мою сторону, яростно брызгая слюной. Ничего не могу поделать, но такой образ твоей персоны у меня сложился.

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

а результаты этой глупости повсюду: запоротый нубами код разных проектов. судя по всему, нубы уже и до кернела добрались. и вот там теперь код компилится долго и распухает, как пишут выше в треде. и это нифига не смешно. это не проблемы сишки, не проблемы компиляторов, это проблемы в головах. а это хуже.

По ссылке изменения были сделаны в ядре 2.6.32. Нубы-попаданцы?

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

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

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

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

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

Код для изучения Си и код в продакшене отличаются. В продакшене используют макросы вместо написания списков каждый раз заново.

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

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

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

Главный эксперт ЛОРа по культуре не знает (или саботирует) правила русского языка. Так и запишем.

Пункт 5.5 правил форума:

Преднамеренное искажение слов, замена букв на похожие по написанию символы и буквы других языков. Преднамеренное нарушение правил русского языка. Преднамеренность определяется модераторами отдельно в каждом случае, исходя из количества искажённых слов (а также знаков препинания и пробелов) и регулярности искажений в других темах и комментариях того же автора.

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

ну, мне тут школоло заявляет, что макросы «нужны» для всего. я лишь пытаюсь научить школоту писать на си и думать головой. никаких провокаций.

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

можешь упороться своим буквоедством. мне на него насрать.

и да, к культуре буквоедство и моралофагия не имеют никакого отношения.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)

Начали с метапрограммирования, а подожгли ирон_баг.

Давно так не ржал!

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

Это конечно не мое дело, но ты излишне строг с ней.

Мы лишаемся эталонного образчика безапелляционной незамутненности в естественной среде обитания.

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

отнюдь нет. я совершенно спокойно сижу, завернувшись в плед, попивая чай и вовсе и не думаю ни на что злиться. нет ни малейшей причины.

Это вообще не важно. Твои комменты выглядят вот ровно так со стороны. Сорян, ничего не могу поделать.

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

мне на него насрать.

А мне – нет. Отдохни-ка месяцок.

Ну вот нахера? У тебя тоже чешется? Совсем делать нечего? Мы тут дискуссию развернули, а ты всё испортил.

hateyoufeel ★★★★★
() автор топика

Требую продолжения!!111

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

Аа, было… Но ведь утюг нельзя класть в холодильник!

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

В чём интерес вести дискуссию с ней? Какой‐нибудь Царь, например, писал (и пишет, но уже не здесь), конечно, ерунду, но зато смешно и хлёстко, в своём неповторимом стиле, а тут сплошной поток полуграмотного (в соседней теме она путала ANSI‐последовательности и юникод) брюзжания.

BerlinFall
()
Ответ на: комментарий от BerlinFall

В чём интерес вести дискуссию с ней?

Она – отличный пример поехавшего на сишечке шизоида, у которого всё остальное не то и не так, да и сама сишечка, как тут в треде выяснилось, заполнена предателями, ведущий проект на сишечке – люнексовое ведро – пишут школотроны и быдлокодеры, а компиляторы полны угрей. Вот покажешь кому-нибудь такого пациента, так человек сразу побежит Rust изучать! Разве не круто?

Плюс, я всё хочу развести её на исходники (на сиськи – не хочу).

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

ты чего к кернелу привязался?

Ну ты сама начала:

а результаты этой глупости повсюду: запоротый нубами код разных проектов. судя по всему, нубы уже и до кернела добрались.

Зачем ты начала про это мне неведомо. Вернемся: изменения в макросы min/max сделаны в 2001 году, ещё башни WTC стояли. О каких «нубах» которые куда-то «проникли» и начала «запарывать» ты говоришь? Это произошло почти 25 лет назад.

tinykey
()
Ответ на: комментарий от tinykey

Зачем ты начала про это мне неведомо.

поздняк метать, ей мороженку выписали для охлаждения попы.

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

В чём интерес вести дискуссию с ней?

Интерес в том, чтобы вызвать у нее в голове сегфолт её же разрешенными инструкциями утюга.

Это выполнимо, хотя и не просто.

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

Когда у тебя в руках молоток все кажется шурупами.

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

Вот представь себе кодогенератор, который бы генерировал

Это не удобно. Следущий логичный шаг — взять «кодогенератор», являющийся более мощным языком чем Си.. Ну типа Zig или что-то такое.

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

нубы уже и до кернела добрались.

До ядра корпорасты добрались. Посмотри, сколько там автосгенерированный булшит от AMD места занимает в исходниках.

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

Посмотри, сколько там автосгенерированный булшит от AMD места занимает в исходниках.

Торовалтос сам виноват. Дрова могли бы быть внешними модулями, но stable-api-nonsense.rst.

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

Там ничего интересного. Тупо тестовые задания и форки разных проектов с фиксами для musl. Я хочу самую мякотку пощупать, а не это.

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

То есть ты искренне считаешь, что какой-то красивый код намеренно спрятан, а всё опубликованное это просто ширма?

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

Нет. Я хочу видеть код, который она пишет за деньги. Хотя бы примеры оного. Ну, если она и правда программистом работает.

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

Я почти минуту думал, писать или нет. И решил всё же написать.

Ты же не можешь не понимать, как это выглядит с другой стороны. Вот сидишь ты такой довольный, строчишь на форуме. И тут у тебя какой-то аноним запрашивает код, который ты пишешь по работе; скорее всего закрытый код. Разглашение этого кода является нарушением прав третьей стороны просто по умолчанию, потому что у тебя остаётся только быть право считаться автором кода. Все остальные права переходят к работодателю. Иногда это даже явно прописывается в договоре. И ты конечно же сразу же нарушаешь взятые на себя обязательства и публикуешь код, чтобы… Чтобы что? Доказать что-то анониму из интернета?

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

Там ничего интересного. Тупо тестовые задания

Как сказать, как сказать. Мне достаточно было заглянуть в код её тестового задания для stream labs. Чего-то подобного и ожидал от человека, заявлявшего об отличном знании C++ и опыте разработки невероятных размеров.

Я хочу самую мякотку пощупать, а не это.

Ни в коем случае не являюсь фанатом IronBug, скорее даже наоборот. Но что, если она обратиться к вам с точно таким же встречным предложением? Покажите свой код?

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

У нас еще остался(-лась) китайский иронбуг

cdtemp
()
Ответ на: комментарий от eao197

Мне достаточно было заглянуть в код её тестового задания для stream labs. Чего-то подобного и ожидал от человека, заявлявшего об отличном знании C++ и опыте разработки невероятных размеров.

Жду твоей критики этого кода!

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

Жду твоей критики этого кода!

Да там что-нибудь говорить – только портить.

https://git.ironbug.org/stream_labs_test/tree/ring_buffer.h:

#include <chrono>

// default ring buffer size
#define DEFAULT_BUFFER_SIZE	1024

// default buffer put timeout, in nanoseconds
#define DEFAULT_TIMEOUT_PUT	10000

// default buffer get timeout, in nanoseconds
#define DEFAULT_TIMEOUT_GET	10000

template <typename T>
class ring_buffer
{
private:
	size_t			_size;
	T			*_buf;
	volatile size_t		_head;
	volatile size_t 	_tail;
...
	// try to put message in buffer, returns false on timeout
	bool put(T data, size_t timeout = DEFAULT_TIMEOUT_PUT);
	// try to get message from buffer, returns false on timeout
	bool get(T& result, size_t timeout = DEFAULT_TIMEOUT_GET);

define вместо констант в C++ном коде?

Зачем нужен volatile в многопоточности?

В каких единицах задается время в put/get? Вместо определенных define DEFAULT_TIMEOUT_PUT/GET лучше было бы использовать duration из chrono, тем более, что #include <chrono> сделан. Что-то вроде:

inline constexpr std::chrono::steady_clock::duration default_timeout_put{ std::chrono::nanoseconds{ 10000 } };

И затем:

	// try to put message in buffer, returns false on timeout
	bool put(T data, std::chrono::steady_clock::duration timeout
            = default_timeout_put);

https://git.ironbug.org/stream_labs_test/tree/ring_buffer.cpp

template <class T>
ring_buffer<T>::ring_buffer(size_t size)
	: _size(size+1), _head(0), _tail(0)
{
	_buf = new T [_size];
	if constexpr(std::is_scalar_v<T>) {
		memset(_buf, 0, _size*sizeof(T));
	}
}

Класс T, оказывается, должен быть default constructible. А если нет? И если я заказал начальный размер в 100500 элементов, зачем их все в конструкторе сразу создавать с дефолтными значениями?

template <class T>
ring_buffer<T>& ring_buffer<T>::operator =(const ring_buffer<T>& data)
{
	if (this != &data) {
		this->reset();
		_size = data._size;
		_buf = new T [_size];
		_head = data._head;
		_tail = data._tail;
		if constexpr(std::is_scalar_v<T>) {
			memcpy(_buf, data._buf, _size*sizeof(T));
		} else {
			for(size_t i=0; i<_size; i++) {
				_buf[i] = data._buf[i];
			}
		}
	}
	return *this;
}

Конструктор копирования не exception safe.

Но, главное, половина публичных методов (включая только что показанный конструктор копирования) не являются thread safe. И это в thread safe ring buffer-е.

И это только то, что бросается в глаза при поверхностном просмотре, даже не вчитываясь особо.

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

либо таки показать свой

Это сейчас к кому просьба была?

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

Но, главное, половина публичных методов (включая только что показанный конструктор копирования) не являются thread safe. И это в thread safe ring buffer-е.

Окей, принято.

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

Зря ты так.

От неё мы узнали про «пакеты HTTP», теперь что ядро Linux написано нубами, не знающими C-шечки. Тут ещё и про плюсы столько нового…

Merlin86
()
Ответ на: комментарий от dataman

Да и некогда, когда тут такое веселье.

Боюсь, вы убили это самое веселье когда забанили железную деву.

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