[erlang-questions] Re: The If expression

James Aimonetti <>
Fri Apr 23 01:25:16 CEST 2010


Thanks Richard, the feedback is much appreciated. I have a couple
different places where your multi-generator syntax would indeed be
useful.

James

On Thu, Apr 22, 2010 at 6:14 PM, Richard O'Keefe <> wrote:
>
> On Apr 23, 2010, at 2:28 AM, James Aimonetti wrote:
>
>> This thread is well-timed as I have an issue I wanted some help on.
>>
>> I have two lists, one of keys and one of values. I want to zip them
>> together, but I have one specific key/value combo that I want to exclude
>> from the zipped list. For context, this is creating an appropriate
>> {proplist} for couchbeam.
>>
>> to_couchbeam(Fields, Values) ->
>> { lists:flatten( lists:zipwith(fun to_couchbeam_zipper/2, Fields, Values)
>> ) }.
>>
>> to_couchbeam_zipper(F, V) ->
>> K = to_couchbeam_key(F),
>> Val = to_couchbeam_value(V),
>> case Key == <<"_rev">> andalso Val == undefined of
>>  true -> [];
>>  false -> {K, Val}
>> end.
>
> to_couchbeam([], []) ->
>    [];
> to_couchbeam([Field|Fields], [Value|Values]) ->
>    Key = to_couchbeam_key(Field),
>    Val = to_couchbeam_value(Value),
>    Tail = to_couchbeam(Fields, Values)
>    case {Key,Val}
>      of {<<"_rev">>, undefined} -> Tail
>       ; Pair                    -> [Pair|Tail]
>    end.
>
> What have 'true' or 'false' to do with it?
> It's <<"_rev">> and 'undefined' you want to watch out
> for, so it's they that belong in the case.
> Why build a list including stuff you don't want,
> and then strip it out?
>
> What we really want here is EEP 19
> (http://www.erlang.org/eeps/eep-0019.html)
>
> to_couchbeam(Fields, Values) ->
>    [Pair || F <- Fields && V <- Values,
>             Pair = {to_couchbeam_key(F), to_couchbeam_value(V)},
>             Pair =/= {<<"_rev">>,        undefined}].
>
> (THAT IS NOT LEGAL ERLANG RIGHT NOW.)
>
> If you are willing to build a list and then squish out the
> element you don't want, then
>
> to_couchbeam(Fields, Values) ->
>    P = fun (K,V) -> {to_couchbeam_key(K), to_couchbeam_value(V)} end,
>    lists:delete({<<"_rev">>,undefined}, lists:zipwith(P, Fields, Values)).
>
> seems like the best that can be done.
>
>
>


More information about the erlang-questions mailing list