Re: proposal: binding with a function

2005-06-23 Thread Piers Cawley
Brent 'Dax' Royal-Gordon [EMAIL PROTECTED] writes:
 As I've said before, Perl supports `alias`--it's just spelled `:=`.

Here's a rubyish idiom:

  my old_behaviour := function;

  function := sub { try_some_stuff || old_behaviour }

Except, with binding it doesn't work like that, you end up with an infinite
loop. 
  


Re: proposal: binding with a function

2005-06-23 Thread Juerd
Piers Cawley skribis 2005-06-23 15:30 (+0100):
 Brent 'Dax' Royal-Gordon [EMAIL PROTECTED] writes:
  As I've said before, Perl supports `alias`--it's just spelled `:=`.
 Here's a rubyish idiom:
   my old_behaviour := function;
   function := sub { try_some_stuff || old_behaviour }
 Except, with binding it doesn't work like that, you end up with an infinite
 loop. 

I still think subs should have a value, than can be copied :)

my old_behaviour = function;
function = sub { try_something || old_behaviour };


Juerd
-- 
http://convolution.nl/maak_juerd_blij.html
http://convolution.nl/make_juerd_happy.html 
http://convolution.nl/gajigu_juerd_n.html


Re: proposal: binding with a function

2005-06-23 Thread Ingo Blechschmidt
Hi, 
 
Juerd juerd at convolution.nl writes: 
 Piers Cawley skribis 2005-06-23 15:30 (+0100): 
  Brent 'Dax' Royal-Gordon brentdax at gmail.com writes: 
   As I've said before, Perl supports `alias`--it's just spelled `:=`. 
  Here's a rubyish idiom: 
my old_behaviour := function; 
function := sub { try_some_stuff || old_behaviour } 
  Except, with binding it doesn't work like that, you end up with an 
infinite 
  loop.  
  
 I still think subs should have a value, than can be copied :) 
  
 my old_behaviour = function; 
 function = sub { try_something || old_behaviour }; 
 
I absolutely agree! 
 
But: Your example won't work correctly, as function() would 
return a Code reference (old_behaviour) instead of calling 
old_behaviour, wouldn't it? 
 
I think all of the following should work: 
 
my old_behaviour = function; 
function = sub { try_something() || old_behaviour() }; 
 
my old_behaviour = function; 
function := sub { try_something() || old_behaviour() }; 
 
Additionally, with nothingmuch's lazy {...} proposal, the 
following should work, too (I think): 
 
my old_behaviour = function; 
function = lazy { try_something || old_behaviour }; 
 
my old_behaviour = function; 
function := lazy { try_something || old_behaviour }; 
 
 
--Ingo 
 
--  
Linux, the choice of a GNU | When cryptography is outlawed, bayl bhgynjf 
generation on a dual AMD   | jvyy unir cevinpl!   
Athlon!|  



Re: proposal: binding with a function

2005-06-23 Thread Damian Conway

Piers Cawley wrote:


Here's a rubyish idiom:

  my old_behaviour := function;

  function := sub { try_some_stuff || old_behaviour }

Except, with binding it doesn't work like that, you end up with an infinite
loop. 


But this version *should* work correctly:

# Bind the name 'old_behaviour' to the closure that is currently bound to
# the name 'function'...
my old_behaviour := function;

# Rebind the name 'function' to the specified closure, calling the
# old behaviour (via its new name) if necessary...
function := sub { try_some_stuff || old_behaviour([EMAIL PROTECTED]) };

No infinite loop involved.

Perl 6 even has specific syntactic sugar for this kind of thing:

function.wrap( { try_some_stuff || call([EMAIL PROTECTED]) } );

See: http://dev.perl.org/perl6/doc/design/syn/S06.html#Wrapping

Damian



Re: proposal: binding with a function

2005-06-20 Thread BÁRTHÁZI András

Hi,

I'm still interested in, why alias wouldn't be a native Perl 6 term?

I think, there are several reasons for alias:

- in natural languages, synonims are very often - alias is a synonim
- in Perl 6, currently there's no way to create a reference to a
  variable, _with the context of the variable_, too (binding just give
  me possibility to bind a variable into another, but the new variable
  won't be automatically have the same context, as the binded one)

Some new examples, maybe better than before:

sub kilobytes ($value:) is export {
return $value*1024;
}
alias kilobytes, kilobyte;

So both routines will be an exported one. You can use this code then:

  say 1.kilobyte;
  say 2.kilobytes;

Bye,
  Andras

BÁRTHÁZI András wrote:

Larry,


You can always write a macro that does that.
[...] That won't work on a method name anyway unless you do it in the
dispatch class.
[...]
You'll have to write your own macro if you want to do that.



As I understood, you wrote down, how I can workaround it with macros, 
and why it wouldn't work well. As I see, there's no a nice solution to 
alias a method or a sub, even with macros.


But you didn't wrote, why are you against the 'alias'?

Bye,
  Andras





Re: proposal: binding with a function

2005-06-20 Thread Abhijit Mahabal

On Mon, 20 Jun 2005, BÁRTHÁZI András wrote:


Hi,

I'm still interested in, why alias wouldn't be a native Perl 6 term?

I think, there are several reasons for alias:


I am not arguing against alias, but just wanted to point out something.


- in Perl 6, currently there's no way to create a reference to a
  variable, _with the context of the variable_, too


unless you bind immediately where you declare the original variable:


Some new examples, maybe better than before:

sub kilobytes ($value:) is export {
return $value*1024;
}
alias kilobytes, kilobyte;


replace the last line with:
  kilobytes := kilobyte;

and the scoping is not an issue.

And with synonyms, binding as soon as declaring seems prudent.

--abhijit

Abhijit Mahabal  http://www.cs.indiana.edu/~amahabal/


Re: proposal: binding with a function

2005-06-20 Thread Brent 'Dax' Royal-Gordon
On 6/20/05, BÁRTHÁZI András [EMAIL PROTECTED] wrote:
 - in natural languages, synonims are very often - alias is a synonim

Perl is modeled on natural languages, but that doesn't mean it is one.
 At its core, Perl is a limited, artificial language being explicitly
designed with certain goals.  One of those goals is that it should be
as small as possible given the feature set we want it to support; an
`alias` built-in that essentially duplicates an existing feature goes
against that goal.

 - in Perl 6, currently there's no way to create a reference to a
variable, _with the context of the variable_, too (binding just give
me possibility to bind a variable into another, but the new variable
won't be automatically have the same context, as the binded one)

I'm not sure what you mean by context here.  Context has a very
specific meaning in Perl, representing the type a function's caller is
expecting; this doesn't seem to be what you're talking about here.

 alias kilobytes, kilobyte;

This is a couple punctuation symbols short of:
kilobytes := kilobyte;
Or maybe:
kilobytes ::= kilobyte;
I'm not really sure what behavior you have in mind for alias.

(By the way, a simple name like alias is ambiguous about argument
order, where an operator isn't.)

-- 
Brent 'Dax' Royal-Gordon [EMAIL PROTECTED]
Perl and Parrot hacker


Re: proposal: binding with a function

2005-06-20 Thread BÁRTHÁZI András

Hi,


- in natural languages, synonims are very often - alias is a synonim


Perl is modeled on natural languages, but that doesn't mean it is one.
 At its core, Perl is a limited, artificial language being explicitly
designed with certain goals.  One of those goals is that it should be
as small as possible given the feature set we want it to support; an
`alias` built-in that essentially duplicates an existing feature goes
against that goal.


I can agree with it, but I think it would be a great feature. And it 
doesn't depends on Perl 6, but it depends on Parrot, as I think.



- in Perl 6, currently there's no way to create a reference to a
  variable, _with the context of the variable_, too (binding just give
  me possibility to bind a variable into another, but the new variable
  won't be automatically have the same context, as the binded one)


I'm not sure what you mean by context here.  Context has a very
specific meaning in Perl, representing the type a function's caller is
expecting; this doesn't seem to be what you're talking about here.


alias kilobytes, kilobyte;


This is a couple punctuation symbols short of:
kilobytes := kilobyte;
Or maybe:
kilobytes ::= kilobyte;
I'm not really sure what behavior you have in mind for alias.


kilobytes := kilobyte; will not work for you (try it), because you 
have to declare the variable kilobytes - in the default strict mode. 
But you can't say for ex. my kilobytes, if you want to export it. I 
would like to copy if the subroutine/variable is local, or exported, 
or... etc. Oh, I have the term: I would like to copy the _scope_ of it, 
too. Forget the context. Simple binding shouldn't have to copy the 
scope, too.


Anyway, alias is a Ruby term, and if Parrot will be able to support 
Ruby, then it will be able to support this function, too.


Bye,
  Andras


Re: proposal: binding with a function

2005-06-20 Thread Brent 'Dax' Royal-Gordon
On 6/20/05, BÁRTHÁZI András [EMAIL PROTECTED] wrote:
 Hi,
 
 - in natural languages, synonims are very often - alias is a synonim
 
  Perl is modeled on natural languages, but that doesn't mean it is one.
   At its core, Perl is a limited, artificial language being explicitly
  designed with certain goals.  One of those goals is that it should be
  as small as possible given the feature set we want it to support; an
  `alias` built-in that essentially duplicates an existing feature goes
  against that goal.
 
 I can agree with it, but I think it would be a great feature. And it
 doesn't depends on Perl 6, but it depends on Parrot, as I think.
 
 - in Perl 6, currently there's no way to create a reference to a
variable, _with the context of the variable_, too (binding just give
me possibility to bind a variable into another, but the new variable
won't be automatically have the same context, as the binded one)
 
  I'm not sure what you mean by context here.  Context has a very
  specific meaning in Perl, representing the type a function's caller is
  expecting; this doesn't seem to be what you're talking about here.
 
 alias kilobytes, kilobyte;
 
  This is a couple punctuation symbols short of:
  kilobytes := kilobyte;
  Or maybe:
  kilobytes ::= kilobyte;
  I'm not really sure what behavior you have in mind for alias.
 
 kilobytes := kilobyte; will not work for you (try it), because you
 have to declare the variable kilobytes - in the default strict mode.
 But you can't say for ex. my kilobytes, if you want to export it.

So you say `our kilobytes ::= kilobyte` (or `:=`, you still haven't
said if alias works at compile time or runtime) and call it a day.

IIUC, traits like `is exported` are attached to the container, not the
name; since aliasing connects a name to a container, you should be
fine on that front.  (If it doesn't work, that's because `is exported`
does something funky that `alias` would have to treat as a special
case; certainly other traits like `is rw` would follow a
`:=`-binding.)

 Anyway, alias is a Ruby term, and if Parrot will be able to support
 Ruby, then it will be able to support this function, too.

As I've said before, Perl supports `alias`--it's just spelled `:=`.

-- 
Brent 'Dax' Royal-Gordon [EMAIL PROTECTED]
Perl and Parrot hacker


Re: proposal: binding with a function

2005-06-20 Thread BÁRTHÁZI András

Hi,


kilobytes := kilobyte; will not work for you (try it), because you
have to declare the variable kilobytes - in the default strict mode.
But you can't say for ex. my kilobytes, if you want to export it.


So you say `our kilobytes ::= kilobyte` (or `:=`, you still haven't
said if alias works at compile time or runtime) and call it a day.

IIUC, traits like `is exported` are attached to the container, not the
name; since aliasing connects a name to a container, you should be
fine on that front.  (If it doesn't work, that's because `is exported`
does something funky that `alias` would have to treat as a special
case; certainly other traits like `is rw` would follow a
`:=`-binding.)


Anyway, alias is a Ruby term, and if Parrot will be able to support
Ruby, then it will be able to support this function, too.


As I've said before, Perl supports `alias`--it's just spelled `:=`.


If you're right, then I'm happy. I don't want alias, I would like to 
get it's behaviour. In Ruby, I think it's a compile time feature, but 
don't know, I'm not programming in Ruby.


I'm not (yet) an expert in Perl 6, so sorry if I'm not right, but is 
exported is about the name, not the container, as I think. If you 
attach an is exported to a class method, you can reach it from 
everywhere, just using it's name. If you say _in your class_ that our 
mysub ::= exportedsub, then you can reach the mysub sub just in the 
class, not from everywhere in your program (as a plain sub). I'm really 
not sure, if I'm right, so please tell me, that I lost, and I will be 
happy. :)


Bye,
  Andras


Re: proposal: binding with a function

2005-06-15 Thread BÁRTHÁZI András

Larry,


You can always write a macro that does that.
[...] 
That won't work on a method name anyway unless you do it in the

dispatch class.
[...]
You'll have to write your own macro if you want to do that.


As I understood, you wrote down, how I can workaround it with macros, 
and why it wouldn't work well. As I see, there's no a nice solution to 
alias a method or a sub, even with macros.


But you didn't wrote, why are you against the 'alias'?

Bye,
  Andras


Re: proposal: binding with a function

2005-06-15 Thread Carl Franks
 :   alias newlines, newline;

Isn't it possible to add a Role to the relevant Class, which specifies
that is 'handles' the method name you want as an alias?

Carl


Re: proposal: binding with a function

2005-06-15 Thread BÁRTHÁZI András

Hi,

Carl Franks wrote:

:   alias newlines, newline;


Isn't it possible to add a Role to the relevant Class, which specifies
that is 'handles' the method name you want as an alias?


If it's possible, it would be fine for me in this particular case. Is it 
possible?


Anyway, IMHO this alias function can be useful in other cases, too.

Bye,
  Andras


proposal: binding with a function

2005-06-14 Thread BÁRTHÁZI András

Hi,

As I know, for binding, you can use the := operator, and just this:

  $a := $b;

I would like to make a proposal, based on Ruby[1]:

  alias $a, $b;

It's a fun:

  sub newline {
\n x $_;
  }

  alias newlines, newline;

So you can write:

  print 5.enters;

Currently, you have to write it a more uglier way:

  my newlines := newline;

Anyway, char '' is really neccesary there? It should work w/o it, too, as 
I think. Now - in Pugs - it doesn't.


Bye,
  Andras

[1] http://www.zenspider.com/Languages/Ruby/QuickRef.html#29


Re: proposal: binding with a function

2005-06-14 Thread Larry Wall
On Tue, Jun 14, 2005 at 02:06:37PM +0200, BÁRTHÁZI András wrote:
: Hi,
: 
: As I know, for binding, you can use the := operator, and just this:
: 
:   $a := $b;
: 
: I would like to make a proposal, based on Ruby[1]:
: 
:   alias $a, $b;

You can always write a macro that does that.

: It's a fun:
: 
:   sub newline {
:   \n x $_;
:   }
: 
:   alias newlines, newline;

At one point we had a macro variant for single words:

word enters {'newline'};

But it's not clear which syntactic categories pay attention to that.
It's obvious that your intent is to alias a method name, here, but
that's not at all obvious to the compiler.  Most simple macros remap
terms, not method names, which are a subset of postfix operators that
require the dot.

: So you can write:
: 
:   print 5.enters;
: 
: Currently, you have to write it a more uglier way:
: 
:   my newlines := newline;

That won't work on a method name anyway unless you do it in the
dispatch class.

: Anyway, char '' is really neccesary there? It should work w/o it, too, as 
: I think. Now - in Pugs - it doesn't.

The point of the sigils is to help keep the namespaces and syntactic
categories straight, and to indicate you're talking about the actual
variable object rather than just a name.  Since you're merely trying
to remap the name here and not the object (which isn't even a variable
in your own package), the use of  is going to be inappropriate in
any event.  What you're really looking for is some kind of macro
based syntactic sugar that maps the appropriate syntactic category.
Maybe something based on this:

my macro postfix:enters { 'newline' }

There's some possibilility of syntactic sugar resembling:

my postfix:enters ::= newline;

But Perl 6 is not going to encourage the C-preprocessor mindset of
completely divorcing the meaning of identifiers from their syntactic
context.  In other words, you can't wildcard the syntactic category:

*:enters ::= newline;

You'll have to write your own macro if you want to do that.

Larry