I
Ian Kelly
My language combines generators and collection initializers, instead of
creating a whole new syntax for comprehensions.
[| for i in 0..10: for j in 0.10: yield return i * j |]
Are we supposed to intuit what that means?
Is | a token, or are the delimiters [| and |] ?
Is there a difference between iterating over 0..10 and iterating over
what looks like a float 0.10?
What is "yield return"?
I would assume that "yield return" is borrowed from C#, where it is
basically equivalent to Python's yield statement. The advantage of
using two keywords like that is that you can compare the statements
"yield return foo" and "yield break", which is a bit clearer than
comparing the equivalent "yield foo" and "return".
Having to type out "yield return" in every comprehension seems a bit
painful to me, but I can understand the approach: what is shown above
is a full generator, not a single "generator expression" like we use
in Python, so the statement keywords can't be omitted. It's trading
off convenience for expressiveness (a bad trade-off IMO -- complex
generators should be named, not anonymous).
That does not follow. Lambdas and def functions are the same thing in
Python, but Python requires a special keyword.
I think the implication is that Unit has only one syntax for creating
functions, which is lambda-style. In any case, why does Python
require a special keyword? def is only used in a statement context,
and lambda is only used in an expression context. Why not use the
same keyword for both? I think the answer is historical: def came
first, and when anonymous functions were added it didn't make sense to
use the keyword "def" for them, because "def" implies a name being
defined.
Cheers,
Ian