Re^4: hangman game
by Athanasius (Archbishop) on May 19, 2015 at 10:03 UTC
|
Hello QM,
I assume you’re referring to the comma operator in scalar context, which “evaluates its left argument, throws that value away, then evaluates its right argument and returns that value.” (perlop#Comma-Operator).
A quick Google search found this 2010 discussion: http://stackoverflow.com/questions/2200759/when-is-perls-scalar-comma-operator-useful, in which Jonathan Feinberg suggests that the scalar context comma operator is provided for two reasons:
- As a hangover from C, because Perl was originally derived from C.
- Because it’s useful in cases where you want to execute two or more statements in a syntactic context that allows only a single statement.
Here’s a contrived example:
19:49 >perl -wE "for (my ($i, $j) = (1, 5); $i <= 5; ++$i, --$j) { say
+ abs($i - $j); }"
4
2
0
2
4
19:49 >
Of course, it is quite possible to re-structure that loop without resorting to use of the comma operator in scalar context. But in Perl’s spirit of TMTOWTDI, the ++$i, --$j syntax is provided for convenience. That’s my take on it, anyway.
Hope that helps,
| [reply] [d/l] [select] |
|
|
for (my ($i, $j) = (1, 5); $i <= 5; ++$i + --$j) {
say abs($i - $j);
}
4
2
0
2
4
Which is a bit more unobvious, and not what I was after.
A do { block; } also works, as would almost anything that evaluated the sub-expressions, and throw the result away. A more complicated variable update would look odd though. Probably better to just use a while loop in that case.
Are there any other examples that are more difficult to rewrite without the comma operator?
-QM
--
Quantum Mechanics: The dreams stuff is made of
| [reply] [d/l] [select] |
Re^4: hangman game
by soonix (Chancellor) on May 19, 2015 at 11:13 UTC
|
I'm trying to remember the other language where the final semicolon is wrong.
Pascal, at least "earlier versions of" ( Wikipedia supports my recollection).
To me, it seemed totally logical at that time, because we were shown the syntax diagrams.
| [reply] |
|
|
Pascal, ...
Yes, probably so. It was a statement separator, and not a terminator. And since a null statement was not allowed, a dangling separator was a syntax error.
I recall working on various proprietary systems that used a derivative of Pascal (probably because in the beginning "engineers" weren't expected to be "programmers" of any skill). And the implementers took the standard to heart, at least as far as syntax. But adding the Pascalish features, such as records and sets and pointers, was usually left off. So it was often little more than Basic with a different syntax.
Which also reminds me of one of the TI calculators that was programmable in BASIC (which one?). There was a ROM module that added Pascal -- but it was just a syntax mapper, and was stuck with the BASIC features only.
-QM
--
Quantum Mechanics: The dreams stuff is made of
| [reply] |
Re^4: hangman game
by Happy-the-monk (Canon) on May 19, 2015 at 10:02 UTC
|
Perhaps someone can point up an example where it's helpful?
You will need it to create lists, for one, as in: ( 1, 5, 17 )
Otherwise it allows you to avoid blocks in unusual places like: do_whatever and log_this, dump_that;
Cheers, Sören
Créateur des bugs mobiles - let loose once, run everywhere.
(hooked on the Perl Programming language)
| [reply] [d/l] [select] |
|
|
You will need it to create lists, for one, as in: ( 1, 5, 17 )
No, that's a separator. A comma operator essentially says "expression; expression", as best I can tell.
-QM
--
Quantum Mechanics: The dreams stuff is made of
| [reply] |
Re^4: hangman game
by Ralesk (Pilgrim) on May 19, 2015 at 09:55 UTC
|
| [reply] |
|
|
No, nothing as new as Rust.
-QM
--
Quantum Mechanics: The dreams stuff is made of
| [reply] |