Jon,<div><br></div><div><br></div><div>   You're right, that's the way to do it. I realized that a bit earlier today and wrote the code for it. Sorry, dumb mistake. I was thinking that I should do everything in the extension, but instead I create two separate extensions and just pass a pointer to the objects in scheme. So in short I implemented both Foo and Bar extensions separately, but require both the extensions in scheme and then pass around an object pointer. Case closed, we can all move on with life now. Thanks for taking the time to answer my question!</div>
<div><br></div><div><span></span><br><br>On Thursday, February 6, 2014, Jon Zeppieri <<a href="mailto:zeppieri@gmail.com">zeppieri@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Okay. If you want one module to include code from the other, you can<br>
simply include it. If you're worried about multiple definitions of<br>
scheme_initialize, scheme_reload, and scheme_module_name, why wouldn't<br>
you just pull all of the rest of the code -- the common code -- into a<br>
separate file and have both modules include it? I figure I still must<br>
be missing something.<br>
<br>
On Thu, Feb 6, 2014 at 7:38 PM, Cody Eilar <<a>cody.eilar@gmail.com</a>> wrote:<br>
> Hmmm, I haven't had to wrap anything using extern C because all the function<br>
> prototypes are in C already I believe (the three I mentioned above). The<br>
> main idea here is that I want to reuse my extensions in the same way that my<br>
> classes are constructed. I want to write extensions separately for each<br>
> class that I have already written in C++. I have already successfully<br>
> written my extension for Foo. I can load Foo_ext.rkt in my racket script and<br>
> execute all the functions that I need. The issue is that I have another<br>
> class, Bar, that inherits from Foo. So as it stands now, I can't figure out<br>
> how to write my Bar extension such that I don't have to rewrite (or copy and<br>
> paste) all the code from my Foo extension. I'd like to leverage the fact<br>
> that I already wrote the extension for Foo and Bar is just a few extra<br>
> variables and functions. I hope this clearly illustrates my goal.<br>
><br>
> Thanks :-)<br>
><br>
><br>
> On Thu, Feb 6, 2014 at 12:17 PM, Jon Zeppieri <<a>zeppieri@gmail.com</a>> wrote:<br>
>><br>
>> I'm not entirely sure that I follow, but if you're writing these<br>
>> extension functions in C++, I believe you'll need to wrap their<br>
>> prototypes in an extern(C) { ... } block so that they'll be given<br>
>> un-mangled names for the linker to use.<br>
>><br>
>> On Thu, Feb 6, 2014 at 4:56 PM, Cody Eilar <<a>cody.eilar@gmail.com</a>> wrote:<br>
>> > I understand that, the issue is that I have to provide three functions<br>
>> > that<br>
>> > are not static so that I can make my c++ code known to scheme. Those<br>
>> > functions are:<br>
>> ><br>
>> > scheme_reload(Scheme_Env *env)<br>
>> > scheme_initialize(Scheme_Env *env)<br>
>> > scheme_module_name()<br>
>> ><br>
>> > Each one of these functions are known to the linker. Inside the<br>
>> > Foo_ext.cpp<br>
>> > file, I have these three functions implemented. But in order to use<br>
>> > Bar_ext.cpp I have to implement them as well, which means I have<br>
>> > multiple<br>
>> > declarations to the same function. So my Bar_ext.cpp file would Ideally<br>
>> > look<br>
>> > something like this:<br>
>> ><br>
>> > Bar_ext.cpp<br>
>> > scheme_reload(Scheme_Env *env)<br>
>> > {<br>
>> >  /* Bar _ext reload stuff */<br>
>> >     Foo_ext.scheme_reload(env)<br>
>> > }<br>
>> ><br>
>> > Currently, the only way I see to solve this is to use a bunch of ifdefs,<br>
>> > but<br>
>> > I was curious if there was a more elegant solution.<br>
>> ><br>
>> > Thanks!<br>
>> ><br>
>> > On Thu, Feb 6, 2014 at 2:48 AM, David T. Pierson <<a>dtp@mindstory.com</a>><br>
>> > wrote:<br>
>> >><br>
>> >> On Wed, Feb 05, 2014 at 02:16:54PM -1000, Cody Eilar wrote:<br>
>> >> > > But what I really want is:<br>
>> >> > ><br>
>> >> > > Foo_ext.h:<br>
>> >> > ><br>
>> >> > > func1_racket_ext() { /*... do racket stuff and run func1() */}<br>
>> >> > ><br>
>> >> > > /* Scheme initializes etc... */<br>
>> >> > ><br>
>> >> > ><br>
>> >> > > Bar_ext.cpp:<br>
>> >> > > #include "Foo_ext.h"<br>
>> >> > ><br>
>> >> > > func2_racket_ext() {/* ... do more racket stuff and run func2() /*}<br>
>> >><br>
>> >> Disclaimer: I know nothing about Racket extensions.<br>
>> >><br>
>> >> In C++, if you want to be able to call a function from multiple .cpp<br>
>> >> files, you typically put the *declaration* in a header:<br>
>> >><br>
>> >>   void func1_ext(void);<br>
>> >><br>
>> >> The definition would still go in a .cpp file:<br>
>> >><br>
>> >>   void func1_ext(void)<br>
>> >>   {<br>
>> >>     /*...*/<br>
>> >>   }<br>
>> >><br>
>> >> You typically only put the definition in a header if you want to make<br>
></blockquote></div>