develooper Front page | perl.perl5.porters | Postings from April 2023

Constant perl version - __PERLVER__ ?

Thread Next
From:
Paul "LeoNerd" Evans
Date:
April 29, 2023 14:38
Subject:
Constant perl version - __PERLVER__ ?
Message ID:
20230429153757.6cae7a10@shy.leonerd.org.uk
The version of perl that is executing any particular piece of code is
really expected to remain constant. I think that is fairly
uncontentious ;)

However, because the value is only available in scalar variables like
$] and $^V, it means that conditional expressions that one would hope
should be "constant" are not in fact subject to const-folding. For
example:

  $ perl -MO=Concise -E 'say "Old" if $] < 5.014'
  a  <@> leave[1 ref] vKP/REFC ->(end)
  1     <0> enter v ->2
  2     <;> nextstate(main 2 -e:1) v:%,us,{,fea=15 ->3
  -     <1> null vK/1 ->a
  6        <|> and(other->7) vK/1 ->a
  5           <2> lt sK/2 ->6
  -              <1> ex-rv2sv sK/1 ->4
  3                 <#> gvsv[*]] s ->4
  4              <$> const[NV 5.01] s ->5
  9           <@> say vK ->a
  7              <0> pushmark s ->8
  8              <$> const[PV "Old"] s ->9

and similar for `... if $^V lt v5.14`

I would like to propose a new double-under special symbol containing
the same value, that expands to a real constant in the code; and
therefore such a conditional expression would const-fold correctly.

Hypothetically then

  perl ... -E 'say "Old" if __PERLVER__ lt v5.14'

would compile to either nothing at all, or a simple unconditional say()
statement.


Alternative ideas include: recognising that $^V or $] are readonly
during the peephole optimiser and inlining the values, but.. eugh.
That's a mess that easily leads to craziness...

-- 
Paul "LeoNerd" Evans

leonerd@leonerd.org.uk      |  https://metacpan.org/author/PEVANS
http://www.leonerd.org.uk/  |  https://www.tindie.com/stores/leonerd/

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About