Здравствуйте, Аноним, Вы писали:
А>Я честно скажу, что сейчас толком не понимаю происходящее ни в том ни в другом случае, но в Boo хотя бы можно поразбираться — вполне читаемый код для любого знакомого с шарпом. От кода немерля же начинают болеть глаза на 15 секунде.
Уже не первый раз слышу о сложности понимания ПМ, попробовал написать небольшой пост на эту тему, возможно кому-то будет интересно.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, Аноним, Вы писали:
А>>Я честно скажу, что сейчас толком не понимаю происходящее ни в том ни в другом случае, но в Boo хотя бы можно поразбираться — вполне читаемый код для любого знакомого с шарпом. От кода немерля же начинают болеть глаза на 15 секунде.
Z>Уже не первый раз слышу о сложности понимания ПМ, попробовал написать небольшой пост на эту тему, возможно кому-то будет интересно.
Z>http://ziaw.blogspot.com/2011/05/pattern-matching-nemerle.html
match (i)
{
| 1 => Console.WriteLine(1)
| 2 => Console.WriteLine(2)
| 3
| 4
| 5
| x => Console.WriteLine(i) // или x?
}
def lst2 = 42 :: lst2; // или lst1?
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
"| x " — это паттерн "переменная". Он сопоставляется с любым значением и переменная (x в данном случае) связывается со значением. Более правильно было бы переписать этот код так:
switch (i)
{
case 1: Console.WriteLine("one"); break;
case 2: Console.WriteLine(2); break;
default:
var x = i;
Console.WriteLine(x)
}
только x будет неизменяемой переменной.
BB>
BB>def lst2 = 42 :: lst2; // или lst1?
BB>
Ага. Очевидно это опечатка. lst2 выше объявлен не был. Так что очевидно имелось в виду lst1.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
Тут все таки i, это пример демонстрации нескольких паттернов на один экшен. В паттернах 3, 4, 5 x не определяется и его использовать соответственно нельзя. Можно так, но это будет совсем смешно и, вообще, with я приберег для последующих постов.
match (i)
{
| 1 => Console.WriteLine(1)
| 2 => Console.WriteLine(2)
| 3 with x = 3
| 4 with x = 4
| 5 with x = 5
| x => Console.WriteLine(x)
}
BB>
BB>def lst2 = 42 :: lst2; // или lst1?
BB>
BB>[/q]
Тут опечатка, исправил, спасибо.
Re[3]: Блог о понимании паттерн-матчинга (автор Ziaw)
Здравствуйте, Ziaw, Вы писали:
Z>Тут все таки i, это пример демонстрации нескольких паттернов на один экшен. В паттернах 3, 4, 5 x не определяется и его использовать соответственно нельзя.
Вот оно что. Понятно, спасибо.
Re: Блог о понимании паттерн-матчинга (автор Ziaw)
Здравствуйте, Ziaw, Вы писали:
Z>Тут все таки i, это пример демонстрации нескольких паттернов на один экшен.
Тогда надо "_" использовать, чтобы предупреждений не было.
Z>В паттернах 3, 4, 5 x не определяется и его использовать соответственно нельзя. Можно так, но это будет совсем смешно и, вообще, with я приберег для последующих постов. Z>
Z>match (i)
Z>{
Z> | 1 => Console.WriteLine(1)
Z> | 2 => Console.WriteLine(2)
Z> | 3 with x = 3
Z> | 4 with x = 4
Z> | 5 with x = 5
Z> | x => Console.WriteLine(x)
Z>}
Z>
Любой паттерн можно связать с переменной с помощью паттерна as:
match (i)
{
| 3 as x | 4 as x | 5 as x => WriteLine(x)
...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
Здравствуйте, VladD2, Вы писали:
VD>Несколько уточнений.
VD>По терминологии: VD>То что ты называешь паттерном "константа" на самом деле называется паттерн литерал.
VD>То что ты называешь паттерном "идентификатор" на самом деле называется паттерн переменная.
Ок, поправлю. Хотя переменная мне не нравится.
VD>Уточняющее условие называется защитник (guard).
По сути они и есть разновидности. Поскольку являются синтаксическим сахаром для вызова конструктора.
VD>Имеет смысл дать ссылки на EBNF-описания: VD>* Выражения match VD>* и паттерна
VD>На русском введение в ПМ описывается в этой статье
Здравствуйте, Ziaw, Вы писали:
Z>По сути они и есть разновидности. Поскольку являются синтаксическим сахаром для вызова конструктора.
Термины и названия придумывают для того чтобы потом можно было ссылаться на них в общении. Если ты объясняя суть вещей даешь другие названия или классификацию, то тем самым ты способствуешь формированию каши в голове у людей и усложняешь дальнешее общение. По этому важно использовать единую терминологию.
Паттерн "конструктор" — это термин описывающий конкретную синтаксическую конструкцию. У нее есть свой синтаксис и описание. На них можно дать ссылку. Паттерны же конструктор списка и литерал списка имеют свой, отличный синтаксис, а значит и ссылаться на них нужно отдельно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Блог о понимании паттерн-матчинга (автор Ziaw)
Здравствуйте, VladD2, Вы писали:
VD>Паттерн "конструктор" — это термин описывающий конкретную синтаксическую конструкцию. У нее есть свой синтаксис и описание. На них можно дать ссылку. Паттерны же конструктор списка и литерал списка имеют свой, отличный синтаксис, а значит и ссылаться на них нужно отдельно.
Зачем множить сущности?
[1,2,3] == [](1,2,3)
head :: tail == :(head, tail)
Очевидно, что это конструкторы списка.
Отличия от конструкторов классов лишь в форме инфиксной или скобочной записи.
Re[5]: Блог о понимании паттерн-матчинга (автор Ziaw)
Здравствуйте, Аноним, Вы писали:
А>Зачем множить сущности?
Сущности не множатся. Есть отдельный синтаксис. Он и рассматривается отдельно.
А>[1,2,3] == [](1,2,3) А>head :: tail == :(head, tail)
После "==" тут какая-то фигня.
А>Очевидно, что это конструкторы списка. А>Отличия от конструкторов классов лишь в форме инфиксной или скобочной записи.
Я уже отвечал на этот вопрос. Просто читай внимательно написанное:
Паттерн "конструктор" — это термин описывающий конкретную синтаксическую конструкцию. У нее есть свой синтаксис и описание. На них можно дать ссылку. Паттерны же конструктор списка и литерал списка имеют свой, отличный синтаксис, а значит и ссылаться на них нужно отдельно.
Одно и то же выражение можно записать тремя способами:
list.Cons(1, list.Nil());
1 :: [];
[1];
и их как-то надо отличать.
Потому и вводятся названия для типов паттерном.
Если человек, например, захочет прочитать описание синтаксиса, то название "паттерн конструктор" его только введет в заблуждение. А так все просто и очевидно. Есть паттерн "конструктор", есть паттерн "конструктор списка", и есть "литерал списка".
Вот так их и надо подавать. А то что все они порождают список можно объяснить отдельно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Блог о понимании паттерн-матчинга (автор Ziaw)
Здравствуйте, VladD2, Вы писали:
VD>Сущности не множатся. Есть отдельный синтаксис. Он и рассматривается отдельно.
Такой же отдельный синтаксис есть и, например, в Haskell.
Тем не менее, в вопросе паттерн-матчинга соответствующие конструкции названы одинаково.
А>>[1,2,3] == [](1,2,3) А>>head :: tail == :(head, tail)
VD>После "==" тут какая-то фигня.
Вероятно форум какие-то сочетания символов убирает. А в окне ответа, всё в первоначальном виде.
VD>Я уже отвечал на этот вопрос. Просто читай внимательно написанное:
Ссылка неисправна.
VD>Одно и то же выражение можно записать тремя способами: VD>
Также как не надо отличать "" и new String("")
VD>Если человек, например, захочет прочитать описание синтаксиса, то название "паттерн конструктор" его только введет в заблуждение. А так все просто и очевидно. Есть паттерн "конструктор", есть паттерн "конструктор списка", и есть "литерал списка".
Чем меньше терминов придется держать новичку в голове, тем быстрее понимание.
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)