Three-way relationships
May. 3rd, 2007 06:43 pmSo, in some programming languages I can say:
x=y=0
To mean "Set y equal to nought and x equal to that[1]". In others, you'd get "Set x equal to one if y is already zero, else zero."
But in what language can I say:
if (x===y==0)
to mean "if x and y are both zero"?
The obvious problem is common operator associativity doesn't work. If the operators are nested binary operators, "y==0" would have to return two values, both the result, and "0".
You could have a system whereby you *did* return a number of things, eg. the result in list[0] and the various operators or other hints in list[1..n], and then let logic decide how to use the hints. That might also be useful where a function really really wants to return two values.
But is there a consistent way of doing this without turning it into an unreadable mess? :)
[1] Non-pedant corner: non-pedants might say "set x and y equal to nought"
x=y=0
To mean "Set y equal to nought and x equal to that[1]". In others, you'd get "Set x equal to one if y is already zero, else zero."
But in what language can I say:
if (x===y==0)
to mean "if x and y are both zero"?
The obvious problem is common operator associativity doesn't work. If the operators are nested binary operators, "y==0" would have to return two values, both the result, and "0".
You could have a system whereby you *did* return a number of things, eg. the result in list[0] and the various operators or other hints in list[1..n], and then let logic decide how to use the hints. That might also be useful where a function really really wants to return two values.
But is there a consistent way of doing this without turning it into an unreadable mess? :)
[1] Non-pedant corner: non-pedants might say "set x and y equal to nought"
no subject
Date: 2007-05-03 06:03 pm (UTC)I shall now be annoyed with myself until I remember where I've seen this...
no subject
Date: 2007-05-03 06:21 pm (UTC)no subject
Date: 2007-05-03 07:51 pm (UTC)no subject
Date: 2007-05-03 09:50 pm (UTC)no subject
Date: 2007-05-03 10:03 pm (UTC)no subject
Date: 2007-05-03 10:52 pm (UTC)no subject
Date: 2007-05-03 10:57 pm (UTC)no subject
Date: 2007-05-03 09:48 pm (UTC)no subject
Date: 2007-05-03 06:06 pm (UTC)This tuple type then exists only in the mind of the source language analyser, so by the time you get to code generation it doesn't cause any additional trouble. And the effect is that you can chain arbitrarily many comparison operators –
x < y == z <= w > k– and the effect will be the same as if you'd written all the comparisons separately and logical-ANDed the results. Except, of course, that any side effects in the expressionsy,zandwwould only be evaluated once.You might have to make a decision about parentheses. It's not clear to me that
(x == y) == zis justifiable on the same grounds of common mathematical idiom that justifyx == y == z. Possibly, therefore, applying parentheses to a magic tuple should also have the effect of discarding its second element. Or possibly one should be even stricter, and merely set a flag in the tuple that disallows the application of a comparison operator to it at all (on the basis that you probably coded that by accident, and would prefer to be told of your mistake than to have the wrong code silently generated).On a related note, a friend of mine some years ago seriously considered writing a language in which a valid syntax for the FOR statement was "FOR 0 <= i < n".
FOR 0 <= i < n
Date: 2007-05-03 06:10 pm (UTC)no subject
Date: 2007-05-03 06:11 pm (UTC)(I haven't worked out where I use zero and where I use nought yet)
no subject
Date: 2007-05-03 06:07 pm (UTC)Then they'd be in for a rude shock the first time they tried to instruct a C compiler to assign
charptr = intptr = NULL;.no subject
Date: 2007-05-03 06:09 pm (UTC)