ФлеймФорумПрограммирование

Выпрямление императивного кода (3 стр)

Страницы: 1 2 3 4 59 Следующая »
#30
11:07, 1 мая 2021

=A=L=X=
> |> _sum .>

Меня осенило - а ведь это по сути похоже на обычный сишный оператор присваивания! Только в данном случае правоассоциативный и вдобавок включающий в себя инициализацию. Сишный оператор присваивания тоже ведь по факту не только сохраняет значение в переменной, но и возвращает это значение дальше. Только у него это "дальше" находится слева, к сожалению :)

#31
11:24, 1 мая 2021

Dmitry_Milk
> в первопосте было раскритиковано введение промежуточных переменных в
> императивном коде - но ведь они по факту за кулисами ничего не меняют

Тут речь была не про эффективность машинного кода, а про легкочитаемость и лаконичность конструкции. Когда вводим кучу промежуточных переменных на каждом шаге чтобы линеаризировать выражение мы насыщаем код возможно ненужными сущностями на которые не нужно даже в идеале отвлекаться - помнить их имена или даже выдумывать их.
Но вот там где введённое имя только напротив - сократит количество кода и сущностей (не нужно повторять (str1+str2) два раза в выражении) - это только в плюс. Поэтому да, operator |> довольно разумно выглядит там где он уместен.
Что забавно - его можно употреблять в любых выражения вообще в отрыве от цепочечных вызовов:

func( (a + b) / 2 |> avg, avg ); // просто реюзаем выражение
#32
11:36, 1 мая 2021

=A=L=X=
> Что забавно - его можно употреблять в любых выражения вообще в отрыве от
> цепочечных вызовов

А как далеко распространять область видимости в таком случае? С цепочечным вызовом понятно, а тут однозначно не видно определителей области видимости. Точкозапятая?

#33
11:48, 1 мая 2021

А оператор => свободен? Мне кажется, что такой нагляднее выглядит в качестве "назначателя". Наличие знака равенства в его составе интуитивно подсказывает сишникам о том, что происходит "присваивание", но стрелочка указывает, что значение уходит не налево, а направо. А сама конструкция X => Y имеет значение, и это значение X.

(a + b) / 2 => avg .> func(_$, avg)

#34
11:57, 1 мая 2021

Dmitry_Milk
> А как далеко распространять область видимости в таком случае?

Ну да, это дискуссионный вопрос. Мне кажется логичным будет существование идентификатора до конца текущего забыл-как-называется - до ; после которой начинается следующий оператор/выражение в sequence point или как то так. Т.е., если не ошибаюсь, ровно то как живут r-value всякие.

> А оператор => свободен?

Меня он смущает своей идеологической похожестью на >=. Имхо можно перепутать и какое то время втыкать не понимая что тут происходит.

#35
12:30, 1 мая 2021

Всё-таки такая запись мне нравится всё больше и больше.
Нередко использую мин-макс для задания лимитов переменной:

max( 10, min( x, 20 ) )

но в синтаксисе с .> оно и прямолинейнее и визуально проще воспринимается:

x .> max( 10 ) .> min( 20 )
#36
12:54, 1 мая 2021

=A=L=X=
> Кто первый в очереди на имплементацию в своём ЯВУ?

let v = cool_table
  .iter()
  .collect_vec()
  .tap_mut(|v| v.push("ololo"));
#37
13:53, 1 мая 2021

1 frag / 2 deaths

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

#38
13:59, 1 мая 2021

=A=L=X=
> что не есть сабж

Наверное имелся в виду метод tap. В некоторых языках такой метод бывает у объектов, типа "засунь объект в качестве параметра в переданное замыкание". Типа универсальный способ реализовать цепочку.

#39
14:07, 1 мая 2021

Dmitry_Milk
> засунь объект в качестве параметра в переданное замыкание

Ммм, не могу распарсить что тут имеется ввиду.
Выглядит как просто метод принимающий лямбду.
P.S.
Да и самое начало "let v =..." это уже намекает что это не сабж совсем. Сабж как раз прежде всего про выражение в чистом виде.

#40
14:44, 1 мая 2021

=A=L=X=
> Без пояснений это выглядит как цепочечные вызовы методов, что не есть сабж.
tap_mut это и есть хрень, которая позволяет в цепочку воткнуть действие, не являющееся методом
И она доступна для любого типа, потому что ржавый позволяет левые трейты приделывать к чужим типам.

=A=L=X=
> Да и самое начало "let v =..." это уже намекает что это не сабж совсем. Сабж
> как раз прежде всего про выражение в чистом виде.
Результат этой фигни можешь не засовывать в переменную, можно передать как аргумент

#41
14:55, 1 мая 2021

1 frag / 2 deaths
> tap_mut это и есть хрень, которая позволяет в цепочку воткнуть действие, не
> являющееся методом

Сабж про то чтобы вызвать функцию (а точнее любой callabee) взяв один из параметров слева, а не справа от имени функции.
То что это выглядит внешне как цепочечный вызов методов - это дань совместимости со старым кодом, а не цель.
На деле тут нет методов.
Да и цель чтобы это выглядело красиво, а не вот это вот в духе раста совершенно.

#42
14:57, 1 мая 2021

=A=L=X=
> Сабж про то чтобы вызвать функцию (а точнее любой callabee) взяв один из
> параметров слева, а не справа от имени функции.
Дык мы и взяли любой калаби (то есть лямбду), при этом вставив её в цепочку при помощи тапа.

=A=L=X=
> Да и цель чтобы это выглядело красиво, а не вот это вот в духе раста
> совершенно.
ТЗ выполнено, идите нафиг.

#43
15:12, 1 мая 2021

1 frag / 2 deaths
> Дык мы и взяли любой калаби (то есть лямбду), при этом вставив её в цепочку при
> помощи тапа.

А тип передаваемый по цепочке дальше она может сменить, кстати?

> ТЗ выполнено, идите нафиг.

ТЗ например такое:

x .> max( 10 ) .> min( 20 )

где x это целое число.
Как это будет выглядеть уже интересно?
Хотя, кстати, если в расте трейты можно приделывать к чему угодно - то это и будет нормальным решением.

#44
15:37, 1 мая 2021

=A=L=X=
> если в расте трейты можно приделывать к чему угодно - то это и будет нормальным
> решением

Не совсем. Там есть "неудобное" ограничение - нельзя для типов из других модулей имплементировать трейты из других модулей. То есть либо сам тип, либо сам трейт (не имплементация) должны быть объявлены в текущем модуле.

Страницы: 1 2 3 4 59 Следующая »
ФлеймФорумПрограммирование