Здравствуйте, Воронков Василий, Вы писали:
ВВ>Переставьте местами 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, следовательно, если их правильно подобрать, то получим более понятный код.
Здравствуйте, Воронков Василий, Вы писали:
VD>>Через when биндик как раз выразить нельзя. Да и рекурсию не просто. Можно конечно нафигачить вложенных мачей, но это будет совсем уж сложный в реализации не очень шустрый дизайн.
ВВ>А, ну да, у when свой собственный лексический скоп. Тогда просто через макрос, видимо, не получится.
+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.
Здравствуйте, Рысцов Денис, Вы писали:
РД>Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.
Вот тут что-то странное написано:
Realization of F#'s active patterns in Nemerle language.
ИМХО implementation будет более к месту.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Рысцов Денис, Вы писали:
РД>Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.
РД>Несколько примеров доступны по ссылке — http://code.google.com/p/nemerleactivepatterns/source/browse/Test/Main.n, собственно как и исходники проекта. Может быть кому-нибудь будет интересно
Ну вот, собственно, Nemerle-way для активных паттернов
Здравствуйте, catbert, Вы писали:
C>Только вот с паттерном Sum я чего-то не понимаю. Почему называется "Sum" а там вычитание?
Так pattern matching это действие обратное конструктору, в данном случае "| Sum(2,x) => ..." нужно читать как "| 2+x => ...". Если разбирается 5, то логично, что x привязывается к 3, поэтому внутри Sum вычитание. Sum нельзя рассматривать как конструктор, это разбирающее правило.
Здравствуйте, Рысцов Денис, Вы писали:
РД>Решил попрактиковаться в написании макросов и реализовал прямую (и медленную) реализацию активных паттернов. Планирую использовать библиотеку для декомпозиции сложных и длинных правил при pattern matching'е в своих home pet проектах.
РД>Несколько примеров доступны по ссылке — http://code.google.com/p/nemerleactivepatterns/source/browse/Test/Main.n, собственно как и исходники проекта. Может быть кому-нибудь будет интересно
А может лучше в Nemerle/snippets, так можно будет потом и в инсталлятор добавить
Здравствуйте, _nn_, Вы писали:
__>А может лучше в Nemerle/snippets, так можно будет потом и в инсталлятор добавить
Я только за. Можно добавить код, а я затем убью отдельный проект, или можно добавить меня в коммитеры и я сам добавлю, мой google аккаунт — rystsov.denis.
Здравствуйте, Рысцов Денис, Вы писали:
РД>Здравствуйте, _nn_, Вы писали:
__>>А может лучше в Nemerle/snippets, так можно будет потом и в инсталлятор добавить
РД>Я только за. Можно добавить код, а я затем убью отдельный проект, или можно добавить меня в коммитеры и я сам добавлю, мой google аккаунт — rystsov.denis.
Здравствуйте, Рысцов Денис, Вы писали:
РД>Я только за. Можно добавить код, а я затем убью отдельный проект, или можно добавить меня в коммитеры и я сам добавлю, мой google аккаунт — rystsov.denis.
Присылай гуглевое мыло, добавим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.