Есть ли более простой способ изменить значение в поле записи subsubsub в Erlang?

Итак, у меня есть довольно глубокая иерархия определений записей:

-record(cat,            {name = '_',           attitude = '_',}).
-record(mat,            {color = '_',          fabric = '_'}).
-record(packet,         {cat = '_',            mat = '_'}).
-record(stamped_packet, {packet = '_',         timestamp = '_'}).
-record(enchilada,  {stamped_packet = '_', snarky_comment = ""}).

И теперь у меня есть энчилада, и я хочу сделать новую, точно такую ​​же, за исключением значения одной из подподзаписей. Вот что я делал.

update_attitude(Ench0, NewState)
  when is_record(Ench0, enchilada)->

    %% Pick the old one apart.
    #enchilada{stamped_packet     = SP0} = Ench0,
    #stamped_packet{packet = PK0} = SP0,
    #packet{cat = Tag0}    = PK0,

    %% Build up the new one.
    Tude1 = Tude0#cat{attitude = NewState},
    PK1 = PK0#packet{cat = Tude1},
    SP1 = SP0#stamped_packet{packet = PK1},

    %% Thank God that's over.
    Ench0#enchilada{stamped_packet = SP1}.

Просто думать об этом больно. Есть ли способ лучше?


person offby1    schedule 27.02.2009    source источник


Ответы (2)


Как предлагает Хайнек, вы можете исключить временные переменные и сделать:

update_attitude(E = #enchilada{stamped_packet = (P = #packet{cat=C})},
                NewAttitude) ->
    E#enchilada{stamped_packet = P#packet{cat = C#cat{attitude=NewAttitude}}}.

Ярив Садан был разочарован той же проблемой и написал Безрассудный, тип, определяющий преобразование синтаксического анализа для записей, который позволит вам написать:

-compile({parse_transform, recless}).

update_attitude(Enchilada = #enchilada{}, Attitude) ->
    Enchilada.stamped_packet.packet.cat.attitude = Attitude.
person archaelus    schedule 27.02.2009

Попробуй это:

update_attitude(E = #enchilada{
    stamped_packet = (SP = #stamped_packet{
      packet = (P = #packet{
        cat = C
    })})}, NewState) ->
    E#enchilada{
      stamped_packet = SP#stamped_packet{
        packet = P#packet{
          cat = C#cat{
            attitude = NewState
    }}}}.

в любом случае, структуры не являются самой мощной частью Erlang.

person Hynek -Pichi- Vychodil    schedule 27.02.2009