what is wrong with this code setting a nested record?

Håkan Stenholm <>
Thu Jul 21 02:39:31 CEST 2005


MEENA SELVAM wrote:

>Hi,
>
>the parameter A is of record type arg, which contains
>a subrecord of type, headers and which has a field
>host:
>
>The host field initially contains www.msn.com, and I
>am trying to overwrite with 47.80.18.95, but the
>following code doesnt work.. it still has www.msn.com
>itself.
>
>display_login2(A, ReplyMsgs, URL, IP, FromLogout) ->
>
>    (A#arg.headers)#headers{host="47.80.18.95"},
>
>am i doing anything wrong here?
>  
>
It should work (see my test code below), but may have forgotten to do:

          NewHeader = (A#arg.headers)#headers{host="47.80.18.95"},
          ...
          xxx(NewHeader, ...)  %% use the new (updated) Header rather 
than the old one in A
          ...

It would be helpful to see a bit more of your code, I get the feeling 
that your trying to do a destructive update on a record in a single 
assignment language, this won't work - data elements in Erlang can only 
be created but never modified[1] (with the exception for 
ets/mnesia/process dictionaries which can conceptually be viewed as 
processes storing data in some regular Erlang data type like a binary 
tree - which is updated by creating new nodes and leaves to replace the 
old ones - rather than overwriting old ones).

[1] : deletion is done by the GC.

================== test.erl =====================

-module(test).

-export([test/0]).

-record(foo, {
         bar
         }).

-record(bar, {
          a,
          b
         }).

test() ->
    Bar = #bar{a = 1, b = 2},
    Foo = #foo{bar = Bar},

    io:format("Foo = ~p~n", [Foo]),

    %% create new bar record
    %% access foo record and create new bar record based on foo.bar
    Bar2 = (Foo#foo.bar)#bar{b = new_val},
    io:format("Bar2 = ~p~n", [Bar2]),

    %% create new foo record
    %% create new foo record containing the new Bar2 bar record
    Foo2 = Foo#foo{bar = Bar2},
    io:format("Foo2 = ~p~n", [Foo2]),

    ok.

================== test.erl =====================

2> c(test).
{ok,test}
3> test:test().
Foo = {foo,{bar,1,2}}
Bar2 = {bar,1,new_val}
Foo2 = {foo,{bar,1,new_val}}
ok

>meena
>
>
>__________________________________________________
>Do You Yahoo!?
>Tired of spam?  Yahoo! Mail has the best spam protection around 
>http://mail.yahoo.com 
>
>  
>




More information about the erlang-questions mailing list