Здравствуйте, Mamut, Вы писали:
M>Ничего не понял 
Сочувствую.
M>Причем тут списки?
M>Так никто про списки изначально и не говорил 
Притом, что в ваших образцах в большинстве случаев приводятся списки.
То есть, что-то типа {obj1, obj2, _, {obj3, _ }, _}.
Я же вам в который раз отвечаю, что такие образцы легко релизуются в java. Легко по сравнению со вторым типом.
А вот более интересные типа Obj1(Obj2(_, Obj3())) у вас встречаются значительно реже.
M>Как это реализовано внутри — это очень важно. Во всех примерах на Яве приходилось задвигать передаваемые данные в прокрустово ложе if'а (case'а), потому что ни if ни case не разбирают структуру разбираемых данных.
Конечно не разбирают. Разбирает метод matches. А if в зависимости от успешности разбора передает управление.
Кстати, когда я говорил вам обратить внимание, что if это case, я имел ввиду, case из erlang, а не из java.
M>Да, но прогарммисту, это использующему — абсолютно все равно:
M>M>case input_data of
M> [{elem1, elem2}|T] -> сделаем что-то одно
M> [[L]|T] -> разбираем вложенный список
M> {a, b} -> а ждесь вообще не список, оппаньки
M> {[H|T], [H2|T2]} -> и здесь не список передали. но внутри список
M> {a, {b, {c, d}}} -> здесь списком даже и не пахнет, но все разобрали
M> {_, _, _, _, x} -> нам важен только 5-й параметр, хотя струкутра может быть такой:
M> {{a, b, c}, [H|T], {[H2|T2]}, d, e} -> и все равно мы ее сможем разобрать
M>end
M>
if (data.matches(list(elem1, elem2), T))
if (data.matches(list(L), T))
if (data.matches(a, b)
if (data.matches(list(H, T), list(H2, T2))
if (data.matches(a, list(b, list(c, d)))
if (data.matches(_, _, _, _, x))
if (data.matches(list(a, b, c), list(H, T), list(list(H2, T2), d, e)))
M>Не позволяет. Его в Яве нет. Все, что есть — это if/case, которые структуру разобрать не позволяют.
Позволяют. Играть, в эту игру можно долго.
SR>>[поскипаны примеры псевдокода]
Какой же это псевдокод? Вполне себе успешно компилируется Java.
M>что за list.match()? кто его написал? откуда он взялся? он будет работать для произвольных данных?
Его написал я. Я. Я его написал. Да.
M>И для каждого случая пришлось писать отдельную функцию, разбирающую отдельную структуру только в данном конкретном случае для того, чтобы вернуть true/false, чтобы это можно было проверить if/case'ом
Нет код обобщенный, пишу уже в который раз.
M>Еще раз — Java такого не позволяет:
Позволяет. Играть в эту игру можно долго.
M>ПМ:
M>M>match({1, 2, 3}) ->
M> ok;
M>match({"a", "b", "c"}) ->
M> ok;
M>match([H|T]) ->
M> ok.
M>
M>Как общим кодом на Яве узнать, что:
M>- в первом случае у нас объект с тремя целочисленными полями
if (list.matches(1, 2, 3))
return ok;
M>- во втором — с тремя текстовыми полями
if (list.matches("a", "b", "c")
return ok;
M>- в третьем — вообще списко/массив
Match h = new Match(); Tail t = new Tail();
if (list.matches(h, t))
return ok;
M>?
M>Более того, если нас не интересует тимп полей, а только их структура?
Что же не привели образец для сопоставления? Уверен я легко мог бы сделать такой и на Java.
M>Сколько перегруженых операторов equals придется писать для каждого отдельного случая?
0. equals пишется для вариантов, но при поддержке компилятора и среды его можно и не писать.