Re[17]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 26.04.08 08:13
Оценка:
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>>


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.