Re[2]: Макрос regexp match ТОРМОЗИТ!
От: WolfHound  
Дата: 20.06.07 08:31
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Можно конечно подфиксить... создавать для каждого выражения статический регексп и указыват фалг Compiled, но все это полумеры. По уму нужно просто доработать напильником генератор лексеров konsoletyper-а:

По уму это конечно хорошо.
Но сделать полумеру очень просто и даст заметный результат (на порядок примерно...), а делать по уму... это нужно долго и нудно делать.
Можно конечно заняться но на это нужно много времени.
А слегка похачить этот макрос много времени не нужно.

VD>Так что правильным решением было бы просто отакзаться от МС-ных регекспов и заменить их на полноценную реализацию, или что еще лучше, вообще перейти на EBNF и потихоничку приучить к этому все прогрессивное человечество (это я о юзании konsoletyper-овского движка, если кто не понял).

EBNF это конечно хорошо. Но для одноразового кода регехпы лучше ибо писать меньше.
Скажем нужно мне было логи распарсить.
Получилось вот что:
    FileProcessor().
    ProcessLines(inFileName, outFileName, lines => lines.
        MapLazy(line => regexp match (line) {
        | @"[^:]+:(?<time>\d+:\d+:\d).*\]\s*(?<ip>\S+).*" => Some((time, ip))
        | _ => None()
        }).
        FilterOptionalLazy().
        GroupLazy((x, y) => x[0] == y[0]).
        MapLazy(seq => seq.
            CountAllToArray().
            SortInplace((x, y) => y[0] - x[0]).
            MapLazyFiltered
                ( (count, _) => count > 100
                , fun(count, (time, ip)) { $"$time $count $ip" }
                )
        ).
        FlattenLazy()
    );

Но декларативность данного решения меня не устраивает.
Хочется чегото типа такого
    FileProcessor().
    ProcessLines(inFileName, outFileName, StreamFilter {
        RegexFilteredMap(| @"[^:]+:(?<time>\d+:\d+:\d).*\]\s*(?<ip>\S+).*") //{time : string, ip : string}
        Group(time)
        Map(
            Count() //{count : int, value : {time : string, ip : string}}
            Filter(count > 100)
            Sort(-count)
            Map($"$(value.time) $count $(value.ip)")
        )
        Flatten()
    });

А тащить сюда EBNF это просто оверкилл.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.