LINUX.ORG.RU

Pattern matching для С++20

 


0

3

Посоны, что-то я упоролся по хардкору и стал писать паттерн матчинг для С++20. Пример:

variant<int, string> v = 1+2+3+5+7+11;
const auto pattern = pm::any_of(29, "42");

cout << *match(v,
  // match with pattern although pass (fall through). also create side effect in the middle of matching
  pass(pattern,            [&v] { cout << "How does this work?\n"; v = "42"; })
| pass(pattern,            [&v] { v = R"(I wonder ¯\_(ツ)_/¯)"; }) // match with pattern again, also pass
| with(pm::type(string{}), [&v] { return get<string>(v); }) // match with stored type
| with(__,                 []   { return R"(('・ω・'))"s; })) // catch-all condition (default)
<< endl;

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

Я так почитал пропозал для паттерн матчинга, вроде много чего из фичей есть кроме некоторых вещей, хотя я не до конца понимаю всё, что там написано и зачем оно там.

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

Ссылка: https://bitbucket.org/alekseyt/pm

Более полный пример использования: https://bitbucket.org/alekseyt/pm/src/master/examples/example.cpp

И там в тестах всякие guard(), within(), maybe() и т.д. Заранее спасибо.

Ответ на: комментарий от anonymous

В мусорном огрызке кое как сваянном из врованного свича этого нет.

Ты судишь о скаловском PM про одному единственному приведённому мною тривиальному примеру, или просто из своей больной головы выдумал, что в нём есть а чего нет?

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

Это клон. Не помню что это и зачем я склонировал. Мои собственные вещи почти все удалены, осталась совсем древняя тривиальщина, когда я ко- и контра-вариантность типов изучал.

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

Шлюха в очередной раз порвалась. Начал ссылаться на то, что эта помойная крыса что-то там где-то юзала. Какой-то pm, какой-то стандартный. Тебе, шлюха, сообщили. Что то, что ты блеял к теме не относятся. То, что «destructuring» можно писать в кейсе это не значит, что оно имеет отношение к pm и оно существует и вне pm. Оно имеет отношение по другой причине, о чём тебе и сообщили.

Кстати, шлюха, там ещё типы есть. Типы тоже отношение к pm имеют?

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

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

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

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

оно существует и вне pm

Не верно. Destructuring вне PM – это вырожденный случай PM с одним кейсом. Но для идиота, которому лишь бы побрызгать говном, это конечно будет новостью.

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

Поди вспомни. Были проблемы, что в простейшем примере с двумя модулями приходилось дважды makefile запускать, это вылечили ещё весной (единственный баг, упоминание о котором сохранилось в моих readme). Были какие-то накладки с modules vs namespaces, подробностей не помню. Зависимости генерил вызовом gcc -MMD, и там оно тоже иногда коряво отрабатывало (подробностей не помню). Но вся эта информация может быть уже устаревшей, т.к. последний раз пробовал в конце весны. Так что welcome сюда:

Вот, как только спросили поконкретнее, так сразу и началось:

Поди вспомни

подробностей не помню

подробностей не помню x2

На тебе еще на будущее:

Не знаю

Запамятовал

Старый я уже стал

Совсем из головы вылетело

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

я знаю как оно работает и что оно может.

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

Кстати, шлюха почему-то не может родить примера другого.

Могу. Но не имею желания, повторюсь, метать бисер перед свиньёй.

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

На тебе еще на будущее:

Ага, спасибо. А что ж ты не предложил до кучи и свои собственные стандартные обороты – пёрнуть в лужу в одну строчку и требовать от собеседника долго опровергать твой идиотский пердёж?

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

Destructuring вне PM – это вырожденный случай PM с одним кейсом.

Нет, шлюха. К тому же ты обгадилась. Если сам destructuring это pm, то значит этот другой pm, который не имеет отношения к теме. Потому как один pm не может иметь отношение к другому pm, не может быть его составной частью. Целое не может быть частью целого.

К тому же, шлюха, это не pm. Там нет никакого match, говно. Там есть разложение агрегата.

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

Если сам destructuring это pm, то значит этот другой pm, который не имеет отношения к теме.

Бедняга, запутался в трёх соснах двух PM-ах. Крутой профи, ничего не скажешь.

Там нет никакого match, говно.

Есть. Там есть неявная ветка, бросающая исключение если destructuring не удался (несоответствие типа и т.д.).

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

Ругань в устах склочного идиота – это лучшая похвала. Спасибо.

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

Бедняга, запутался в трёх соснах двух PM-ах. Крутой профи, ничего не скажешь.

Как же это бездарное говно игнорирует неудобное. У тебя проблема, логическая, падаль. У тебя pm является частью pm, что невозможно. Целое не может быть частью целого. Если pm без pm не pm, то первый pm то без pm. В школу, говно.

Есть.

Нет, шлюха.

Там есть неявная ветка, бросающая исключение если destructuring не удался (несоответствие типа и т.д.).

Нет, шлюха, у тебя проблемы с методичкой. Если несоответствие типа - это pm, то присваивание pm, вызов функции pm и что угодно, что триггерит тайп-еррор - это pm, потому как эта ветка есть всегда, в любой конструкции. Таким образом всё является pm.

Поэтому я всегда говорю. Идиот идиот во всём. Если бездарная шлюха не может в очевидное - она бездарная шлюха и других вариантов быть не может.

Вот там у шлюхи и pm зависящий от pm существует одновременно с pm не зависящим от pm, когда как pm у шлюхи определяется через эту зависимость, вернее её наличии.

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

(зевает) Я б нашёл слова самого Одерски про вырожденный PM, но лень, да и смысла никакого. Ты ж у нас самый умный. :) Бомж.

dimgel ★★★★★
()

Царь, я тут недавно вспомнил, что не заходил в твой блог уже несколько месяцев, думал, сейчас как обмажусь контеном для пацанов, которого там, наверное уже поднакопилось, а там – ничего :( Все нормально там в C-царстве, в C++-государстве?

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

Спасибо, проиграл.

С каким счетом?

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

Бомжу некогда кодить и блог вести, он других обсирает. Это очень ответственное и ресурсоёмкое занятие.

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

Ну т.е. показать контр-пример ты не можешь, но блеять о нём ты можешь? Если ты метать ничего не собиралась, то зачем ты блеешь?

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

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

Это твоя базовая обязанность - отвечать за свой кукаретинг.

Это ты зеркалу будешь рассказывать, в первую очередь. А затем уж остальным.

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

Нет, не нормально. Я опять пропал. А С++-государство в говне. В этом основная причина. На этом мусоре писать невозможно, шланг сдох. Тулинг сдох. Поддержки С++-20 даже базовой я не дождался, хотя должна была быть ещё год назад.

Поэтому С++ откладывается до лучших времён, когда завезут С++20 и причешут рефлексию.

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

Поэтому сейчас я в свободное время занимаюсь своим языком, но его не так много. Будет контент по нему, а по С++ - ждём пока завезут фичи.

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

Но скорее всего это гвоно уже не спасти.

Гыгы. Зато сколько вони и переходов на личности, когда другие обсирают плюсы. Это называется раздвоение личности. Ну или – лживое склочное лицемерное говно.

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

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

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

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

Если я говорю говно, то я знаю что говно, где говно и почему и могу это доказать.

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

dimgel ★★★★★
()

Pattern matching это оверинжиниринг уровня мемов. Он нужен только в особо узкоспецифических вещах да и то с натяжкой.

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

Pattern matching это оверинжиниринг

-1.

уровня мемов.

-1.

Он нужен только в особо узкоспецифических вещах

+1.

да и то с натяжкой.

-1.

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

Он нужен только в особо узкоспецифических вещах

Хотя даже здесь -1. Всё зависит от стандартной либы. Например, если скаловские контейнеры.find() возвращают Optional[T], то матчить частенько удобнее, компактнее и читабельнее, чем пара .empty() + .get().

UPD. И надёжнее (в смысле менее error-prone).

UPD2. И специально для бабалоба-Бомжа, пример! С destructuring! :)

blablabla.find(...) match {
   case Some(x) => ...   // тип x выводится, хотя можно и задать
   case None => ...
}
dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 2)
Ответ на: комментарий от dimgel

то матчить частенько удобнее, компактнее и читабельнее

Нет. Матч говно для бездарных плебеев. Читаемость этого говна нулепая, потому как в 80% случаев там будет исключение. В 80% из остальных 20% случаев там нужна одна ветка.

UPD2. И специально для бабалоба-Бомжа, пример! С destructuring! :)

Ты мне, шлюха, когда пример то покажешь? Зачем ты высрала кому-то опять хелвордистое говно, чтобы потому блеять «ну то пример просто простой»? А ну да, ты же нулёвый мусор птушный, других примеров ты не знаешь. Ещё не рассказали. Да и не расскажут.

С destructuring ты уже обгадился и так и не ответил.

тип x выводится, хотя можно и задать

Нет, не выводится. В этом говне нет полиморфизма и Some не полиморфен по T. Выводить там нечего. Some для любого T одинаков.

Запомни, дошколёнок, это свойство любой системы типов говна. Полиморфизма там нет. И именно потому, что его нет - ты пишешь Some.

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

Читаемость этого говна нулепая,

Идиот.

потому как в 80% случаев там будет исключение.

4.2.

В 80% из остальных 20% случаев там нужна одна ветка.

4.2.

Нет, не выводится.

Идиот.

В этом говне нет полиморфизма и Some не полиморфен по T.

Идиот. Уж нагуглить «scala api some» мог бы, прежде чем херню нести.

Выводить там нечего.

Идиот.

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

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

Полиморфизма там нет.

По этому пункту – тоже идиот.

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

Т.е. шлюха ничего ответить не смогла.

Идиот. Уж нагуглить «scala api some» мог бы, прежде чем херню нести.

Бегом, шлюха, побежала доказывать его полиморфность. Живо, падаль.

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

Говно, ты не в том положении, чтобы мне что-то кукарекать. Ты внчале ответишь за своё балабольство, а уже после будешь кукарекать. Поэтому, говно, бегом побежало отвечать.

Исполнять и то и то, шавка.

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

Ну как и ожидалось. Даже доку по простенькому классу понять не осилил, зато утверждениями «космической глупости» так и сыпет – по языку, о котором понятия не имеет. И вместо того, чтобы за базары свои отвечать, продолжает хамить. Бомж-балабомж. :)

Говно, ты не в том положении, чтобы мне что-то кукарекать.

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

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

Ну как и ожидалось. Даже доку по простенькому классу понять не осилил,

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

При этом шлюха не доказала и не показала, где и что там есть. Это типичное поведение подобного опущенноего бездарного дерьма.

Побежала доказывать наличие полиморфизма, шлюха. Бегом.

Да неужели. Какая-то вздорная никчёмная истеричка мне тут правила диктует.

Шлюха, ты говно и я тебе буду диктовать то, что захочу. А ты, говно, будешь исполнять. Ты тут опущенное трепло, а не я.

К тому же, это базовые условия. С какой стати шлюха что-то кукарекает, но не отвечает.

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

а если ты не нашёл - ты не осилил.

Хочу напомнить, что ты начал выдавать свои идиотские суждения ещё до того, как я предложил тебе погуглить API. Если бы спросил, как нормальные люди, я бы объяснил. Но поскольку ты выдумал мнение из своей больной головы ещё до знакомства с предметом, и мнение окончательное, и вежливой просьбы я что-то не слышал, то и объяснять тебе что-либо посчёл излишней тратой времени. Дурака учить – только портить.

А ты, говно, будешь исполнять.

М-да. Мания величия пожалуй будет покруче, чем я думал. Санитарами в своей дурке будешь командовать, бомжара. :)

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

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

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

Исполнять, падаль.

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

Шлюха, все мусорные отсылки на «там есть», «сам» умножаются на ноль тутже.

Смотри какой умножака нашёлся. :) Ну если в голове у тебя ноль, то у тебя всё и умножается на ноль.

Так что, доказательство что плюсы – говно, будет? Или трепло?

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

Так, шлюха опять обгадилась с доказательствами. Фиксируем.

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

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

Так, шлюха опять обгадилась с доказательствами. Фиксируем.

Это ты про себя? Правильно, фиксируй. :)

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

Унижено, раздавлено и обосанно. Падаль бездарная.

Кстати, фиксируем всё то, что я говорил об этом шлюхе. Всё сбылось.

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

Унижено, раздавлено и обосанно. Падаль бездарная.

Это ты тоже про себя? И это правильно говоришь.

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

Шлюха, бегом блеять за «про себя». Доказывать, что про себя и какое отношение твоя обосанная рожа имеет ко мне? Бегом, говно.

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

Он один. Всё жду когда выдохнется, истеричка ж, по идее давно уж должен. Ан нет, крепкий попался. Всё фиксирует и фиксирует. :)

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

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

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

Нет, обоснна, это доказано и показано выше.

Ах ну и да. Шлюха, бегом блеять за «про себя». Доказывать, что про себя и какое отношение твоя обосанная рожа имеет ко мне? Бегом, говно.

anonymous
()

Сделал pm::cons для того чтобы разбирать туплы на компоненты:

struct S {
  int x = 42;
  string s;
} const s;

match(tie(s.x, s.s)
  | with(cons(42, __), [] (int, const string &s) { return s; }));

Не уверен зачем это нужно, но наверное можно и так.

aleksey_tulinov
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.