More NCI Fun

chromatic on 2006-05-10T23:42:54

Did you know that Perl 5 subroutine attributes can apply to forward declarations even if there's no full declaration later? I thought this was true, but I had to make sure.

You can get rid of a lot of unnecessary code with these tricks. (I like Attribute::Handlers a lot.)

use Test::More tests => 1;
use P5NCI::Attribute library => 'nci_test', path => 'src';

sub double_int :NCI( double_int => ii );

is( double_int( 10 ), 20, 'NCI attribute should install named thunk' );

I don't know if general purpose NCI can get much shorter than this, but I like it.


Damn!

Ovid on 2006-05-11T01:04:41

You know, I never thought of applying attributes to forward declarations. You've gotten me thinking. That's probably a bad thing ... :)

Oh crap!

Alias on 2006-05-11T07:52:42

Oh dear, what an amazingly cool trick.

You've got me thinking as well.

But first I'd like to find out if that trick is a) Expected b) Going to keep working c) Back-compatible for some reasonable length (5.6.1 being probably the best target to even consider it).

But in terms of making it smaller...

Alias on 2006-05-11T08:01:07


use P5NCI::Attribute library => 'nci_test', path => 'src';

sub double_int :NCI( double_int => ii );


versus


use P5NCI::Easy # *cringe*
        library => 'nci_test',
        path => 'src',
        connect => [ 'double_int:ii' ];


or perhaps


use P5NCI::Simple nci_test => 'src', {
        double_int => 'ii',
        };


Or maybe some combination or variant.

Have a look at the import syntax for ideas.

Re:But in terms of making it smaller...

chromatic on 2006-05-11T16:17:07

If only want to install a thunk as the name of the bound function, those all work too. This example doesn't really show that using different names here is trivial.

I do think this works on Perl 5.6.1. At least, the only thing I worry about is the attribute trick. (See the first code example on page 232 of Camel 3 for why I don't worry much.)