- *c++ *haskellТребуется по нашей роли в конференции, нашему affiliation, чужой роли и чужому affiliation, а также целевой роли, определить, можем ли мы целевого чувака перевести в целевую роль. Дико не хватает паттерн-матчинга из какого-нибудь хацкеля, поэтому я хочу нарисовать аналог на темплейтах —
template<MUCAffiliation ourAff, MUCRole ourRole, MUCAffiliation aff, MUCRole role, MUCRole targetRole>
class MayChangeRole;
И затем специализации для нужных вариантов комбинаций темплейтовых параметров.
Правда, блин, облом, это все в компил-тайме будет, какая пичаль :(
Ебаный С++.
Replies (112)
- @borman:Вариант "не выебываться и написать свич" это уже не модно, пичаль-пичаль.from codeee/Vacuum IM, 7 months ago
- @0xd34df00d:@borman Ты представляешь пиздец этого свича? Функция от пяти аргументов же, по пяти нужно селект делать.from web, 7 months ago, in reply to /4
- @borman:BTW, бывает еще C-style pattern matching для маленьких множеств — сделать битовую маску и разбирать случаи по ней.from codeee/Vacuum IM, 7 months ago
- @gelraen:@0xd34df00d не могу понять нахрена тут городить горы темплейтовfrom home, 7 months ago, in reply to /10
- @borman:@0xd34df00d Но это, срать-ебать, не АБСТРАКЦИЯ!from codeee/Vacuum IM, 7 months ago, in reply to /11
- @0xd34df00d:@gelraen Чтобы красивенько выбирать по параметрам и в наиболее явном и очевидном виде задавать соответствие.from web, 7 months ago, in reply to /12
- @gelraen:@0xd34df00d не выйдет. даже тут xmpp.org ад и содомияfrom home, 7 months ago, in reply to /16
- @borman:@0xd34df00d Напиши код с паттерн-матчингом, кстати, чтобы нам представлять себе масштаб бедствия.from codeee/Vacuum IM, 7 months ago, in reply to /16
- @0xd34df00d:@gelraen Я там и читал и пиздец видел.
Но в теплейтах это явно и няшно задается.from web, 7 months ago, in reply to /18 - @0xd34df00d:@O01eg Чтобы делать неактивными те экшны, действия которых не имеют смысла.from web, 7 months ago, in reply to /22
- @akapetryxa:from Pavilion, 7 months ago, in reply to /23
- @borman:@akapetryxa "слышу звон, да не знаю, где он"from codeee/Vacuum IM, 7 months ago, in reply to /25
- @akapetryxa:@borman задача на пересечение множеств решается математически, разве нет?from Pavilion, 7 months ago, in reply to /26
- @0xd34df00d:from web, 7 months ago, in reply to /19
- @borman:@akapetryxa Решаться решается, вопрос, как это записать кратко.from codeee/Vacuum IM, 7 months ago, in reply to /27
- @0xd34df00d:@akapetryxa Тут множеств дохуя, простые свитчи — хуита.from web, 7 months ago, in reply to /27
- @borman:@0xd34df00d Ты пока на один if наговнокодил, ты всю таблицу-то распиши. Хотя б на псевдокоде.from codeee/Vacuum IM, 7 months ago, in reply to /28
- @borman:@akapetryxa Если ты посмотришь, я это уже предлагал.from codeee/Vacuum IM, 7 months ago, in reply to /32
- @0xd34df00d:@borman Я ее руками заебусь на псевдокоде расписывать, да ну нафиг.
Тем более, в рантайме все равно нужную специализацию не выберешь.from web, 7 months ago, in reply to /31 - @O01eg:@0xd34df00d А зачем? Ты вроде как часть стандарта реализуешь.from Ψ+, 7 months ago, in reply to /34
- @borman:@0xd34df00d Я высрал кирпич, отправлю тебе орбитальной бомбардировкой. Ты тут ноешь о том, как неудобно и как тебе хотелось, чтобы было возможно (ибо было бы няшно), а написать няшно ты и не пробовал.from codeee/Vacuum IM, 7 months ago, in reply to /34
- @0xd34df00d:@O01eg Потому что мне нужно это в рантайме определять.from web, 7 months ago, in reply to /39
- @borman:@0xd34df00d Ты утверждаешь, будто паттерн-матчингом это будет няшно. Так возьми и напиши.from codeee/Vacuum IM, 7 months ago, in reply to /42
- @0xd34df00d:@borman Я утверждаю, что это будет не менее няшно произвольного другого варианта, ибо это прямая запись логики почти что и минимум лишней информации.from web, 7 months ago, in reply to /44
- @borman:@0xd34df00d Кто мешает написать тебе паттерн-матчинг на плюсцах ручками?from codeee/Vacuum IM, 7 months ago, in reply to /45
- @borman:@akapetryxa Это, тащемта, сервер-сайд фича.from codeee/Vacuum IM, 7 months ago, in reply to /47
- @0xd34df00d:@borman Тем, что это, гм, фича компилятора, и я сходу не соображу, как ее в рантайме сэмулировать без явного расписывания.from web, 7 months ago, in reply to /46
- @borman:@akapetryxa А, ну если оно тебе так надо...from codeee/Vacuum IM, 7 months ago, in reply to /52
- @0xd34df00d:@borman Твои варианты на плюсах?
Олсо, почему срать-ебать-говно? Няшно и мило, в стиле плюсов.from web, 7 months ago, in reply to /51 - @akapetryxa:@borman конечно... юзер должен НЕ иметь свободы там где не надоfrom Pavilion, 7 months ago, in reply to /53
- @0xd34df00d:@O01eg Тогда даже для таких вариантов, как MUCAdmin и MUCOwner, когда в любом случае True, надо описывать все остальные комбинации. Поэтому я и паттерн-матчинг хочу, потому что там есть _ в хацкеле и просто отсутствие явной специализации в плюсах.from web, 7 months ago, in reply to /60
- @0xd34df00d:@0xd34df00d А все остальные комбинации — это 775 вариантов для MayChangeRole и 1225 для MayChangeAffiliation.from web, 7 months ago, in reply to /61
- @borman:@0xd34df00d
{
{Aff::Any, Role::Participant, ...},
{Aff::Admin, Role::Moderator, ...}
...
}
Ты уверен, что специализация движка паттерн-матчинга на этот случай будет настолько длинной, что ты получишь профит от твоего синтаксического говна?from codeee/Vacuum IM, 7 months ago, in reply to /54 - @0xd34df00d:@borman Это явно не 775/1225 комбинаций, а, гм, на порядок меньше минимум.from web, 7 months ago, in reply to /63
- @0xd34df00d:@borman 5 вариантов aff, 3 варианта ролей.
5×3×5×3×3 вариантов для MayChangeRole.
5×3×5×3×5 вариантов для MayChangeAffiliation.from web, 7 months ago, in reply to /65 - @0xd34df00d:@borman Что паттерн-матчинг решает в данном случае над прямым тупым отображением из R×A×R×A×R → Bool, когда нужно все параметры задавать (как в случае массивов).from web, 7 months ago, in reply to /67
- @borman:@0xd34df00d Эмм, в массиве ты пишешь ровно то же, что и в любом паттерн-матчинге. На количество случаев это никак не влияет.from codeee/Vacuum IM, 7 months ago, in reply to /68
- @akapetryxa:@0xd34df00d ну совсем бредовые случаи исключаютсяfrom Pavilion, 7 months ago, in reply to /66
- @0xd34df00d:@borman Схуяли? В хаскель-нотации если писать, то там я могу написать
mayChange Admin = True
mayChange Owner = True
А в случае массивов мне тупо с точки зрения типов нужно перебирать все остальные переменные, блеать.from web, 7 months ago, in reply to /69 - @0xd34df00d:@0xd34df00d Сука, ебаный жуйк схавал ебаные знаки подчеркивания ><from web, 7 months ago, in reply to /71
- @borman:@0xd34df00d То есть правда, что ты расширяешь каждое перечисление ровно на один элемент (Any, который я тебе, кстати, в примере написал)?from codeee/Vacuum IM, 7 months ago, in reply to /71
- @0xd34df00d:@0xd34df00d Более того, компилятор хаскеля за меня проверит, покрывают ли мои матчинги все возможные варианты, и нет ли перекрытий.from web, 7 months ago, in reply to /72
- @O01eg:@0xd34df00d А я предлагал тебе написать личкрафты на хаскелеfrom Ψ+, 7 months ago, in reply to /74
- @0xd34df00d:@borman Но мне-то приходит не Any, и сравнивая Any с любым другим, я получаю False. Тут уже придется городить свой класс со своим перегруженным operator==, который для Any возвращает True.
Пиздец.from web, 7 months ago, in reply to /73 - @borman:@0xd34df00d У тебя хаскель головного мозга. Ты совсем охуел? Не для каждого случая надо рожать синтаксического монстрика.from codeee/Vacuum IM, 7 months ago, in reply to /76
- @0xd34df00d:@0xd34df00d Ну ладно, без класса, можно просто
bool operator== (Role r1, Role r2)
{
if (r1 == RAny || r2 == RAny)
return true;
return static_cast<int> (r1) == static_cast<int> (r2);
}from web, 7 months ago, in reply to /81 - @borman:@0xd34df00d if ((pat.role==Any || pat.role==item.role) && ...)from codeee/Vacuum IM, 7 months ago, in reply to /81
- @0xd34df00d:@borman И писать это везде? Да у тебя си головного мозга!from web, 7 months ago, in reply to /88
- @borman:@0xd34df00d Везде называется два места? Два места по не более-чем-пять-строчек (если правила в столбик выписывать)?from codeee/Vacuum IM, 7 months ago, in reply to /89
- @jtootf:паттерн-матчинг в ОО-языках принято делать через визитор; в большинстве случаев получается элегантнее свитчаfrom galois, 7 months ago
- @0xd34df00d:@borman Там их дохрена ваще, еще +2 роли, и еще больше вариантов. Лучше op перегрузить.from web, 7 months ago, in reply to /90
- @0xd34df00d:from web, 7 months ago, in reply to /91
- @borman:@0xd34df00d Хотя.. Если обвернуть это в макрос и забить на то, как оно будет внутри, получится вполне ок.from codeee/Vacuum IM, 7 months ago, in reply to /93
- @0xd34df00d:@jtootf ХЗ, я еще не придумал, как связать компил-тайм и рантайм нормально.from web, 7 months ago, in reply to /94
- @borman:@0xd34df00d Вот тебе в каф писать вот это вот:
template<MUCRole ourRole, MUCAffiliation aff, MUCRole role, MUCRole targetRole>
class MayChangeRole<...> { enum May { Result = 1 }; };
каждый раз?
Смысла эта конструкция не несет вообще. Любишь write-only код?from codeee/Vacuum IM, 7 months ago, in reply to /97 - @0xd34df00d:@borman Он-то как раз не write-only. Но все красиво и понятно.from web, 7 months ago, in reply to /98
- @borman:@0xd34df00d Я вижу кучу одинаковых темплейтов и сру кирпичами в поисках разницы.
ALLOW (MUCAdmin, _ourRole, _aff, _role, _targetRole);
ALLOW (MUCOwner, _ourRole, _aff, _role, _targetRole);
...
#undef ALLOW
Разве не понятнее?from codeee/Vacuum IM, 7 months ago, in reply to /99 - @0xd34df00d:@borman Ты аккуратнее, а то я не остановлюсь и заюзаю там где-нибудь Boost.PP.from web, 7 months ago, in reply to /102
- @borman:@0xd34df00d Да хоть какие-нибудь (имена вымышленные) Boost.Pattern + Boost.Tuple + Boost.Option заюзай.from codeee/Vacuum IM, 7 months ago, in reply to /103
- @akapetryxa:описать константы операций(так или иначе придётся) с битами требований(role(0..2), aff(3..7), и применимостью к (10+(0..7))) и голимую процедуру
Allowed(op, from, to): boolean;
var x: биты
включаем в x(from.role, from.aff, 10+to.role, 10+to.aff)
return x=op; всё :)
лень описать константы видимо :)
а если учесть иерархию, то выводы можно делать уже на уровне сравнения from с to :)
в лоб блять.from Pavilion, 7 months ago - @borman:@akapetryxa Ты что, там же без КЛАССОВ, ТЕМПЛЕЙТОВ и БУСТА!from codeee/Vacuum IM, 7 months ago, in reply to /107
- @Crazy-Owl:я сейчас блевану от того, какое говно ваш С++from 12998683571294662926322162, 7 months ago