On Tue, Jul 05, 2005 at 03:48:47PM -0700, Dave Whipp wrote:
: Dave Whipp wrote:
: 
: >You can use "{time - $epoch}" or "{time.as<%d>}" or "{int time}". (That 
: >last one is not "{+time}", because that would be a floating-point value, 
: >not an integer).

Or {time.int}, presumably.

: I was thinking: an epoch is just a time, and "int time" is a duration -- 
: the number of seconds since the current epoch. So, the following should 
: work:
: 
: for 1 .. 2 -> {
:    use epoch time();
:    sleep 6;
:    say int time;
: }
: 
: This should print something close to "6", twice.
: 
: But something niggled me: does the value of the RHS of a "use" get 
: evaluated at run time, or compile time? In perl5, that could definitely 
: would only execute the C<use> once.

I would not necessarily assume that "use" is the best interface for
setting what is essentially a lexically scoped variable.

: I could see 3 possible behaviors:
: 
: 1. C<use> sets the epoch for each iteration of the loop, thus calling 
: time() one per iteration

The pragma could arrange to install something in the runtime code
at that point, but it would take extraordinary measures and be
completely unexpected.

: 2. C<use> executes just once, at compile time. Thus seconds iteration 
: prints approximately "12"

Or much more than that, given separate compilation.

: 3. C<use> does a compile-time binding of the epoch to the time() 
: function. So each iteration prints "0".

: Which actually happens?

Am I allowed to vote for none of the above?  :-)

Actually what should happen is most like 2, I suspect.

Coming at it from a different angle, I'm thinking we should try to
get rid of built-in none-ary functions like time anyway, and parse them
to expect an argument, on the assumption that this will simplify
MMD.  (In fact, that's a good reason to get rid of the entire
"named unary" precedence level and treat them all as list operators
for parsing purposes.)  So if we're allowing an optional argument
to time(), then it makes sense to allow time($epoch), where time
can default to a particular epoch, or even to the epoch defined in
the caller's lexical scope.  I'd like time(2000) to be the standard
default, but time(1958) shouldn't be too hard to arrange.

We could set that default pragmatically, but pragmatically speaking,
we should just set the epoch as a lexical variable that is visible
to the default value for the parameter.  Then the caller can
even do something like:

    temp $_epoch_ = 1970;

    $x = time();        # sub time (?$epoch = $CALLER::_epoch_)

I'm not suggesting that's the proper name for the lexical variable.
In fact, we haven't got any convention for forced-lexicals in Perl
6 yet, other than, $_ and $/ are two examples of them, and $?FOO is
a compile-time lexical, and $=FOO is file-scoped in some fashion.
At one point I was thinking $*FOO would let the variable itself
decide if it was lexical or global, on the assumption that $_ is just
short for $*_.  But maybe that's a Bad Idea.  How do we decide which
variables are forced lexicals?  More specifically, how to we request
the compiler to force other variables to be lexical, and poke them
into our lexical pads automatically for us?  I think the epoch is
one of those, however we spell it.  Then different modules can run
with different epochs, as long as all absolute times are passed
as objects.

Larry

Reply via email to