On Wed, Feb 16, 2005 at 02:29:36PM +0800, Autrijus Tang wrote: : Just a quick question. The prettyprinter of Pugs (the thing that : handles the ".perl" method) currently prints out boolean true and : false as #t and #f, which is obviously not correct. : : pugs> (1 > 2, 2 > 1) : (#f, #t) : : What should I do, though? Inventing two primitives, "true" and : "false"? Or is there a way to annotate values with types, similar : to Haskell's "::" construct? : : pugs> (1 > 2, 2 > 1) : (0 as Bool, 1 as Bool)
The latest S12 has it as bool::true and bool::false. (In general, you can print out any enum as "role::identifier".) When unambiguous, bare "true" and "false" can be used, but in any event the use of symbolic booleans is somewhat discouraged in Perl because it leads people to write stupidities like while foo() == true {...} Instead, we try to make sure all types know how to behave in boolean context directly. Any object that does the "bool" role has an attribute of type "bit", which will return 0 if the object is false, and 1 if the object is true. (The optimizer is free to optimize away the method call if it can, of course. Native integers and floats are always true if non-zero, for instance. But object types can always be derived from, or have "but true" mixed into them.) Larry