=A=L=X=
> x .> max( 10 ) .> min( 20 )
Что-то такое
x.tap(|v| max(v,10)).tap(|v| min(v, 20))
компилятора под рукой нет
1 frag / 2 deaths
> ТЗ выполнено, идите нафиг
Неточно выполнено. Многа букав. В первопосте в идеальном случае всего лишь дувухсимвольный оператор, а тут сверх самого внутреннего вызова - слово tap, скобки для лямбды, заголовок лямбды с дополнительным именем переменной (то есть имя переменной как минимум два раза повторится - в параметрах и в теле). Вот если как-то поколдовать с макросами - то может быть можно получить уже что-то более приемлемое, типа ch! { x .> max( 10 ) .> min( 20 ) }
1 frag / 2 deaths
> компилятора под рукой нет
Не благодари: https://play.rust-lang.org/
=A=L=X=, а как насчет приоритетов операций? И что вообще из себя синтаксически должен представлять оператор .> ? То есть, подразумевается, что после оператора - только строго вызов функции? Или любое выражение? Если любое выражение - как должны сочетаться приоритеты операций слева от .> и справа от него?
Dmitry_Milk
> =A=L=X=, а как насчет приоритетов операций?
Я писал на первой еще странице - чтобы быть хорошо совместимым с цепочечным вызовом методов эти операторы должны быть с таким же приоритетом как и operator.().
Это довольно высокий приоритет
Сам оператор - это всего лишь переупорядочиватель синтаксического дерева, поэтому да, справа от него только callable-объект, причём именно в лексике совершения вызова с опущенным одним аргументом.
=A=L=X=
> Сам оператор - это всего лишь переупорядочиватель синтаксического дерева,
> поэтому да, справа от него только callable-объект, причём именно в лексике
> совершения вызова с опущенным одним аргументом.
a .> b a .> b() a .> b( _$)
Это одно и то же или разные конструкции?
Delfigamer
> Это одно и то же или разные конструкции?
Первое - illegal, b это не вызов callable. Второе и третье одинаково.
=A=L=X=
> ... buf.>strcpy( str1 ).>strcat( str2 ) ...
https://dascript.org/doc/reference/language/functions.html#oop-style-calls - по идее оно
Vlad2001_MFS
> https://dascript.org/doc/reference/language/functions.html#oop-style-calls - по
> идее оно
Да. Хотя я бы ни в коем случае не называл это "ООП-стайл", т.к. давно и упорно отстаиваю идею что такое ООП и их "ооп-стайл" как раз еще раз доказывает что ООП никакого отношения к синтаксическому сахару "первый аргумент слева - остальные справа" не имеет.
Я тут подумал-подумал и решил, что использование |> предложенное мною выше как создание псевдонима для выражения слева нехорошо.
Во первых, как видно, использование |> как то что я предложил как .> становится стандартом де-факто. Поэтому лучше его не занимать и иметь возможность переобуться.
Во вторых в символе | нет ничего что намекало бы на суть того что происходит - создаётся псевдоним.
Поэтому я думаю лучшим выбором будет оператор &>
Он как бы во первых выглядит Тамарой-парой к |>, а во вторых символ & как уже употребляющийся для ссылок и разыменований указателей намекает на то, что создаётся что-то в этом духе же.
=A=L=X=
А можешь для туповатого объяснить, чем вот этоx .> max(
лучше такого
x.max(10).min( 20)
?
Понял.
Vlad2001_MFS
> Понял.
Я не понял. Чем же это лучше, чем если подключить микс-ин и сделать то же самое через точку?
=A=L=X=
> (str1 + str2).{_sum}>
> substr(0, 1).>
> replace(_sum, _$, "")
О, я придумал, что тут тебе нужно - это лямбда.
(str1 + str2) & \sum -> sum & substr 0 1 & flip (replace sum) ""
Delfigamer
> О, я придумал, что тут тебе нужно - это лямбда
Спасибо хоть, что не монадический сахар (хотя, конечно, он как раз поближе по смыслу к тому, что должно было получиться в результате добавки #24 к первопосту, то есть цепочка лямбд с возможным внедрением значений из промежуточных связок).
Delfigamer
> Я не понял. Чем же это лучше, чем если подключить микс-ин и сделать то же самое
> через точку?
Если в языке:
а) всё можно превратить в объект и писать через точку (в С++ не так, в Java превращение int в Integer несёт пенальти)
б) есть миксины (в С++/Java не так)
в) их можно применять ко всему угодно откуда угодно (сам не знаю, но выше написали, что в Rust это не так)
то действительно ценность сабжа сильно снижена
Но если взять язык типа С++ или Java, то реализация сабжа будет круче миксинов потому что:
а) с помощью сабжа можно реализовать миксины
б) сабж спокойно работает с любыми типами - и примитивными и объектными - без пенальти
в) сабж спокойно проглатывает в себя любые уже существующие функции и вообще callable-объекты (пример с min/max), т.е. над уже существующими вещами не надо писать никаких миксиновых обёрток.
еще один пример был в первопосте: дряхлый как унитаз советской здравницы на источнике сероводородных минеральных вод stdlib можно намного более красиво переписывать как buf .> strcpy( "abc" ) .> strcat( "def" );
т.е. это вот те самые функции из 70-х годов прошлого века - а как похорошели при Собянине!
а вот миксины тут просто некуда воткнуть.
г) в предложении сабжа есть еще механизм &> (причём его можно рассматривать отдельно от |>) которого в миксинах нет, хотя т.к. он не завязан на конкретно |>, то его можно скрестить и с миксинами
вроде всё.
Delfigamer
> О, я придумал, что тут тебе нужно - это лямбда.
Лямбду в .> можно запихать без проблем как и любой callable - by design. Это вообще не вопрос.