Re[20]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 27.04.08 17:08
Оценка: :)
Здравствуйте, 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 пишется для вариантов, но при поддержке компилятора и среды его можно и не писать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.