''illegal pattern'' when using records in case statement
Ulf Wiger
etxuwig@REDACTED
Thu Feb 6 12:27:09 CET 2003
On Thu, 6 Feb 2003, Richard Carlsson wrote:
>
>On Thu, 6 Feb 2003, Bengt Kleberg wrote:
>
>> i would like to do the following:
>>
>> dpid_to_if(Dp, Domain) ->
>> case Dp of
>> Domain#prswDomain.working_dp ->
>> Domain#prswDomain.working_if;
>> Domain#prswDomain.protection_dp ->
>> Domain#prswDomain.protection_if
>> end.
>>
>> i know the workaround, but why is this an illegal pattern?
>
>What your attempted pattern wants to test (i guess) is that
>"in case Dp is *the 'working_dp' element of* the
>'prswDomain'-record Domain ...", but that would be
>equivalent to:
>
> case Dp of
> element(5, Domain) -> ...
>
>To be more formalistic about why that can't be made into a
>pattern: patterns describe the static skeleton of the data
>(counting pre-bound variables as static), and a pattern
>like this one would not be static.
Why wouldn't it be, if it's an intuitive way to express the
pattern? All suggested alternatives are less intuitive,
IMHO.
Isn't this really an artifact of the syntactic expansion of
record expressions?
One could imagine that the compiler (knowing the size of the
prswDomain record) generate code like this:
dpid_to_if(Dp, Domain) ->
__working_dp = Domain#prswDomain.working_dp,
__protection_if = Domain#prswDomain.protection_if,
case Dp of
__working_dp ->
Domain#prswDomain.working_if;
__protection_if ->
Domain#prswDomain.protection_if
end.
Why whould that not be valid?
/Uffe
--
Ulf Wiger, Senior Specialist,
/ / / Architecture & Design of Carrier-Class Software
/ / / Strategic Product & System Management
/ / / Ericsson Telecom AB, ATM Multiservice Networks
More information about the erlang-questions
mailing list