Re: Why doesn't % interpolate?
by no_slogan (Deacon) on Apr 18, 2003 at 19:40 UTC
|
If % interpolated, printf would be kind of hard to use, wouldn't it?
printf "%d\n", $x; # interpolate %d?
printf '%d\n', $x; # don't replace \n?
printf "\%d\n", $x; # ick
printf '%d'."\n", $x; # double ick
Perl6 is supposed to allow %vars to interpolate... anyone heard the latest thinking on how they're going to keep printf sane? | [reply] [d/l] |
|
If % interpolated, printf would be kind of hard to use, wouldn't it?
This does not explain why % does not interpolate; rather it shows that the choice of % as a meta character in printf is a bad one given that % is a sigil. If pritnf used a different meta character (^ for example), then this would work:
printf "^d\n", $x; # no problem
printf "%d\n", $x; # interpolate, no problem
printf '^d\n', $x; # ok
printf '%d\n', $x; # does not interpolate, ok too
So, you can make % interpolate without making printf any harder to use (using ^ instead of % is not harder, just different), you just rather keep printf the way it is (so that people don't get angry).
| [reply] [d/l] |
|
Well, you should realize that printf was in
Perl before hashes were first class objects with
their own sigil.
Abigail
| [reply] [d/l] |
|
|
|
|
This does not explain why % does not interpolate...
I think it shows why making hashes interpolate would be a bad idea (given the current state of affairs), which amounts to the same thing.
... rather it shows that the choice of % as a meta character in printf is a bad one given that % is a sigil
Unfortunately, it's hard to make all those design choices up front, and now we're pretty much stuck with them. Larry could decide to change the printf escape character for Perl6. It would make it difficult to mechanically translate Perl5 programs that use non-constant printf format strings to Perl6, but maybe he'd find that acceptable. Changing the hash sigil at this point would be a much bigger problem.
printf '%d\n', $x;
To make this work, you'd need to have printf itself interpret the \n escape. That could be done, but it makes me nervous. Newbie programmers seem to have a hard enough time understanding escape sequences without muddying the water this way. I can just hear it: "Why does printf 'foo\n' work, but not print 'foo\n'?" Plus, if you actually wanted to printf a literal backslash, you'd need to put four backslashes in your code. Yuck.
Maybe there could be a new printf directive for a newline.
printf '%d%n', $x;
| [reply] [d/l] [select] |
|
|
Re: Why doesn't % interpolate?
by chromatic (Archbishop) on Apr 18, 2003 at 19:24 UTC
|
Maybe it's tricky to find the right representation. Do you want just the keys? Just the values? Keys mixed with values? Does order matter?
Converting an array to a list is pretty sensical, but converting a hash to a list is a little different. (Think in terms of pairs.)
| [reply] |
|
| [reply] |
|
printf "%d %s %f\n", $int, $str, $float;
because that would try to interpolate three hashes.
However, it's still relative simple to interpolate a hash:
print "@{[%hash]}";
Abigail | [reply] [d/l] [select] |
|
|
|
Re: Why doesn't % interpolate?
by theorbtwo (Prior) on Apr 19, 2003 at 07:08 UTC
|
Historicly, BTW, note that the interpolation of scalars has been there since the beginning (I think), whereas interpolation of arrays is rather new (5.0 partialy, normalized somwhat in 5.6, thanks, toma).
Warning: Unless otherwise stated, code is untested. Do not use without understanding. Code is posted in the hopes it is useful, but without warranty. All copyrights are relinquished into the public domain unless otherwise stated. I am not an angel. I am capable of error, and err on a fairly regular basis. If I made a mistake, please let me know (such as by replying to this node).
| [reply] |
|
| [reply] |
Re: Why doesn't % interpolate?
by dragonchild (Archbishop) on Apr 21, 2003 at 13:59 UTC
|
Another problem with interpolating hashes that hasn't been mentioned yet is that it would be non-deterministic. Arrays will always return the same values, regardless of what order they were put on. (Using unshift vs. push vs. splice vs. assignment vs. etc ...) However, the same cannot be said for hashes.
Also, adding 1..10 to an array vs. 11..20 will still return them in a predictable (a < b) order. Doing that for a hash will not return a predictable ordering.
This matters for testing purposes - I now cannot depend on interpolation to always give me repeatable answers for testing. But, the only thing I can't depend on is hashes. Try explaining that to a newbie.
------ We are the carpenters and bricklayers of the Information Age. Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement. Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified. | [reply] |