let join_opt = fun ?(sep = " ") list ->
let result = ref "" and first = ref true in
let rec join = function
| [] -> ()
| None :: tl -> join tl
| (Some hd) :: tl ->
join tl;
if !first
then first := false
else result := sep ^ !result;
result := hd ^ !result
in
join list; !result