<div><div>Хочу создать анонимную сабу (callback) внутри XS.</div><div><br></div><div>т.е. то, что на перле записывается как </div><div><br></div><div>package My::Test;</div><div><br></div><div><div>sub test {</div><div><span class="" style="white-space:pre">        </span>my $var = shift;</div>
<div><span class="" style="white-space:pre">    </span>return sub {</div><div><span class="" style="white-space:pre">               </span>return $var;</div><div><span class="" style="white-space:pre">       </span>}</div><div>}</div></div><div>
<br></div><div>package main;</div><div><br></div><div>my $cb = My::Test::test("arg");</div><div>$cb->(); # "arg";</div><div>$cb->(); # "arg";</div><div><br></div><div>как реализовать это на XS?</div>
<div>У меня получилось что-то такое, но оно жутко бажное и падучее (под дебаггером, например)</div><div><br></div><div>XS(cb_test) {</div><div><span class="" style="white-space:pre">  </span>dVAR;</div><div><span class="" style="white-space:pre">      </span>dXSARGS;</div>
<div><span class="" style="white-space:pre">    </span>dORIGMARK;</div><div><span class="" style="white-space:pre"> </span></div><div><span class="" style="white-space:pre">   </span>SAVECOMPPAD();</div><div><span class="" style="white-space:pre">     </span>PAD_SET_CUR_NOSAVE(CvPADLIST( (CV *) SvRV( PAD_SVl(1) ) ),1);</div>
<div><span class="" style="white-space:pre">    </span></div><div><span class="" style="white-space:pre">   </span>SV *sv = PAD_SVl(1);</div><div><span class="" style="white-space:pre">       </span></div><div><span class="" style="white-space:pre">   </span>ST(0) = sv;</div>
<div><span class="" style="white-space:pre">    </span>XSRETURN(1);</div><div><span class="" style="white-space:pre">       </span></div><div><span class="" style="white-space:pre">   </span>SP = ORIGMARK;</div><div><span class="" style="white-space:pre">     </span>PUSHs(&PL_sv_yes);</div>
<div>}</div><div><br></div><div>void test(SV *var)</div><div><span class="" style="white-space:pre">  </span>PPCODE:</div><div><span class="" style="white-space:pre">            </span>CV *myxs = newXS(0,cb_test,__FILE__);</div><div>
<span class="" style="white-space:pre">               </span></div><div><span class="" style="white-space:pre">           </span>CvPADLIST(myxs) = pad_new(padnew_SAVE|padnew_SAVESUB);</div><div><span class="" style="white-space:pre">             </span>PAD_SETSV( pad_add_name_pvs("var", 0,0,0), var );</div>
<div><span class="" style="white-space:pre">            </span></div><div><span class="" style="white-space:pre">           </span>SV *cb = newRV_noinc( (SV *) myxs );</div><div><span class="" style="white-space:pre">               </span>ST(0) = cb;</div>
<div><span class="" style="white-space:pre">            </span>XSRETURN(1);</div><div><br></div><div>Ткните меня пожалуйста в документацию и примеры того, где это делается.</div><div><br></div><div><br></div>-- <br>Best wishes,<br>
Vladimir V. Perepelitsa aka Mons Anderson<br><<a href="mailto:inthrax@gmail.com">inthrax@gmail.com</a>>, <<a href="mailto:mons@cpan.org">mons@cpan.org</a>><br><a href="http://github.com/Mons">http://github.com/Mons</a><br>

</div>