Re[7]: активные паттрены: перезагрузка :)
От: Рысцов Денис  
Дата: 22.10.10 10:15
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Переставьте местами Float и Integer — будет ворнинг?


Нет, конечно, у компилятора нет для этого информации, как и в случае применения when:

match(6)
{
  | x when x%2==0 => $"$x | 2"
  | x when x%3==0 => $"$x | 3"
}


ВВ>В вашем примере — разбираемое значение одновременно может подходить и под Integer и под Float.


Верно, выбирается первое, которое подходит

ВВ>Но честно говоря я в вашем примере вижу как то, что *не является* паттерном зачем-то выглядит как паттерн.


Это как посмотреть, в данном случае (Integer, Float) да, вряд ли это похоже на паттерн, но в большинстве случаев там будет функция, которая будет разбирать что-то, ниже напишу примеры. А что бы не вносить путаницу можно, как предложил catbert выделять match, который содержит активные паттерны, например так

active match(str)
{
  | Integer(i) => $"str : int = $i"
  | Float(f) => $"str : float = $f"
  | _ => $"$str : Not matched"
}

Если в правилах нет активных паттернов, то выдается ворнинг, а семантика совпадает с обычным match.

ВВ>При этом я просто не очень понимаю, зачем они вообще нужны. Какие могут реальные практичные сценарии их использования?


1. Разбор объектов, которые не являются вариантами. Данная функциональность уже есть в Nemerle, благодаря where выражению в правилах.
2. В случае, когда правила очень большие и их много сложно читать match, хочется сделать декомпозицию, а средств для неё нету. Активные паттерны выполняют так раз такую функцию.
3. Если в коде часто встречаются вложенные match, то скорее всего этот код можно переписать без них, так как активные паттерны разворачиваются как раз в вложенные match, следовательно, если их правильно подобрать, то получим более понятный код.
Re[9]: активные паттрены: перезагрузка :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.10.10 13:49
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

VD>>Через when биндик как раз выразить нельзя. Да и рекурсию не просто. Можно конечно нафигачить вложенных мачей, но это будет совсем уж сложный в реализации не очень шустрый дизайн.


ВВ>А, ну да, у when свой собственный лексический скоп. Тогда просто через макрос, видимо, не получится.


+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как сделать активные паттрены.
От: Рысцов Денис  
Дата: 08.11.10 18:26
Оценка: 56 (3)
Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.

Несколько примеров доступны по ссылке — http://code.google.com/p/nemerleactivepatterns/source/browse/Test/Main.n, собственно как и исходники проекта. Может быть кому-нибудь будет интересно
Re[2]: Как сделать активные паттрены.
От: WolfHound  
Дата: 08.11.10 18:34
Оценка: 4 (1)
Здравствуйте, Рысцов Денис, Вы писали:

РД>Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.

Вот тут что-то странное написано:

Realization of F#'s active patterns in Nemerle language.


ИМХО implementation будет более к месту.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Как сделать активные паттрены.
От: catbert  
Дата: 08.11.10 19:34
Оценка: +1
Здравствуйте, Рысцов Денис, Вы писали:

РД>Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.


РД>Несколько примеров доступны по ссылке — http://code.google.com/p/nemerleactivepatterns/source/browse/Test/Main.n, собственно как и исходники проекта. Может быть кому-нибудь будет интересно


Ну вот, собственно, Nemerle-way для активных паттернов
Re[3]: Как сделать активные паттрены.
От: catbert  
Дата: 08.11.10 19:42
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, Рысцов Денис, Вы писали:


РД>>Несколько примеров доступны по ссылке — http://code.google.com/p/nemerleactivepatterns/source/browse/Test/Main.n, собственно как и исходники проекта. Может быть кому-нибудь будет интересно


Только вот с паттерном Sum я чего-то не понимаю. Почему называется "Sum" а там вычитание?
Re[4]: Как сделать активные паттрены.
От: Рысцов Денис  
Дата: 08.11.10 20:08
Оценка:
Здравствуйте, catbert, Вы писали:

C>Только вот с паттерном Sum я чего-то не понимаю. Почему называется "Sum" а там вычитание?


Так pattern matching это действие обратное конструктору, в данном случае "| Sum(2,x) => ..." нужно читать как "| 2+x => ...". Если разбирается 5, то логично, что x привязывается к 3, поэтому внутри Sum вычитание. Sum нельзя рассматривать как конструктор, это разбирающее правило.
Re[2]: Как сделать активные паттрены.
От: _nn_ www.nemerleweb.com
Дата: 09.11.10 08:52
Оценка: 1 (1)
Здравствуйте, Рысцов Денис, Вы писали:

РД>Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.


РД>Несколько примеров доступны по ссылке — http://code.google.com/p/nemerleactivepatterns/source/browse/Test/Main.n, собственно как и исходники проекта. Может быть кому-нибудь будет интересно


А может лучше в Nemerle/snippets, так можно будет потом и в инсталлятор добавить
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Как сделать активные паттрены.
От: Рысцов Денис  
Дата: 09.11.10 11:53
Оценка:
Здравствуйте, _nn_, Вы писали:

__>А может лучше в Nemerle/snippets, так можно будет потом и в инсталлятор добавить


Я только за. Можно добавить код, а я затем убью отдельный проект, или можно добавить меня в коммитеры и я сам добавлю, мой google аккаунт — rystsov.denis.
Re[4]: Как сделать активные паттрены.
От: hardcase Пират http://nemerle.org
Дата: 09.11.10 12:09
Оценка:
Здравствуйте, Рысцов Денис, Вы писали:

РД>Здравствуйте, _nn_, Вы писали:


__>>А может лучше в Nemerle/snippets, так можно будет потом и в инсталлятор добавить


РД>Я только за. Можно добавить код, а я затем убью отдельный проект, или можно добавить меня в коммитеры и я сам добавлю, мой google аккаунт — rystsov.denis.


Напиши Владу



Я бы такой мощной штуке имя дал, чтоли:
deactivated : list[PExpr.Ref*PExpr*PExpr*list[PExpr]]
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Как сделать активные паттрены.
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.11.10 15:36
Оценка:
Здравствуйте, Рысцов Денис, Вы писали:

РД>Я только за. Можно добавить код, а я затем убью отдельный проект, или можно добавить меня в коммитеры и я сам добавлю, мой google аккаунт — rystsov.denis.


Присылай гуглевое мыло, добавим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Как сделать активные паттрены.
От: Рысцов Денис  
Дата: 09.11.10 16:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Присылай гуглевое мыло, добавим.


rystsov.denis ПЁС gmail.com
Re[6]: Как сделать активные паттрены.
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.11.10 17:00
Оценка:
Здравствуйте, Рысцов Денис, Вы писали:

VD>>Присылай гуглевое мыло, добавим.


РД>rystsov.denis ПЁС ...


Готово.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.