From: demerphq <demerphq@gmail.com>
To: "Matt Kraai" <kraai@ftbfs.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] gitweb: merge boolean feature subroutines
Date: Sat, 3 Jan 2009 18:41:42 +0100 [thread overview]
Message-ID: <9b18b3110901030941n3aa04e5ejb34c6f82c11bce4c@mail.gmail.com> (raw)
In-Reply-To: <20090103171333.GB4205@ftbfs.org>
2009/1/3 Matt Kraai <kraai@ftbfs.org>:
> On Sat, Jan 03, 2009 at 05:51:50PM +0100, demerphq wrote:
>> 2009/1/3 Matt Kraai <kraai@ftbfs.org>:
>> > I don't think Perl has *a* false value, but rather has multiple values
>> > that are treated as false, such as undef, zero, and the empty string.
>> > Personally, I find 0 clearer than the empty string, but that's
>> > probably just my C bias sneaking in.
>>
>> Yes it definitely does have a false value, PL_sv_no, and a true value,
>> PL_sv_yes (although it is much less important). It is these values
>> which are copied to signify true and false in the cases where the
>> internals need to, such as for boolean operators that must return
>> false, and things like negation and (in)equality checks.
>>
>> It is a so called "dual var" SvPVNV, with 0 in the NV (numeric) slot
>> and the empty string in the PV (string) slot.
>>
>> You can see one example of its behaviour in my previous mail, and can
>> see it further here:
>>
>> $ perl -MDevel::Peek -e'print Dump(shift @ARGV eq "true")'
>> SV = PVNV(0x952eb10) at 0x952b6f0
>> REFCNT = 2147483647
>> FLAGS = (IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
>> IV = 0
>> NV = 0
>> PV = 0x952eae8 ""\0
>> CUR = 0
>> LEN = 4
>>
>> Compare that to:
>>
>> perl -MDevel::Peek -e'print Dump(shift @ARGV eq "true" ? 1 : 0)'
>> SV = IV(0x94d8398) at 0x94bd678
>> REFCNT = 1
>> FLAGS = (PADBUSY,PADTMP,IOK,READONLY,pIOK)
>> IV = 0
>
> Wow, I had no idea about this. Thanks for the information.
>
> It seems like using these values would require obfuscating the code,
> though. :( They only seem to be exposed directly via XS.
Depend how you look at it. You have access to them via the negation
and inequality operators. In a way you can think of the 'not' (or !)
operator as being the "inverted boolean constructor". So for instance
the kind of surprising
my $bool= !!$val;
can be used to get a copy of the appropriate PL_sv_yes/no. But the
need to do is rare. Luckily. :-)
But yeah, they are not exposed directly at the perl level. There is no
keyword to use to generate them like there is for undef/PL_sv_undef,
although I guess it would be fairly easy to expose them in a similar
fashion via Scalar::Util.
cheers,
Yves
--
perl -Mre=debug -e "/just|another|perl|hacker/"
next prev parent reply other threads:[~2009-01-03 17:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-03 15:31 [PATCH] gitweb: merge boolean feature subroutines Matt Kraai
2009-01-03 15:31 ` [PATCH] gitweb: pass the key to the " Matt Kraai
2009-01-03 16:18 ` [PATCH] gitweb: merge boolean " demerphq
2009-01-03 16:40 ` Matt Kraai
2009-01-03 16:51 ` demerphq
2009-01-03 17:13 ` Matt Kraai
2009-01-03 17:41 ` demerphq [this message]
2009-01-04 5:30 ` Junio C Hamano
2009-01-04 11:41 ` demerphq
2009-01-04 15:58 ` Matt Kraai
2009-01-04 22:07 ` Jakub Narebski
2009-01-04 21:25 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9b18b3110901030941n3aa04e5ejb34c6f82c11bce4c@mail.gmail.com \
--to=demerphq@gmail.com \
--cc=git@vger.kernel.org \
--cc=kraai@ftbfs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).