LINUX.ORG.RU

[erlang] проблемы с pattern matching?

 


0

1

Очень странно ведет себя сравнение с образцом при определенных обстоятельствах... Есть запись (record) rec, из процесса A посылается сообщение процессу B:

B ! {rec, Rec}, % Rec - запись rec
Сообщение посылается именно этим кодом, я проверял.

В процессе A:

receive
  {rec, Rec} ->     % Эта ветвь НЕ выполняется
    work_1(Rec);
  {norec} ->
    work_2();
   A ->             % ВЫПОЛНЯЕТСЯ ЭТО
    {rec, Rec} = A, % ошибки  НЕ происходит, все работает
    work_3(Rec)
end,

В процессе B записи хранятся в array. Если попробовать воспроизвести ситиацию отдельно - все работает, как ожидается.

PS Система достаточно запутанная и императивненькая, я новичок...

★★

Последнее исправление: Dimanc (всего исправлений: 2)
Ответ на: комментарий от lazyklimm

>а почему ты посылаешь не экземпляр записи?

Хм... ну может не быть записи, тогда высылается сообщение {norec}.
А вообще, разве не плохой стиль программирования посылать сообщение без атомов, указывающих, что оно содержит?

Dimanc ★★
() автор топика
Ответ на: комментарий от Dimanc

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

Dimanc ★★
() автор топика
Ответ на: комментарий от Dimanc

я в эрланге конечно слабо соображаю, но мне кажется посылка сообщения должна выглядеть примерно так:

B ! #rec{}

lazyklimm ★★★★★
()
Ответ на: комментарий от Dimanc

Все работает, если пишется отдельно, а в составе большой системы - нет.

Dimanc ★★
() автор топика

Покажи код (несколько строчек) вокруг кода посылки и получения, а то мало ли...

anonymous
()
Ответ на: комментарий от anonymous

Покажи код (несколько строчек) вокруг кода посылки и получения, а то мало ли...

Мало ли что? %я в стартовом сообщении поменял app на rec, но это не важно... Получатель того сообщения:

...
if (App == noapp) ->
  Buf ! {get_next},
  receive
	{noapp} ->
		NApp = noapp,
		NQnt = 0;
	{app, App} ->
		NApp = App,
		NQnt = ?QUANT;
	A ->
		{app, NApp} = A,
		NQnt = ?QUANT
  end;
true ->
...

Отправитель:

receive
...
	{get_next} ->
	    NQ = Q,
	    if Sz > 0 ->
		    {app, App} = array:get(Sz - 1, Q),
		    Proc ! {app, App},
		    NSz = Sz - 1,
		    NMin = calc_min_force(Q, NSz - 1);
	       true ->
		    Proc ! {noapp},
		    NSz = Sz,
		    NMin = 0	       
	    end;
...
end

Dimanc ★★
() автор топика
Ответ на: комментарий от WFrag

>Совершенно случайно App не забинден ли уже в момент receive (см if (App == noapp) чуть выше)?

Да, именно! Варнингов не было (и не должно), а я что-то не заметил. Спасибо.

Dimanc ★★
() автор топика

Я вот не понимаю, почему сразу пинают платформу, коль вообще не в курсе дел. Erlang --- Ъ-интерпрайз. В таких базовых вещах багов нет. В передачи сообщений, линковке и тп тоже --- нет.

anonymous
()
Ответ на: комментарий от anonymous

И вообще, нефиг использовать if. Забудь о нем. Раз и навсегда. И код конечно адов. Императивщина так и прет.

anonymous
()
Ответ на: комментарий от anonymous

>И код конечно адов. Императивщина так и прет.

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

Dimanc ★★
() автор топика
Ответ на: комментарий от Dimanc

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

anonymous
()
Ответ на: комментарий от anonymous

>if/case и вообще все вычисляет значение

И что? С чего ты взял, что я этого не понимаю?

Dimanc ★★
() автор топика
Ответ на: комментарий от anonymous

>Какой смысл матчить один атом в кортеже?

{get_next} -> ...


почему не просто get_next -> ... ?


А есть принципильная разница?

Dimanc ★★
() автор топика
Ответ на: комментарий от Dimanc

Как по мне коряво выглядит и не имеет смысла, лишние скобки, хотя дело твое.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.