-- On 17 Nov 2002 11:09:53 -050 Bryan C. Warnock wrote: >On Wed, 2002-11-13 at 13:26, Angel Faus wrote: >> >> There are many ways to specify literal numeric values in perl, but >> they default to base 10 for input and output. Once the number has > >Surely, Perl 6 will allow changing the radix on a more global scale.
Of course it will! But just about anything acn be changed with a grammer munge. Theoretically Perl 5 could add radix notation with a source filter. But we don't have to document that. I think that we should avoid refering to pragmas and modules as much as possible in the core documentation. That's a departure from Perl 5. Here's my case: * Were writing the spec. While that doesn't give us licence to be dense and unreadable, we should leave common case information (like documenting the radix pragma) for the tutorials. * Perl 6 will likely not have a standard set of modules and pragmas. As that is the case, we can't assume modules and pragmas in the docs. * Perl 6 can do just about any wild and crazy thing with a grammer munge. Instead of documenting pragmas like radix piecemeal, we should be beating the concept that a use declaration means all bets are off into everybody's heads (beating in a pleasant metaphorical sense. of course). When a use is seen that modules documentation should be grabbed, not the core docs. -Erik > >use radix(16); # or something of the ilk > >in which case, the default (ie, non-prefixed) radix will be some >property, which itself defaults to base 10. > >In any case, you should present the radix prefix semantics globally, >and then indicate when and where you can imply the radix. > >That will alleviate confusion on some of the fringe cases - or perhaps >the confusion is only mine. :-) > > >> been read by perl it becomes just a magnitude. That is it loses all >> trace of the way it was originally represented and is just a number. >> This code for instance prints the literal value 14. >> >> my $x = 14; # stores the integer 14 in $x >> print $x; >> >> You can represent the literal value in any other base, using the >> C<radix:dddddddd> syntax. >> >> For example: >> >> my $i = 2:101110; # binary >> my $j = 3:1210112; # tertiary >> my $k = 8:1270; # octal >> >> Printing these would give 46, 1310, and 696 respectively. When the >> base is greater than 10, there is a need to represent digits that are >> greater than 9. >> >> You can do this in two ways: >> >> =over >> >> =item * >> >> Alphabetic characters: Following the standard convention, perl will >> interpret the A letter as the digit 10, the B letter as digit 11, and >> so on. >> >> my $l = 16:1E3A7; # hexadecimal >> >> =item * >> >> Separating by dots: You can also write each digit in its decimal >> representation, and separate digits using the C<.> character. >> >> my $m = 256:255.255.255.0; # 256-base >> >> =back >> >> For example, the integer 30 can be written in hexadecimal base in two >> equivalent ways: > >Do these ways have names? > >> >> my $x = 16:1D >> my $x = 16:1.14 >> >> These two representations are incompatible, so writing something like >> C<16:D.13> will generate a compile-time error. >> >> Also note that a compile-time error will be generated if you specify a >> "digit" that is larger than your radix can support. For instance, >> >> my $x = 3:23; # error > >How does one specify a single digit in the... that second one there. >The extended notation. > >my $x = 16:12; # 10:18 >my $x = 16:12.; # 10:12 ? > >Also, given an implied radix, can one use the second extended notation? > >my $x = 4.5; # Same as 45 in base 10 > >use radix(16); >my $x = 14.8.10; # Same as 0x0d8a; > >If so, what about the two digit ambiguity? > >> >> Finally, you can create negative integers by prepending the C<-> >> character. > >To what? To the digits? To the radix? > >> >> For example: >> >> my $x = 18; >> my $y = -18; > >my $x = 10:18; >my $y = -10:18; >my $z = 10:-18; > >On one hand, you've negated a base 10 number. OTOH, you've got a base >10 negative number. I can think in both directions, but I'm afraid >some folks may be confused with the first, whereas the second is clear >and just as messy. > > >> >> Perl allows the underline character, C<_>, to be placed as a separator >> between the digits of any literal number. You can use this to break >> up long numbers into more readable forms. There aren't any rules to >> it; you can use it however you like: >> >> 123_456_000.000 (floating point) >> 2:0110_1000 (binary) >> 16:FF_88_EE (hexidecimal) >> >> =section ** Floating-Point Numbers >> >> You can use the decimal representation of the number and the standard >> exponental notation. >> >> my $x = -2.542; >> my $x = 7.823e12; > >Not wanting implementation to drive the language, but the parsing of >integer and numerical values may all be built upon above. Going back >to above, is radix parsing core to numerical parsing? (IOW, is a radix >prefix possible *everywhere* an integer is wanted, or is radix notation >its own beastie which then wants an integer type? [Much of the same >argument as above with negative numbers.]) > >my $x = 7.832e16:D; # error? > >> >> Perl lets you operate integer numbers with floating-point numbers, so >> the following operation is correct: >> >> print 3.5 + 2; # prints 5.5 >> >> You can use the C<_> separator too in Floating-Point numbers: >> >> my $x = 1312512.25; # floating-poing number >> my $x = 1_312_512.25; # the same > >1_234.345_123 > >1_345.678_123e1_345; > >> >> =section ** Pseudo-numbers >> >> The terms C<+Inf> and C<-Inf> represent positive and negative >> infinity; you may sometimes use these to create infinite lists. >> >> The value C<NaN> ("Not a Number") may be returned by some functions >> or operations to represent that the result of a calculation (for >> example, division by zero) cannot be represented by a numeric value. >> >> =section * Literal strings >> >> Duble quotes or single quotes may be used around literal strings: >> >> print "Hello, world"; >> print 'Hello, world'; >> >> However, only double quotes "interpolate" variables and special >> characters such as newlines ("\n"): >> >> print "Hello, $name\n"; # works fine >> print 'Hello, $name\n'; # prints $name\n literally >> >> my $x = 'world'; >> print "Hello, $x"; # Hello, world >> >> You can type any character including newlines and tabs in literal >> strings: >> >> my $x = 'Look mum, I can type >> newlines and tabs too!'; >> >> If you use a Unicode editor to edit your program, Unicode characters >> may occur directly within the literal strings. >> >> Unicode characters can also be added to a double-quoted string using >> the C<\x{...}> notation. The Unicode code for the desired character, >> in hexadecimal, should be placed in the braces. For instance, a >> smiley face is C<\x{263A}>. >> >> Perl provides escapes for easily inserting characters that have a >> codepoint below 256: >> >> print "\xB" # Hexadecimal - character number 16:xB >> print "\024" # Octal - character number 8:33 >> >> Aditionally, you can use the C<\N{...}> notation and put the official >> Unicode character name within the braces, such as C<\N{WHITE SMILING >> FACE}>. >> >> See the L<quotes> section for a full explanation of the interpolation >> mechanism and a list of special characters in double-quoted strings. >> >> =section ** String as vector of ordinals >> >> Literals of the form C<v1.2.3.4> are parsed as a string composed of >> characters with the specified ordinals. This is an alternative, more >> readable way to construct (possibly unicode) strings instead of >> interpolating characters, as in C<\x{1}\x{2}\x{3}\x{4}>. The leading >> C<v> may be omitted if there are more than two ordinals, so C<1.2.3> >> is parsed the same as C<v1.2.3>. > >See numerical comment above about the implied radix. > > >-- >Bryan C. Warnock >bwarnock@(gtemail.net|raba.com) > ____________________________________________________________ Get 25MB of email storage with Lycos Mail Plus! Sign up today -- http://www.mail.lycos.com/brandPage.shtml?pageId=plus