LINUX.ORG.RU

CPS в нефункциональных ЯП

 ,


0

3

Вопрос тем, кто использует (изначально, преимущественно) не функциональные ЯП (C++, Java, Python). Как вы относитесь к CPS (Continuation-Passing Style)?

Для тех, кто не в курсе, например, есть некая операция, которая может завершиться удачно, а может с ошибкой, и вместо:

Result performOperation()
{
	return doOperation();
}

...

Result result = performOperation();

if (OK == result)
{
	std::cout << "OK" << std::endl;
}
else
{
	std::cout << "NOK" << std::endl;
}

Делается так:

void performOperation(Func onSuccess, Func onFailure)
{
	if (OK == doOperation())
	{
		onSuccess();
	}
	else
	{
		onFailure();
	}
}

...

performOperation([]() {
			std::cout << "OK" << std::endl;
		},
	         []() {
			std::cout << "NOK" << std::endl;
		});

Заранее пардон, если какие-то синтаксические ошибки, это чисто концептуальные примеры.

Даже предлагаю варианты ответов:

  1. Код с этими лямбдами сложно понимать, всегда объявляю все функции и методы по-старинке, вызываю явно в императивном стиле;

  2. Да, только так и делаю. Умные люди придумали ФП не просто так и гораздо нагляднее, не то, что у дурачков с императивной лапшой;

  3. Мне всё равно, могу/делаю и так, и сяк.

★★★★★

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

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

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

Исключения - нечитаемое говно

Если бы проблема была только в читаемости. Конкретно в C++ это ещё и огромные грабли в виде утечек памяти после рефакторинга, препятствие к оптимизации кода компилятором (типичный случай когда с -fno-exceptions какой-нибудь конструктор инлайнится, а с включенными уже нет), а ещё дикая головная боль при написании lock-free кода (нужно обмазываться смарт-пойнтерами там, где без исключений они были бы на хрен не нужны)

annulen ★★★★★
()