Re: Declarations of constants

2005-05-31 Thread Damian Conway

Adam Kennedy wrote:

Forgive my ignorance here, but for all of these different ways of doing 
constants, will they all optimize (including partial 
evaluation/currying) at compile/build/init/run-time?


my $gravity is constant = 10; # One significant figure

sub time_to_ground ($height, $accel) {
...acceleration math...
}

my $time = time_to_ground( 500, $gravity );

... thus simplifying internally to

my $time = 1234;


No. But you could get the effect by explicitly asking for time_to_ground() to 
be called at compile-time:


  my $gravity is constant = 10; # One significant figure

  macro time_to_ground ($height, $accel) {
 ...acceleration math...
  }

  my $time = time_to_ground( 500, $gravity );

Damian


Re: Declarations of constants

2005-05-31 Thread Simon Cozens
[EMAIL PROTECTED] (Adam Kennedy) writes:
> Forgive my ignorance here, but for all of these different ways of
> doing constants, will they all optimize (including partial
> evaluation/currying) at compile/build/init/run-time?

Gosh, I hope not.

> my $gravity is constant = 10; # One significant figure
> sub time_to_ground ($height, $accel) {
>   ...acceleration math...
> }

The ability to play around with the working of &time_to_ground before it
runs is one of the things I like about Perl.

-- 
A language that doesn't have everything is actually easier to program
in than some that do.
-- Dennis M. Ritchie


Re: Declarations of constants

2005-05-31 Thread Adam Kennedy

Ingo Blechschmidt wrote:

Hi,

  # Way 1
  my $MEANING_OF_LIFE is constant = 42;


Forgive my ignorance here, but for all of these different ways of doing 
constants, will they all optimize (including partial 
evaluation/currying) at compile/build/init/run-time?


my $gravity is constant = 10; # One significant figure

sub time_to_ground ($height, $accel) {
...acceleration math...
}

my $time = time_to_ground( 500, $gravity );

... thus simplifying internally to

my $time = 1234;

Adam K


Re: Declarations of constants

2005-05-27 Thread Ingo Blechschmidt
Hi,

"TSa (Thomas Sandlaß)" wrote:
> Ingo Blechschmidt wrote:
>> Or did you simply forget the braces around 42? :)
> 
> No, it was intented for seeing what the reactions will be :)

:)

> Just using &foo as unsigiled variable. This might need
> 
> my &foo is rw;

I don't think this will DWYW, as firstly "is rw" is the default
on vars declared with my(), and secondly &foo will be undef, not some
kind of Proxy object. To do what you want, you'd have to write (I
think):
  my &foo = new_codeless_lvalue_sub();

  sub new_codeless_lvalue_sub {
my $var;
return {
  new Proxy: FETCH => { $var }, STORE => -> $new { $var = $new };
};
  }

> But then I presume you could say:
> 
> foo = 17;
> if foo < 8
> {
> @a[foo] = 8;
> }
> 
> We could call that a codeless lvalue sub ;)

This indeed looks very slick! I wouldn't use it for normal vars, though.


--Ingo

-- 
Linux, the choice of a GNU | The next statement is not true.
generation on a dual AMD   | The previous statement is true.  
Athlon!|



Re: Declarations of constants

2005-05-27 Thread TSa (Thomas Sandlaß)

Ingo Blechschmidt wrote:

is that allowed (as 42 is a Num (or an Int), not a Code)?


I don't know, but guess not.



Do (most of) the basic types morph themselves into Codes, when needed?


I don't consider it type morphing. If your examples parse
at all they will be dispatched as usual


  say 42();# 42?


&postfix:<.( )>:( Int :)


  say "Perl"();# Perl?


&postfix:<.( )>:( Str :)


  say [1,2,3].does(Code)   # true?


Depends on the type of [] which is Ref of Array or so.
But I think it should be false.


Or did you simply forget the braces around 42? :)


No, it was intented for seeing what the reactions will be :)
Just using &foo as unsigiled variable. This might need

my &foo is rw;

But then I presume you could say:

foo = 17;
if foo < 8
{
   @a[foo] = 8;
}

We could call that a codeless lvalue sub ;)
--
TSa (Thomas Sandlaß)



Re: Declarations of constants

2005-05-27 Thread Ingo Blechschmidt
Hi,

"TSa (Thomas Sandlaß)" wrote:
> my &MEANING_OF_LIVE = 42; # But might be considered evil sigilless
> mode

is that allowed (as 42 is a Num (or an Int), not a Code)?

Do (most of) the basic types morph themselves into Codes, when needed?
  say 42();# 42?
  say "Perl"();# Perl?
  say [1,2,3].does(Code)   # true?

Or did you simply forget the braces around 42? :)


--Ingo

-- 
Linux, the choice of a GNU | Wer die Freiheit aufgibt, um Sicherheit zu 
generation on a dual AMD   | gewinnen, der wird am Ende beides
Athlon!| verlieren" -- Benjamin Franklin  



Re: Declarations of constants

2005-05-27 Thread TSa (Thomas Sandlaß)

Ingo Blechschmidt wrote:

  # Please add more ways :)


enum ;

my &MEANING_OF_LIVE = 42; # But might be considered evil sigilless mode
--
TSa (Thomas Sandlaß)