The issue with introducing special purpose symbols is it breaks orthogonality. And history has taught us this is often a very bad thing.
For those not familiar with orthogonality, let me give a simplified explanation (taken from IBM vs DEC but using made up operations for simplicity)
IBM built a processor with instructions to move data between registers (say, A, B) and memory (say &m).
They had instructions like this:
MVmA &m // move memory value to A register
MVmB &m // move memory value to B register
MVA &m // move A register value to memory
MVB &m // move B register value to memory
MVAB // move A register value to B register
MVBA // move B register value to A register
This was non-orthogonal, multiple instructions each with their own syntax.
DEC took a different approach, using just one instruction with one syntax
MV x,y
But you could use this instruction in any way that made sense.
MV A,B // move A register value to B register
MV B,A // move B register value to A register
MV A,&m // move A register value to memory
This is the orthogonal approach and with it you could do more with less, for example:
MV &m1, &m2 // Move value from memory location 1 to memory location 2
Despite having 6 different MV operations, the IBM way didn't have a way of achieving this memory to memory move. Instead, you had to move from memory to register, and then from register to different memory.
This is the power of orthogonality.
Now consider the subject of this question.
We have:
&& // combine values with boolean logic
And in normal use we have
, // separate values (eg: parameters, array items)
Yet in this question we have
var a: Bool
var b: Bool
if a && b {
//todo
}
if a, b {
//todo
}
That is, a combine operator and a separator operator being functionally equivalent. It's really quite horrible, no?
I appreciate the difficulty language designers face. Take a quick scan across your keyboard and note how virtually all the symbols are already assigned some semantic meaning. What's a designer to do?
Perhaps the back-tick is still available and could be given the semantic meaning - true if enclosed assignment succeeds, to give:
if (a && `let b = optionalB`) {
// to do
}
Or then again, perhaps not!
But all I was trying to say was that between the two, && retains orthogonality better and so for me is the better choice when the features of ',' (eg: assignment) are not being used.