[erlang-questions] clarify: how to express this elegantly

Richard Carlsson <>
Tue Dec 4 22:17:57 CET 2007


There are (at least) two variants.

Version 1:

    case is_plottable(Value) of
        true ->
            ?D, circuit_monitor:plot_node_value(..., Value);
        false ->
            throw(unplottable_value)
    end
    ...

is_plottable("state") -> true;
is_plottable("rx_bit_rate") -> true;
...
is_plottable("rtt") -> true;
is_plottable(_) -> false.


Version 2:

    Plot = fun () ->
            ?D, circuit_monitor:plot_node_value(..., Value)
           end,
    case Value of
        "state" -> Plot();
        "rx_bit_rate" -> Plot();
        ...
        "rtt" -> Plot()
    end

Also, it's probably better if you can transform the strings to atoms
when you read them, because a switch over atoms is much more efficient
than a switch over strings.

  /Richard


Matej Kosik wrote:
> Friends,
> 
> I wander, how can I express this:
> 
>     case Value of
>         "state" ->
>             ?D,
>             circuit_monitor:plot_node_value(CircuitMonitorPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             );
>         "rx_bit_rate" ->
>             ?D,
>             circuit_monitor:plot_node_value(CircuitMonitorPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             );
>         "tx_bit_rate" ->
>             ?D,
>             circuit_monitor:plot_node_value(CircuitMonitorPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             );
>         "ebno" ->
>             ?D,
>             circuit_monitor:plot_node_value(CircuitMonitorPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             );
>         "packetloss" ->
>             ?D,
>             node_pinger:plot_node_value(NodePingerPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             );
>         "rtt" ->
>             ?D,
>             node_pinger:plot_node_value(NodePingerPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             )
>     end
> 
> more elegantly. Via some kind of "variant patterns" such as:
> 
>     case Value of
>         "state" | "rx_bit_rate" | "tx_bit_rate" | "ebno" ->
>             ?D,
>             circuit_monitor:plot_node_value(CircuitMonitorPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             );
>         "packet_loss" | "round_trip_time" ->
>             ?D,
>             node_pinger:plot_node_value(NodePingerPid, Socket,
>                 RequestId, CircuitId, FromDateTime, ToDateTime, Width, Height, Value
>             )
>     end
> 
> but these do not exist :(
> These "variant patterns" could be introduced without any problems in special cases when neither
> variant contains unbound variable.
_______________________________________________
erlang-questions mailing list

http://www.erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list