Никак не могу разобраться с матчингом строки.
Видел как лихо Влад на видеоконференции обращался с матчингом, решил попробовать.
Есть исходная строка, мне нужно перевести ее в другой формат.
Я пытаюсь разобрать ее по элементам:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, господа.
А>Никак не могу разобраться с матчингом строки. А>Видел как лихо Влад на видеоконференции обращался с матчингом, решил попробовать. А>Есть исходная строка, мне нужно перевести ее в другой формат. А>Я пытаюсь разобрать ее по элементам: А>Но элементы становятся недоступны.
А>Что же я делаю не так?
Интересно где это Влад делал матчинг строки с присвоением переменных? Это интересная фича но разбирать таким образом строки нельзя, можно матчить константу и компилятор найдет сопоставление, но разбирать содержимое строк и находить подстроки не может, возможно часть этого можно если использовать макрос regexp match (str), для разбора регулярных выражений. Можно создавать строки через сплайсы: $"Test string: $str1 $integer", но разбирать обратно нельзя.
Re[2]: Запутался с матчингом строки
От:
Аноним
Дата:
19.02.12 05:16
Оценка:
Здравствуйте, CodingUnit, Вы писали:
CU>Интересно где это Влад делал матчинг строки с присвоением переменных? Это интересная фича но разбирать таким образом строки нельзя, можно матчить константу и компилятор найдет сопоставление, но разбирать содержимое строк и находить подстроки не может, возможно часть этого можно если использовать макрос regexp match (str), для разбора регулярных выражений. Можно создавать строки через сплайсы: $"Test string: $str1 $integer", но разбирать обратно нельзя.
Ясно, спасибо.
PS. Я не говорил про матчинг строк Владом, он показывал чудеса матчинга в целом.
Re: Запутался с матчингом строки
От:
Аноним
Дата:
19.02.12 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Что же я делаю не так?
А каким образом должна разбираться тут строка ?
Возможны разные варианты.
Можете воспользоваться макросом regexp match, который сопоставляет по регулярному выражению:
using Nemerle.Text;
using Nemerle.IO;
regexp match (str)
{
| "a+.*" => printf ("a\n");
| @"(?<num : int>\d+)-\w+" => printf ("%d\n", num + 3);
| "(?<name>(Ala|Kasia))? ma kota" =>
match (name)
{
| Some (n) => printf ("%s\n", n)
| None => printf ("noname?\n")
}
| _ => printf ("default\n");
}
Если конструктор бросает исключение, что будет? Отмена матчинга или исключение с match'е? Может ли конструктор провести дополнительную проверку и отменить матч?
Здравствуйте, Аноним, Вы писали:
А>Что же я делаю не так?
ПМ он для структурированных объектов. Строки объект не структурированный. Их разбор — это парсинг. Для парсинга надо использовать парсер, или регексы. Примеры и того и другого лекого найти в исходниках на сайте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Будет исключение. Правда там не конструктор вызывается, а метод Parse. Никакой специальной обработки исключений возникающих в методе Parse нет. Хотя, не мешало бы эту фичу доработать. Если метод Parse возвращает option, то матч проходит только в случае возврата Some.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, VoidEx, Вы писали:
А>>>Можно даже так: https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/positive/bug-1215.n
VE>>Если конструктор бросает исключение, что будет? Отмена матчинга или исключение с match'е? Может ли конструктор провести дополнительную проверку и отменить матч?
Z>Будет исключение. Правда там не конструктор вызывается, а метод Parse. Никакой специальной обработки исключений возникающих в методе Parse нет. Хотя, не мешало бы эту фичу доработать. Если метод Parse возвращает option, то матч проходит только в случае возврата Some.
Может просто вызывать стандартный метод bool TryParse(out T).
А если такого метода нет , то вызывать Parse и ловить исключение.
Здравствуйте, _NN_, Вы писали:
_NN>Может просто вызывать стандартный метод bool TryParse(out T). _NN>А если такого метода нет , то вызывать Parse и ловить исключение.
Строить логику матча на исключениях неправильно. Перфоманс будет никакой. Предлагаю фичу:
stringmatch (str)
{
| regexp @"DEFINE\($(?<x>.+),$(?<y>.+)\)"// матчим регексп
| $"DEFINE($x,$y)" => // преобразуем в регексп выше и матчим
| x is int => // int.TryParse
| x is MyType => // Ищем методы:
// MyType.TryParse(out string)
// MyType.Parse(string):option[MyType]
// MyType.Parse(string):MyType - ловим исключение
// этот же алгоритм используем в регэкспах при указании типа переменных
| regexp @"DEFINE\($(?<x : int>.+),$(?<y : int>.+)\)")
| $"DEFINE($(x : int),$(y : int))"
}
Считаю, что при обработке текстов будет очень удобно. regexp match можно будет пометить как депрекейтед через версию, так как она будет подмножеством этого оператора, а парсинг уже выходит за рамки регэкспов.
Простенькие КА парсеры будет писать одно удовольствие. Гораздо проще чем создавать пег парсер.
Единственное, чего бы хотелось, но я не знаю как сделать — поиск всех вхождений по длинной строке. Есть варианты?