Re[21]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 27.04.08 19:22
Оценка:
M>>Причем тут списки?
M>>Так никто про списки изначально и не говорил
SR>Притом, что в ваших образцах в большинстве случаев приводятся списки.
SR>То есть, что-то типа {obj1, obj2, _, {obj3, _ }, _}.
SR>Я же вам в который раз отвечаю, что такие образцы легко релизуются в java. Легко по сравнению со вторым типом.
SR>А вот более интересные типа Obj1(Obj2(_, Obj3())) у вас встречаются значительно реже.

{a, b, c} — это кортеж
[a, b, c] — это список

Птаница в незнакомом синтаксисе просто произошла

Таким образом,
match({a, b, c})


это сопоставление с экземпляром класса типа
class Elem {
  a;
  b;
  c;
}


где a, b, c — это поля произвольного типа

поэтому все остальное поскипано, потому что мы возвращаемся к коду из первого примера:
class Term
case class Num(n: int)           extends Term
case class Var(name: String)     extends Term
case class Mul(l: Term, r: Term) extends Term
case class Add(l: Term, r: Term) extends Term

// Now let's say we want to implement some simplification rules on such terms.
// Two useful simplifications apply the equalities:
// 0 * x  =  0
// 1 * x  =  x

def simplify(term: Term) = term match {
  case Mul(Num(0), x) => Num(0)
  case Mul(Num(1), x) => x
  case _ => term
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>


dmitriid.comGitHubLinkedIn
Re[22]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 27.04.08 19:45
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, SmbdRsdn, Вы писали:


M>>>Более того, если нас не интересует тимп полей, а только их структура?

SR>>Что же не привели образец для сопоставления? Уверен я легко мог бы сделать такой и на Java.
C>Нельзя. Точнее, можно, но совершенно непрактично.
Так нельзя или можно?
Если можно, то в чем будет непрактичность?

M>>>Сколько перегруженых операторов equals придется писать для каждого отдельного случая?

SR>>0. equals пишется для вариантов, но при поддержке компилятора и среды его можно и не писать.
C>?? equals можно автоматически сгенерировать с помощью IDE.
Это был вопрос? Если да, то что удивляет? Чего только сейчас IDE не генерируют.
Например Eclipse по
class A {
  final Object b;
  Object c;
}

в несколько щелчков мышью сделает
class A {
  final Class1 b;
  Class2 c;

  public A(Class1 b, Class2 c) {
    this.b = b;
    this.c = c;
  }

  public Class1 getB() { 
    return b; 
  }
  public void setC(Class2 c) { 
    this.c = c; 
  }
  public Class2 getC() { 
    return c; 
  }
}

Сами понимаете, что добавить еще и equals не сложно.
Re[22]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 27.04.08 20:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Это вобще туплы.

Будем считать частным случаем нетипизированного списка, у которого в качестве элемента может быть другой список.

WH>В этот нельзя.

WH>Язык статически типизированный.
WH>В динамически типизированных языках таких как erlang можно.
Как раз в последних сообщениях разговор, насколько я понимаю, шел про erlang.

WH>Теоритически все можно сделать... особенно на словах...

Теоретически и опровергнуть можно, особенно на словах.

WH>Покажи код увидишь.

Может быть покажете свою мощь на уже выложенных мной примерах?

WH>Устойчивость к дуракам типа меня.

Уже боюсь.
WH>Ну и чтобы лишних проверок не делал.
Что, совсем?

WH>Вот еще за тебя делать твою работу.

Что значит за меня, я ее уже проделал.

WH>Ты где настолько умные компиляторы видел?

Про интеллект компиляторов тоже отвечал. Могу только повторить.
Да, собственно в теме уже приводился пример, который развертывает сопоставление с образцом в набор if'ов на lua.
WH>Я покачто видел только компиляторы которые генерили оптимальный код только если точно знали что происходит.
Так и тут.

SR>>"Грязь" — там только в необходимости заранее объявлять переменные.

WH>Там ее еще много.
Да вроде все чисто. Впрочем с благодарностью приму указание на конкретную грязь.

WH>Аргументов за нет и быть не может.

WH>Ибо невозможно обосновать наличие текста который совершенно ничего не дает.
Все-таки это вопрос стиля конкретного языка. Есть в которых объявляют, а есть в которых нет.

SR>>так и против использования переменных без их объявления.

WH>А это вобще бред.
WH>Переменные объявляются в коде паттерна.
Пусть так, но все-таки в языке имеется и явный синтаксис объявления переменной.

SR>>Сами же образцы для сопоставления отличаются несущественно.

WH>На игрушечных примерах.
Как показывать преимущества Scala над Java так примеры нормальные, а как выяснится, что преимущества и нет, так примеры игрушечные.

WH>Полный код в студию.

WH>В чем проблема?
С моей точки зрения код тривиален. С точки зрения моих противников код не может существовать.
Так как мои противники люди нетривиальные (это похвала) вероятно мой код весьма интересен.
Поэтому может быть мне стоит его представить в более широковещательном виде, например в виде статьи в журнале и статьи на какой-либо конкурс.
Re[23]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 27.04.08 21:49
Оценка:
SR>Это был вопрос? Если да, то что удивляет? Чего только сейчас IDE не генерируют.
SR>Например Eclipse по
SR>
SR>class A {
SR>  final Object b;
SR>  Object c;
SR>}
SR>

SR>в несколько щелчков мышью сделает
SR>
SR>class A {
SR>  final Class1 b;
SR>  Class2 c;

SR>  public A(Class1 b, Class2 c) {
SR>    this.b = b;
SR>    this.c = c;
SR>  }

SR>  public Class1 getB() { 
SR>    return b; 
SR>  }
SR>  public void setC(Class2 c) { 
SR>    this.c = c; 
SR>  }
SR>  public Class2 getC() { 
SR>    return c; 
SR>  }
SR>}
SR>

SR>Сами понимаете, что добавить еще и equals не сложно.

Потом кто-то это будет редактировать под vi через ssh
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>


dmitriid.comGitHubLinkedIn
Re[23]: Действительно ли ML языки хороши в компиляторописани
От: Cyberax Марс  
Дата: 27.04.08 21:54
Оценка:
Здравствуйте, SmbdRsdn, Вы писали:

SR>>>Что же не привели образец для сопоставления? Уверен я легко мог бы сделать такой и на Java.

C>>Нельзя. Точнее, можно, но совершенно непрактично.
SR>Так нельзя или можно?
Нельзя.

SR>Если можно, то в чем будет непрактичность?

Тонны кода.

M>>>>Сколько перегруженых операторов equals придется писать для каждого отдельного случая?

SR>>>0. equals пишется для вариантов, но при поддержке компилятора и среды его можно и не писать.
C>>?? equals можно автоматически сгенерировать с помощью IDE.
SR>Это был вопрос? Если да, то что удивляет? Чего только сейчас IDE не генерируют.
Нет, это было удивление. Я прекрасно знаю как сейчас работают Java IDE (чай не зря 8 лет на Java пишу...).

SR>Сами понимаете, что добавить еще и equals не сложно.

Ага. Только и получаются тонны ненужного кода в результате.
Sapienti sat!
Re[21]: Действительно ли ML языки хороши в компиляторописани
От: FR  
Дата: 28.04.08 03:12
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, FR, Вы писали:


FR>>Вообще классно пишешь, и главное так хитро и тонко, я вот почитал и практическм перестал сомневатся в преимуществах ML образных

WH>Давай-давай.
WH>У нас конкурентов меньше будет.

Халва, халва, халва
Re[24]: Действительно ли ML языки хороши в компиляторописани
От: FR  
Дата: 28.04.08 03:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

SR>>Сами понимаете, что добавить еще и equals не сложно.

C>Ага. Только и получаются тонны ненужного кода в результате.

Вообще у меня дежавью, помню спорил лет восемь назад с закоренелым сишником о пользе и необходимости классов, в общем аргументы практически один к одному и главный "все можно сделать".
Re[25]: Действительно ли ML языки хороши в компиляторописани
От: Cyberax Марс  
Дата: 28.04.08 04:09
Оценка: :)
Здравствуйте, FR, Вы писали:

C>>Ага. Только и получаются тонны ненужного кода в результате.

FR>Вообще у меня дежавью, помню спорил лет восемь назад с закоренелым сишником о пользе и необходимости классов, в общем аргументы практически один к одному и главный "все можно сделать".
Классы — это ещё фигня. Их, действительно, совсем не так уж сложно сделать.

А вот pattern matching — это вещь уже совсем другого уровня сложности.
Sapienti sat!
Re[26]: Действительно ли ML языки хороши в компиляторописани
От: Курилка Россия http://kirya.narod.ru/
Дата: 28.04.08 04:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, FR, Вы писали:


C>>>Ага. Только и получаются тонны ненужного кода в результате.

FR>>Вообще у меня дежавью, помню спорил лет восемь назад с закоренелым сишником о пользе и необходимости классов, в общем аргументы практически один к одному и главный "все можно сделать".
C>Классы — это ещё фигня. Их, действительно, совсем не так уж сложно сделать.
Вопрос только, какие именно классы
Хотя, конечно, можно для каждой задачи свой вариант классов ваять
Re[23]: Действительно ли ML языки хороши в компиляторописани
От: WolfHound  
Дата: 28.04.08 10:35
Оценка:
Здравствуйте, SmbdRsdn, Вы писали:

SR>Будем считать частным случаем нетипизированного списка, у которого в качестве элемента может быть другой список.

Кортежи не списки.
Это совсем другие зверьки.

WH>>Теоритически все можно сделать... особенно на словах...

SR>Теоретически и опровергнуть можно, особенно на словах.
Опровергать то чему нет никаких подтверждений не имеет смысла.
Оно опровергнуто по умолчанию.

WH>>Покажи код увидишь.

SR>Может быть покажете свою мощь на уже выложенных мной примерах?
Примеры без того что их исполняет не имеют смысла ибо это не болие чем псевдокод и работать они не могут.

WH>>Вот еще за тебя делать твою работу.

SR>Что значит за меня, я ее уже проделал.
Вот и покажи раз проделал.
Иначе придется сделать вывод что все это пустой треп.

SR>Про интеллект компиляторов тоже отвечал. Могу только повторить.

Да хоть заповторяйся умнее они не станут.

SR>Да, собственно в теме уже приводился пример, который развертывает сопоставление с образцом в набор if'ов на lua.

Компилятор действовал в условиях полной определенности.

SR>Все-таки это вопрос стиля конкретного языка. Есть в которых объявляют, а есть в которых нет.

А тут переменные объявляют.
Это не бейсик какойнибуть где переменные объявляются при первом обращении.
Тут объявление явное.

SR>Пусть так, но все-таки в языке имеется и явный синтаксис объявления переменной.

Синтаксис дело десятое.
Главное что переменные всегда объявляются явно.

SR>С моей точки зрения код тривиален. С точки зрения моих противников код не может существовать.

Я могу придумать сотни вариантов того что делает вид что работает.
Так что код в студию.

SR>Так как мои противники люди нетривиальные (это похвала) вероятно мой код весьма интересен.

SR>Поэтому может быть мне стоит его представить в более широковещательном виде, например в виде статьи в журнале и статьи на какой-либо конкурс.
Да ты хотябы тут покажи.

Или таки все это пустой треп?
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[22]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 28.04.08 11:50
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Птаница в незнакомом синтаксисе просто произошла

Кортеж или список это примерно одно и тоже, с точки зрения сопоставления с образцом.

M>Таким образом,

M>
M>match({a, b, c})
M>


M>это сопоставление с экземпляром класса типа

Кортеж, я так понимаю, отдельный тип, а не любой класс с полями.
M>
M>class Elem {
M>  a;
M>  b;
M>  c;
M>}
M>

И сопоставлять должно что-то в духе — match(Elem(a,b,c))
Иначе возникает очевидная путаница между классами у которых одинаковые внутренние типы, например Add и Sum.

M>где a, b, c — это поля произвольного типа


M>поэтому все остальное поскипано, потому что мы возвращаемся к коду из первого примера:

Зачем возвращаемся не понятно. Код сопоставления к этому примеру я уже приводил.
Re[24]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 28.04.08 11:56
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Потом кто-то это будет редактировать под vi через ssh

Гм, это какой-то каменный век хотя может быть в erlang исходный код хранится рядом с бинарным?
В Java же ни на тестовом, ни на производственном сервере никаких java файлов и не будет — нечего редактировать.
Я уж молчу, что как правило у разработчиков отсутствует доступ к развертыванию не то что на производственный, но даже и на тестовый сервер.
Re[24]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 28.04.08 12:01
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>Нельзя.

То нельзя, то можно.

C>Тонны кода.

Если под тонной понимать тысячу строк, то это в современных условиях ерунда.
Вот если бы речь шла о мегатоннах.
Да и то, достоточно посчитать количество строк в JDK, а люди, тем не менее его легко используют.

C>Нет, это было удивление. Я прекрасно знаю как сейчас работают Java IDE (чай не зря 8 лет на Java пишу...).

И что же вас удивило в генерации кода на IDE?

C>Ага. Только и получаются тонны ненужного кода в результате.

Если ненужного зачем генерировать?
Re[23]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 28.04.08 12:34
Оценка: +1
M>>Птаница в незнакомом синтаксисе просто произошла
SR>Кортеж или список это примерно одно и тоже, с точки зрения сопоставления с образцом.

Ту хум хао, как говорится

M>>Таким образом,

M>>
M>>match({a, b, c})
M>>


M>>это сопоставление с экземпляром класса типа

SR>Кортеж, я так понимаю, отдельный тип, а не любой класс с полями.

Чем класс не тип?


M>>
M>>class Elem {
M>>  a;
M>>  b;
M>>  c;
M>>}
M>>

SR>И сопоставлять должно что-то в духе — match(Elem(a,b,c))
SR>Иначе возникает очевидная путаница между классами у которых одинаковые внутренние типы, например Add и Sum.


Что-то в духе? Что будет сопоставлять? Кто будет писать эту функцию match?

M>>где a, b, c — это поля произвольного типа


M>>поэтому все остальное поскипано, потому что мы возвращаемся к коду из первого примера:

SR>Зачем возвращаемся не понятно. Код сопоставления к этому примеру я уже приводил.

Еще раз.

На пример
def simplify(term: Term) = term match {
  case Mul(Num(0), x) => Num(0)
  case Mul(Num(1), x) => x
  case _ => term
}


Был приведен псевдо код с неким term.equals, причем кто будет писать этот equals — непонятно. Предполагается, что IDE

На пример
match(Field)
match({Field, {Func, Value})
match({Field, {'=', Value}})


был приведен совсем другой код, разбирающи списки


На пример
{ok, {{Version, 200, ReasonPhrase}, Headers, Body}}


будет приведена совсем третья функция, разбирающая эту структуру.



И каждй раз программисту (особенно новому) придется разбираться — что делает тот или иной цикл, те десять функций equals, тот десяток методов matches и т.п.

Это мы еще про байндинг переменных не упомянули.
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>


dmitriid.comGitHubLinkedIn
Re[21]: Действительно ли ML языки хороши в компиляторописани
От: Tonal- Россия www.promsoft.ru
Дата: 28.04.08 18:03
Оценка: 30 (1) +2
Здравствуйте, SmbdRsdn, Вы писали:

Давай таки по чесному сравним не только два этих отрывка кода, но и то, что за ними стоит

Мелкий ликбез по Erlang-у:
Атомы всегда начинаются с маленькой буквы — это просто имена. Больше всего похожи на перечисления в С++
Переменные начинаются с большой буквы.
Запись [H|T] означает: список из головы H и хвоста T, где T может быть любым списком, в том числе и пустым.
Для кортежей {...} такой синтаксис не возможен.
Запись [H] означает список из одного элемента H

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>>

Это вполне законченный кусок кода.
Т.е. вместо русских комментариев после -> можно написать любое допустимое выражение Erlang-а
Кроме того, можно дописать сколько угодно условий, с какими угодно образцами.
Можно дописать условие, которое будет совпадать в том случае, если ни один другой образец не совпал.
И input_data и совпавшие литералы и забинденные переменные могут быть любого допустимого в Erlang-е типа: числом, сторокой, атомом, кортежем, списком, записью и т.д.
Т.о. код не накладывает никаких требований на типы элементов, с которыми мы тут работаем.

SR>
SR>if (data.matches(list(elem1, elem2), T))
SR>if (data.matches(list(L), T))
SR>if (data.matches(a, b)
SR>if (data.matches(list(H, T), list(H2, T2))
SR>if (data.matches(a, list(b, list(c, d)))
SR>if (data.matches(_, _, _, _, x))
SR>if (data.matches(list(a, b, c), list(H, T), list(list(H2, T2), d, e)))
SR>

Какого здесь типа будет data — у него как минимум должна быть реализована matches. Т.е. сразу ограничение в сравнении с вариантом Erlang-а
Ладно, давай предположим, что у нас есть некоторый класс PMatcher с функцией matches, которая, принимает 2 параметра, данные и паттерн, в результате выдаёт совпало/несовпало и биндит переменные указанные в шаблоне.
Данные понятно — Оbject — чтобы можно было любой тип подавать.
Отрывок под это дело переписывается элементарно.
Мы не будем придираться, что этот класс и его функцию matches нужно как-то реализовывать и это точно займёт не 2-3 строки. Ведь и в Erlang-е PM не по волшебству берётся.
Лучше посмотрим во что выливаются остальные требования.
Ну про данные понятно — они должны быть любые.
Теперь про шаблон — как его можно записать?
Попробуем создавать структуры-шаблоны. Причём, мы хотим от шаблонов как можно большей естественности — т.е. чтобы они как можно меньше отличались от кода, который мы пишем создавая наши структуры.
С константами вроде проблем нет.
А вот с массивами уже есть: предположим мы хотим нарисовать такой шаблон для массива целых, из 3х элементов, где первый нам не важен (_), второй всегда равен 2 а третий сбиндить в указанную переменную...
Кажется придётся отказатся от массивов, всё равно нормальные пацаны используют коллекции...
Едем дальше — Классы.
Значит как минимум одно требование у нас есть — в классе должен быть реализован некий метод equals который, как я понимаю, осушествляет глубокое сравнение с учётом биндинга и пропусков (_).
Ок. Расширяем Эклипс или НетБинс чтоб она за нас его рисовала.
Но этот код уже таки нужно учитывать — т.к. нам таки приходится изменять классы под PM.
Опять же, пусть есть класс:
class Elem {
  public int a;
  public double b;
  public string c;
  Elem(int aa, double bb, string cc) {a = aa; b = bb; c = cc;}
}

Хотим написать шпблон, где поле a нас не интересует, поле b должно быть 3.14, а поле c сбиндить в указанную переменную...
Если мы хотим, чтобы шаблон создавался таким же кодом, как и обычные структуры, то очевидно, здесь нужно менять типы, т.е. вместо int, double, string ставить Object.
Очевидно, что с таким классом будет изрядно неудобно работать в остальных местах.
Кроме того, в этом случае нельзя будет работать с классами, написанными не нами...

Значит такой способ задания шаблона не катит. Попробуем по другому: для каждого интересующего нас класса можно создать PM-двойника, который бы мы использовали при задании шаблонов. Этим кстати можно даже обойти проблему с массивами.
Наверное тоже можно нагнуть Эклипс и несколькими щелчками получить двойника заданного класса. Правда остаётся неприятная проблема с типизацией. Да и код от этих двойников раздувается...

Получается, что общий код для поддержки твоего псевдокода по объёму его сильно превосходит, без учёта самого движка сопоставления.
И объявления каких-то переменных, которые в псевдокоде мелькали — действительно можно не учитывать на этом фоне.

Кстати, а куда будем учитывать плагины которые тоже нужно писать и поддерживать?

P.S. С Java разбирался довольно давно. Поэтому, если кто-нибудь расскажет как обойти эти проблемы, с кодом, за которым понятно что стоит, буду признателен.
Только почему-то кажется, что таки легче скалу взять.
P.P.S. А ты правда правда считаешь что куски эквивклетны по понятности/объёму, или просто отстаиваешь любимый язык?
Несколько месяцев назад я примерно с такими же доводами выступал. Правда в качестве псевдокода использовал С++.
... << RSDN@Home 1.2.0 alpha 4 rev. 1065>>
Re[24]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 28.04.08 21:16
Оценка:
Здравствуйте, WolfHound, Вы писали:

SR>>Может быть покажете свою мощь на уже выложенных мной примерах?

WH>Примеры без того что их исполняет не имеют смысла ибо это не болие чем псевдокод и работать они не могут.
Определение псевдокода в студию! Или это всего лишь треп?
Большинство остальных оппонентов скорее согласны, что код работать может, но будет много кода илл он его применение будет сильно рассогласовано.

WH>Компилятор действовал в условиях полной определенности.

Что мешает компилятору и тут действовать в условиях полной определенности?

WH>А тут переменные объявляют.

WH>Это не бейсик какойнибуть где переменные объявляются при первом обращении.
WH>Тут объявление явное.
WH>Главное что переменные всегда объявляются явно.
Вот-вот — явно. А не в середине или в конце набора скобок, групповых символов, имен классов, строковых, числовых и логических литералов.

WH>Синтаксис дело десятое.

Может быть для Lisp так и есть.

WH>Или таки все это пустой треп?

Конечно пустой, странно, что вы это так долго до этого доходили.
Re[24]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 28.04.08 21:29
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Чем класс не тип?

Тип конечно. Но кортеж это отдельный тип, такой же как например какой-нибудь другой — String, например.
То есть всякий кортеж класс, но не всякий класс кортеж.

M>Что-то в духе? Что будет сопоставлять?

Это такие выражения в русском языке.

M>Кто будет писать эту функцию match?

А кто до этого писал? Имя match у вас же возникает, я просто заменил образец, то есть параметр функции.
Если бы я приводил пример на Java, то использовал бы new Elem(a, b, c).

M>Еще раз.


M>На пример

M>
M>def simplify(term: Term) = term match {
M>  case Mul(Num(0), x) => Num(0)
M>  case Mul(Num(1), x) => x
M>  case _ => term
M>}
M>


M>Был приведен псевдо код с неким term.equals, причем кто будет писать этот equals — непонятно. Предполагается, что IDE.



M>На пример

M>
M>match(Field)
M>match({Field, {Func, Value})
M>match({Field, {'=', Value}})
M>


M>был приведен совсем другой код, разбирающи списки

Обращаю внимание, что вы в этих двух примерах непринужденно перешли с одного языка на другой, насколько я понимаю.

M>На пример

M>
M>{ok, {{Version, 200, ReasonPhrase}, Headers, Body}}
M>


M>будет приведена совсем третья функция, разбирающая эту структуру.

Для второго и третьего примера функция одна как я уже писал. validate и проход по циклу использовался для уточнения условий задачи.

M>И каждй раз программисту (особенно новому) придется разбираться — что делает тот или иной цикл, те десять функций equals, тот десяток методов matches и т.п.

Гм, зачем разбираться? Цикла вообще нет, функции equals тривиальны и многократно описаны до какого-бы-то-нибыло сопоставления с образцом, метод matches тоже один. Странно, что вы не видите, что все это можно легко привести к одному виду.

M>Это мы еще про байндинг переменных не упомянули.

Почему, кстати? Связывание я приводил со своего первого примера.
Re[25]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 28.04.08 21:35
Оценка:
M>>И каждй раз программисту (особенно новому) придется разбираться — что делает тот или иной цикл, те десять функций equals, тот десяток методов matches и т.п.
SR>Гм, зачем разбираться? Цикла вообще нет, функции equals тривиальны и многократно описаны до какого-бы-то-нибыло сопоставления с образцом, метод matches тоже один. Странно, что вы не видите, что все это можно легко привести к одному виду.

Пока этого одного вида пока никто так и не увидел


M>>Это мы еще про байндинг переменных не упомянули.

SR>Почему, кстати? Связывание я приводил со своего первого примера.

Где он был не совсем корректным и не соответствовал условиям задачи.

Кстати, насчет связывания переменных.

[{elem1, elem2}|T]

data.matches(list(elem1, elem2), T)

Что такое T в примере на Java, и откуда оно взялось?
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>


dmitriid.comGitHubLinkedIn
Re[22]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 28.04.08 22:06
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Давай таки по чесному сравним не только два этих отрывка кода, но и то, что за ними стоит


T>Мелкий ликбез по Erlang-у:

Замечу все-таки, что начинал я сравнение не с erlang'ом, а со Scala.
Конечно, мне бы хотелось и продолжать сравнивать со Scala, но возражающие мне в основном используют erlang.
А вникать в отдельный язык ФП с его тонкостями желания нет, поэтому думаю, что непонимания с обеих сторон будет еще немало.

T>Атомы всегда начинаются с маленькой буквы — это просто имена. Больше всего похожи на перечисления в С++

T>Переменные начинаются с большой буквы.
T>Запись [H|T] означает: список из головы H и хвоста T, где T может быть любым списком, в том числе и пустым.
T>Для кортежей {...} такой синтаксис не возможен.
T>Запись [H] означает список из одного элемента H

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>>>

T>Это вполне законченный кусок кода.
T>Т.е. вместо русских комментариев после -> можно написать любое допустимое выражение Erlang-а
T>Кроме того, можно дописать сколько угодно условий, с какими угодно образцами.
T>Можно дописать условие, которое будет совпадать в том случае, если ни один другой образец не совпал.
T>И input_data и совпавшие литералы и забинденные переменные могут быть любого допустимого в Erlang-е типа: числом, сторокой, атомом, кортежем, списком, записью и т.д.
T>Т.о. код не накладывает никаких требований на типы элементов, с которыми мы тут работаем.

SR>>
SR>>if (data.matches(list(elem1, elem2), T))
SR>>if (data.matches(list(L), T))
SR>>if (data.matches(a, b)
SR>>if (data.matches(list(H, T), list(H2, T2))
SR>>if (data.matches(a, list(b, list(c, d)))
SR>>if (data.matches(_, _, _, _, x))
SR>>if (data.matches(list(a, b, c), list(H, T), list(list(H2, T2), d, e)))
SR>>

T>Какого здесь типа будет data — у него как минимум должна быть реализована matches. Т.е. сразу ограничение в сравнении с вариантом Erlang-а
Смешное возражение, data должна иметь matches только для более понятной инфиксной записи, в противном случае можно записать if (matches(data, pattern)).

T>Ладно, давай предположим, что у нас есть некоторый класс PMatcher с функцией matches, которая, принимает 2 параметра, данные и паттерн, в результате выдаёт совпало/несовпало и биндит переменные указанные в шаблоне.

T>Данные понятно — Оbject — чтобы можно было любой тип подавать.
T>Отрывок под это дело переписывается элементарно.
T>Мы не будем придираться, что этот класс и его функцию matches нужно как-то реализовывать и это точно займёт не 2-3 строки. Ведь и в Erlang-е PM не по волшебству берётся.
T>Лучше посмотрим во что выливаются остальные требования.
T>Ну про данные понятно — они должны быть любые.
T>Теперь про шаблон — как его можно записать?
T>Попробуем создавать структуры-шаблоны. Причём, мы хотим от шаблонов как можно большей естественности — т.е. чтобы они как можно меньше отличались от кода, который мы пишем создавая наши структуры.
T>С константами вроде проблем нет.
T>А вот с массивами уже есть: предположим мы хотим нарисовать такой шаблон для массива целых, из 3х элементов, где первый нам не важен (_), второй всегда равен 2 а третий сбиндить в указанную переменную...
new Object[] {_, 2, x}

T>Кажется придётся отказатся от массивов, всё равно нормальные пацаны используют коллекции...
Отказ от массивов не понятен.
T>Едем дальше — Классы.
T>Значит как минимум одно требование у нас есть — в классе должен быть реализован некий метод equals который, как я понимаю, осушествляет глубокое сравнение с учётом биндинга и пропусков (_).
T>Ок. Расширяем Эклипс или НетБинс чтоб она за нас его рисовала.
T>Но этот код уже таки нужно учитывать — т.к. нам таки приходится изменять классы под PM.
Код можно и не писать, я уже приводил пример, вполне можно расширить компилятор.
abstract class Term {};
final class Num extends Term {};
final class Var extends Term {};

@PatternMatching
Term simplify(Term term) {
  if (term.equals(new Num(1))) {
  }
}

И этот компилятор может например добавить необходимый equals в классы, либо переписать simplify на if (term instanceof Num) и т.д.

T>Значит такой способ задания шаблона не катит. Попробуем по другому: для каждого интересующего нас класса можно создать PM-двойника, который бы мы использовали при задании шаблонов. Этим кстати можно даже обойти проблему с массивами.

Я как раз и приводил код с созданием двойников _Term, _Num и .т.д. Но это для кода работающего здесь и сейчас.

T>Наверное тоже можно нагнуть Эклипс и несколькими щелчками получить двойника заданного класса. Правда остаётся неприятная проблема с типизацией. Да и код от этих двойников раздувается...

Не очень понятно, почему беспокоит раздутие кода, если это отдельные классы. Они могут даже отсутствовать в проекте в виде java файлов, сразу в виде class на какой-либо из стадий сборки. Например по WSDL создается весьма объемный код, который не замедляет восприятие всего проекта отдельным разработчиком.

T>Получается, что общий код для поддержки твоего псевдокода по объёму его сильно превосходит, без учёта самого движка сопоставления.

В случае equals и движка-то никакого не надо.
А в случае списков, кортежей нет и общего кода для поддержки.

T>Кстати, а куда будем учитывать плагины которые тоже нужно писать и поддерживать?

А куда будем учитывать код затраченный на поддержку PM в Scala?

T>P.P.S. А ты правда правда считаешь что куски эквивклетны по понятности/объёму, или просто отстаиваешь любимый язык?

Куски очевидно не равны по объему и по понятности, но близки, правда это в коде, который приводил я.
А вот в первом сообщении на которое я отвечал, объемы различались чуть ли не в десятки раз.
Язык Java не является моим любимым.
T>Несколько месяцев назад я примерно с такими же доводами выступал. Правда в качестве псевдокода использовал С++.
Это не псевдокод, повторяю в который раз.
Re[25]: Действительно ли ML языки хороши в компиляторописани
От: Cyberax Марс  
Дата: 28.04.08 22:39
Оценка:
Здравствуйте, SmbdRsdn, Вы писали:

C>>Тонны кода.

SR>Если под тонной понимать тысячу строк, то это в современных условиях ерунда.
SR>Вот если бы речь шла о мегатоннах.
SR>Да и то, достоточно посчитать количество строк в JDK, а люди, тем не менее его легко используют.
Мне плевать сколько кода в JDK. Я его не отлаживаю.

Но мне совсем не плевать, сколько кода придётся читать лично мне.

C>>Нет, это было удивление. Я прекрасно знаю как сейчас работают Java IDE (чай не зря 8 лет на Java пишу...).

SR>И что же вас удивило в генерации кода на IDE?
Меня удивило, что это считается большим плюсом...

C>>Ага. Только и получаются тонны ненужного кода в результате.

SR>Если ненужного зачем генерировать?
Так как в языке нет средств, чтобы этого избежать.
Sapienti sat!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.