Re[13]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 25.04.08 10:47
Оценка:
M>>Правильно. И такой код придется писать каждый раз заново для любой более-менее тривиальной смены структуры передаваемых данных.
SR>Какой такой? Цикл по списку? Так это аналог рекурсии по списку, которую тоже придется писать каждый раз.

При этом с ПМ рекрсия по списку тривиальна


M>>То есть. Для исхдного примера
Автор: z00n
Дата: 14.12.07
придется реализовывать метод equals для term,

SR>Метод equals легко автоматизируется, также как создание getter, setter и конструктора по полям в eclipse.

{ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
      http:request(...
      
{ok, {_, _, Body}} = http:request(...


{ok, {_, 200, _}, _, _} = http:request(


Какой-какой автоматизированый equals мне поможет это написать?


SR>Я уж молчу про поддержку со стороны компилятора.


Я тоже умолчу

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

SR>Странно, стороннику ФП не нравятся отдельные функции. Ну раз не нравятся объедините в одну большую.

В какую ону большую? В Tom что ли?

M>>для менее тривиального примера
Автор: z00n
Дата: 24.04.08
придется еще как-нибудь изворачиваться.

SR>Пример не более тривиален чем исходный.

     | {i,FLT,{'Break',s}} :: z -> return best(emit(sb,s),n,k+#s,z)
     | {i,BRK,{'Break',_}} :: z -> return best(nl(sb,i),i,i,z)
     | {i,FLT,{'Group',x}} :: z -> return best(sb,w,k,{i,FLT,x}::z)


это, я так понимаю, предлагается переписать в виде
if(term.m == FLT && term.cell.type == 'Break' && term.cell.data == s)
{
}
else if(term.m == BRK && term.cell.type == 'Break')
{
}
else if(term.m == FLT && term.cell.type == 'Group' && term.cell.data == x)
{
}


?

M>>А ПМ позвлит все задачи решить декларативно. Это не магическая пуля, конечно, писать все равно придется Но каждый раз это будет легко и — главное! — одинаково.

SR>Так все задачи или не магическая пуля?

Любая, где требуется разбор структур (данных). Сопоставление с образцом — это унифицированый подход к разбору произвольных структур(данных)


M>>Просто if поможет только сравнить значения. ПМ позволит наглядно сравнить и структуру и значения.

SR>Какая структура в вашем-то примере?

rules_list         = [fields_and_rules]
fields_and_rules   = [field_rules]
field_rules        = {field} | {field, Rules}
Rules              = Rule | [Rule]
Rule               = function | OperatorRule | FunctionRule
OperatorRule       = {Operator, value} | (Operator, field)
Operator           = '=' | '/=' | '<' | '=<' | '>' | '>='
FunctionRule       = {function, value} | {function, field}


Как придумал, так и записал. Более того, реализация сильно похожа на то же самое

Но у меня, безусловно, простой пример. А есть посложнее. Типа того, что я привел в самом начале.
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>


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