Hmm that looks ugly in my email client. Here it is as a gist instead. BTW
so everyone can follow, yes, those are nested Heredocs.

https://gist.github.com/2007924

Joel

On Fri, Mar 9, 2012 at 12:31 PM, Joel Berger <[email protected]>wrote:

> Good call on the eval. I was having a hard time getting the method to show
> up correctly from another file. I'm sure its possible, but this was much
> easier. The warn message is so that you can see that the compiling only
> happens when the conditional is true.
>
> #!/usr/bin/env perl
>
> use strict;
> use warnings;
>
> use PDL;
>
> my $cond = shift || 0;
> my $pdl = null();
>
> # sometime later
> if ($cond)
> {
>     eval <<'ON_DEMAND_ONLY';
> warn "Compiling";
> use Inline Pdlpp => << 'PDLPP';
> pp_def('say_hi',
>     'Pars' => 'a(n)',
>     'Code' => q{ printf("%s\n", "Hello, world!"); }
> );
> PDLPP
> ON_DEMAND_ONLY
>     $pdl->say_hi();
> }
>
>
> On Fri, Mar 9, 2012 at 12:25 PM, Craig DeForest <[email protected]
> > wrote:
>
>> Yes. That, or put the whole thing in a non-substituting quote block and
>> eval that block at run-time.
>>
>>
>> On Mar 9, 2012, at 11:23 AM, Joel Berger wrote:
>>
>> IIRC all Inline mechanisms work essentially at compile time. However, if
>> you wanted to delay it, you might put your Inline code in another file,
>> then `require` that file if needed. I believe this should behave as you
>> would like.
>>
>> # file: MyPP.pm
>> use PDL;
>> use Inline qw(Pdlpp);
>>
>> __END__
>> __Pdlpp__
>> pp_def('say_hi',
>>     'Pars' => 'a(n)',
>>     'Code' => q{ printf("%s\n", "Hello, world!"); }
>> );
>>
>> # file: myscript.pl
>> use PDL;
>>
>> my $cond = 0;
>> my $pdl = null();
>>
>> # sometime later
>> if ($cond)
>> {
>>     require MyPP;
>>     $pdl->say_hi();
>> }
>>
>> Admittedly I haven't tried this code, and I'm not as familiar with
>> PDL::PP as I am with XS-y things, but IMO this kind of a mechanism should
>> work.
>>
>> Joel
>>
>> On Fri, Mar 9, 2012 at 11:47 AM, Tim Haines 
>> <[email protected]>wrote:
>>
>>> Greetings, all.
>>>
>>> I just read through the sections of PDL::Book and PDL::Tutorial that
>>> cover PP, but I didn't see an example of conditional compilation of a
>>> pp_def. Is this even possible using PP::Inline given the way the __END__
>>> and __Pdlpp__ macros work? Is there a way to do this just using PDL::PP? I
>>> am uncertain how to use 'raw' PDL::PP since the examples from PDL::Book and
>>> PDL::Tutorial all use PDL::PP::Inline (unless I missed it!).
>>>
>>> [code]
>>>
>>> use PDL;
>>> use Inline qw(Pdlpp);
>>> my $cond = 0;
>>> my $pdl = null();
>>>
>>> # sometime later
>>> if ($cond)
>>> {
>>>     $pdl->say_hi();
>>> }
>>>
>>> # at the end of the script
>>> if ($cond)      # Perl generates an error here since it can't see the
>>> closing brace
>>> {
>>> __END__
>>> __Pdlpp__
>>> pp_def('say_hi',
>>>     'Pars' => 'a(n)',
>>>     'Code' => q{ printf("%s\n", "Hello, world!"); }
>>> );
>>> }   <--- The Perl parser can't see this brace, and PP generates an error
>>> for unclosed brace.
>>>
>>> [/code]
>>>
>>> The principle reason I am looking for this functionality is to remove
>>> the overhead of generating/compiling/linking the xs definition of say_hi
>>> unless the function is actually needed at runtime.
>>>
>>> Many thanks.
>>>
>>> - Tim
>>>
>>> _______________________________________________
>>> Perldl mailing list
>>> [email protected]
>>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>>>
>>>
>> _______________________________________________
>> Perldl mailing list
>> [email protected]
>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>>
>>
>>
>
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to