# Select case to set a variable

Here is a thought inspired by the conditional expressions threads. I usually use select case to set a variable based on the value of another variable or expression, for example

select case (dist)
case ("normal")  ; yy = one_over_sqrt_two_pi * exp(-0.5*xx**2)
case ("Laplace") ; yy = 1/(sqrt_two)*exp(-sqrt_two*abs(xx))
case ("sech")    ; yy = sech(pi_over_2*xx)/2
case ("t5")      ; yy = student_t_density(xx,dof=5.0_dp,mu=0.0_dp,xsd=1.0_dp)
case ("t10")     ; yy = student_t_density(xx,dof=10.0_dp,mu=0.0_dp,xsd=1.0_dp)
case default     ; yy = bad_real
end select

Sometimes the case list is very long, and the programmer may set a variable other than yy by mistake. Iâ€™d like to be able to write something like

yy = select case (dist)
case ("normal")  : one_over_sqrt_two_pi * exp(-0.5*xx**2)
case ("Laplace") : 1/(sqrt_two)*exp(-sqrt_two*abs(xx))
case ("sech")    : sech(pi_over_2*xx)/2
case ("t5")      : student_t_density(xx,dof=5.0_dp,mu=0.0_dp,xsd=1.0_dp)
case ("t10")     : student_t_density(xx,dof=10.0_dp,mu=0.0_dp,xsd=1.0_dp)
case default     : bad_real
end select

where it is guaranteed that yy is set. Select case can be viewed as a restricted form of an if-then-elseif-endif block that depends on a single expression, and I think it would be convenient and safer to have a further restricted form that sets a single variable.

1 Like

I really like this idea, and suggested something similar on the GitHub.

This is a problem with the â€śkeywordâ€ť form of conditional expressions, in my view. If an if-statement can return a value, why not select case, or block, or a do-loop? Thatâ€™s probably doable, but it would make for a very different language.

1 Like

This idea is very similar to pattern matching in Scala. Iâ€™ve talked to some people that think this is the best feature of Scala.

1 Like

A shortcoming of the â€śkeywordâ€ť form is that it â€ślooksâ€ť a lot like an IF construct. Insert a few strategically located â€ś;â€ť characters and it IS an IF construct. If you donâ€™t like that aspect, I can refer you to the C Lang Retail Shop down the street where they have a ternary operator syntax that has been time-tested for decades, and still available. (cond ? expr_if_true : expr_if_false).

1 Like