M>>>>При этом с ПМ рекрсия по списку тривиальна
SR>>>Неужели считаете, что цикл нетривиален?
M>>Он менее "читаем", чем ПМ
SR>Цикл это цикл, причем тут сопоставление с образцом? Сопоставление происходит уже внутри цикла.
match([]) ->
not_ok.
match([H|T]) ->
ok.
намного понятнее. Тем более, что мы сразу на месте можем указать, что нам нужно:
match([{ok, Value}|T]) ->
ok.
match([что_то_там|T]) ->
ok.
match([{ok, {{Version, 200, ReasonPhrase}, Headers, Body}}|T]) ->
%% здесь мы сразу получаем доступ ко всем переменным
ok.
M>>>>M>>>>{ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
M>>>> http:request(...
M>>>>{ok, {_, _, Body}} = http:request(...
M>>>>{ok, {_, 200, _}, _, _} = http:request(
M>>>>
M>>>>Какой-какой автоматизированый equals мне поможет это написать?
SR>>>Как-то определили, что мне знаком erlang?
M>>Ну, мы ж про паттерн-матчинг говорим? А тут вполне себе паттерн-матчинг. Вполне понятный даже незнакомому с Эрлангом
SR>Ладно попробую, хотя смысл ok слабо понятен. Какое-то ключевое слово в erlang, видимо. Так что пока без ok.
SR>SR> private Response getResponse() {
SR> return new Response(list (
SR> list ( "HTTP/1.1", 200, "OK" ),
SR> list (
SR> "Content-Type: text/html; charset=UTF-8",
SR> "Content-Length: 0" ),
SR> list ( "" )
SR> ));
SR> }
SR> public void parse() {
SR> Response response = getResponse();
SR> Any _ = new Any();
SR> Match version = new Match(), responsePhrase = new Match(), headers = new Match(), body = new Match();
SR> if (response.matches( list ( list (version, 200, responsePhrase), headers, body ))) {
SR> System.out.println(responsePhrase.value);
SR> }
SR> if (response.matches( list (_, _, body))) {
SR> System.out.println(body.value);
SR> }
SR> if (response.matches( list ( list (_, 200, _), headers, body))) {
SR> System.out.println(headers.value);
SR> }
SR> }
SR>
И это называется удобным??? На каждый случай писать свою, отдельную, специализированную функцию, заточенную под разбор только данного конкретного случая?
На четырех простейших примерах — это уже четвертая такая функция. Это как раз то, о чем я говорю. ПМ позволяет использовать
унифицированый подход к разбору
как структуры
так и значений:
%% Первый пример, http://rsdn.ru/Forum/Message.aspx?mid=2766871&only=1
%% намеренно сокращен :)
match({0, x}) ->
0;
match({1, x}) ->
x;
match({a, b}) ->
a*b;
%% Второй пример, с правилами валидации
%% http://rsdn.ru/Forum/Message.aspx?mid=2927907&only=1
%% Слегка сокращен
match({Field, Rule}) ->
match_rule(Field, Rule);
match(Field) when is_atom(Field) ->
field_exists(Field);
match_rule(Field, {Func, Value}) ->
Func(Field, Value);
%% третий пример, http://rsdn.ru/Forum/Message.aspx?mid=2927730&only=1
match([]) ->
ok;
match({i, _, empty}) ->
ok;
match({i, m, {'Cons', x, y}}) ->
ok;
%% и так далее
%% четвертый пример, http://rsdn.ru/Forum/Message.aspx?mid=2929226&only=1
match({ok, {{Version, 200, ReasonPhrase}, Headers, Body}}) ->
ok;
match({ok, {{_, 404, ReasonPhrase}, _, _}}) ->
ok;
Я с удовольствием посмотрю на
общую функцию match, которая разберется со всеми этими примерами одним махом.
SR>>>Гм, по вашему одна большая функция не разбитая на малые превращается сразу в язык программирования Tom. Интересная способ рассуждений.
M>>Или в нечто ему подобное. Потому что мы же хотим некую общую функцию, которая поможет разбирать образцы не только на одном примере разбора веб-форм
SR>Списки — простой случай, повторяю в который раз. Неужели сомневаетесь, что можно написать обобщенную функцию разбора?
Сомневаюсь. Выше приведено четыре примера, на каждый из которых с нашей стороны был приведен простейший декларативный код с ПМом, а с вашей — четыре разные функции, которые еще и накладывают ограничения на реализацию (например, необходимость реализации метода equals в первом примере)
SR>>>Нет. Вспомните, я и код такого вида не приводил.
M>>Ну, для калькулятора был код с term.equals, для проверки веб-=форм был код с if'ами. Для этого конкретного примера term.equals не подойдет, потому что нам не всегда все значения нужны. Так что if-ы
SR>Если бы вы внимательно посмотрели на код с equals то увидели бы, что там далеко не все значения используются в дальнейшем.
Зачем их тогда упоминать?
M>>Это, возможно, ограничения языков и/или JVM.
SR>В Nemerle тоже сопоставляются только варианты.
M>>На простых просто как раз и начинается- а вот тут я могу if'ом, а вот тут — функцией...
M>>Хотя... Опять же. ПМ предлагает одинаковый подход к решению всех приведенных здесь примеров. Который еще и очень легко читается.
SR>не вижу различий, еще раз считайте что if это case.
и if и case могут проверять
только значения. ПМ позвляет проверять и структуру и значения
сразу, без какойлибо дополнительной работы со сторноы программиста. В этом — главное и основное отличие
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>