11 ms·
Interesting proposal, but I'm cringing at yet another overload for the * symbol. a * b == "a times b" a * * b == "a to the power of b" f(* a) == "call f by f
by aparmentier 6y ago
Interesting proposal, but I'm cringing at yet another overload for the * symbol.
a * b == "a times b"
a * * b == "a to the power of b"
f(* a) == "call f by flattening the sequence a into args of f"
f(* * a) == "call f by flattening the map a into key value args for f"
[* a] == "match a sequence with 0 or more elements, call them a"
Am I missing something? I know these all occur in different contexts, still the general rule seems to be "* either means something multiplication-y, or means 'having something to do with a sequence' -- depends on the context". It's getting to be a bit much, no?
Note: HN is making me put spaces between * to avoid interpretation as italics.
- duckerude 6y agoIt's already used that way for unpacking, e.g. >>> [x, *other] = range(10) >>> x 0 >>> other [1, 2, 3, 4, 5, 6, 7, 8, 9] So this instance of the syntax is not that novel. If it's a mistake, it's too late to fix it. A unary asterisk before a name means the name represents a sequence of comma-separated items. If it's a name you're assigning to (LHS) that means packing the sequence into the name, if it's a name you're reading from (RHS) that means unpacking a sequence out of the name.
- heavenlyblue 6y agoYou can also do [a, * b] when constructing a list so that b would be injected into that list after a - makes total sense.
- strbean 6y agoYou're missing def f(*args, **kwargs): doing the opposite of f(*a) f(**a)
- dragonwriter 6y ago> Am I missing something? Yes, the form used in function declaration (the inverse of the form in function calls) which is pretty much exactly the same as the new use, “collect a sequence of things specified individually into a list with the given name”.
- maxnoe 6y agoYes, that it is pretty much already part of the language like this. This works: a, *b = (1, 2, 3, 4) b will be [2, 3, 4]
- just-ok 6y agoNot only that, but this also works! a, *b, c = (1, 2, 3, 4) a == 1, b == [2, 3], c == 4