From: nerochiaro <ner...@gm...> - 2006-01-31 00:41:00
|
In an interface that I am wrapping I have something like the following: uint itemCount (); void setItemCount (uint s); I was wondering if it was possible to make it appear to the ruby side in way that is more conformant to the ruby idiom by renaming "setItemCount" to "itemCount=3D". I tried %rename but it doesn't accept names with "=3D" in them. Is there some ruby-specific directive that does this ? I was thinking something like the current %predicate or the new directive for bang methods. If there's no such thing, is this a bad idea for a feature request ? I'm doing this now by redefining the class directly in ruby, but having this generated directly by swig would be much more convenient. Thank you. |
From: Charlie S. <cf...@in...> - 2006-01-31 01:17:59
Attachments:
smime.p7s
|
The %predicate and %bang methods are for methods that end in ? or ! - so that's not what you want. Try using the %alias directive - I've had luck with that in the past when %rename does not work (for example, the name conflicts with a C++ keyword). So in your case: %alias setItemCount "itemCount="; If that works, then you'll end up with two methods exposed, one being setItemCount the other being itemCount. You might try then to use %ignore to get rid of the setItemCount...but if I remember correctly that won't work because it will hide the method before it can be aliased. So see if %alias works for you. If not, then we can investigate whether %rename should handle this case or if would be better adding another feature directive to Ruby SWIG called %setter or some such thing. Charlie nerochiaro wrote: > In an interface that I am wrapping I have something like the following: > > uint itemCount (); > void setItemCount (uint s); > > I was wondering if it was possible to make it appear to the ruby side > in way that is more conformant to the ruby idiom by renaming > "setItemCount" to "itemCount=". > I tried %rename but it doesn't accept names with "=" in them. > > Is there some ruby-specific directive that does this ? > I was thinking something like the current %predicate or the new > directive for bang methods. > If there's no such thing, is this a bad idea for a feature request ? > > I'm doing this now by redefining the class directly in ruby, but > having this generated directly by swig would be much more convenient. > > Thank you. > > > ------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. Do you grep through log files > for problems? Stop! Download the new AJAX search engine that makes > searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! > http://sel.as-us.falkag.net/sel?cmd=k&kid3432&bid#0486&dat1642 > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user > > > |
From: nerochiaro <ner...@gm...> - 2006-01-31 11:26:17
|
> The %predicate and %bang methods are for methods that end in ? or ! - so > that's not what you want. Of course not, but they do a similar thing. I mentioned them because they too allow me to have names that are illegal in C/C++ but are ok in ruby. > Try using the %alias directive - I've had luck with that in the past when= %rename > does not work (for example, the name conflicts with a C++ keyword). > So in your case: %alias setItemCount "itemCount=3D"; > > If that works, then you'll end up with two methods exposed, one being > setItemCount the other being itemCount. You might try then to use > %ignore to get rid of the setItemCount...but if I remember correctly > that won't work because it will hide the method before it can be aliased. > So see if %alias works for you. If not, then we can investigate whether > %rename should handle this case or if would be better adding another > feature directive to Ruby SWIG called %setter or some such thing. This works like you say: using %alias works to create the "itemCount=3D" method, but the old "setItemCount" is still there. So I still need a ruby proxy class to remove one or at least hide it by making it private. Or I can inject a piece of code in the init block and call rb_undef_method on the setItemCount wrapper, but that's just plain ugly in my eyes. Now, having the ruby proxy is not a big problem for me, and i can live with having that. But for others this might be a problem, so maybe investigating a potential %setter directive might be a good idea regardless of my situation. That would also be more convenient in general. I would suggest not making this new directive specific for making setters, though, but more like a %rubyrename: working like %rename but entering the wrapper generation at the same stage of %alias. In other words, a variant of %rename that doesn't generate wrapper functions but just uses calls to the ruby interpreter (rb_*) to alter the class definitions. I'm not an expert of swig internals though, so what I say might be utter nonsense. Forgive me in advance if this is the case. |
From: Charlie S. <cf...@in...> - 2006-02-01 23:51:08
Attachments:
smime.p7s
|
Thinking about this a bit more, I assume the same applies to getters. So if your case was slightly different: uint getItemCount(); void setItemCount(uint s); It would be nice to be able to use this code in Ruby like this: puts some_object.item_count some_object.item_count = 5 I like your idea of a rename that does not happen in C++ but instead happens when defining a method in a scripting language. So maybe something like %targetRename %targetRename getItemCount() "itemCount"; %targetRename setItemCount() "itemCount=" The reason this is different than just plane %rename is that it lets you use identifiers that are legal in the scripting language but not in C++. For Ruby this would be methods like equals?, modify!, itemCount=. It would also avoid conflict with C++ keywords. Seems like this would also be generally useful in other languages. Thoughts? Charlie nerochiaro wrote: >> The %predicate and %bang methods are for methods that end in ? or ! - so >> that's not what you want. >> > > Of course not, but they do a similar thing. > I mentioned them because they too allow me to have names that are > illegal in C/C++ but are ok in ruby. > > >> Try using the %alias directive - I've had luck with that in the past when %rename >> does not work (for example, the name conflicts with a C++ keyword). >> So in your case: %alias setItemCount "itemCount="; >> >> If that works, then you'll end up with two methods exposed, one being >> setItemCount the other being itemCount. You might try then to use >> %ignore to get rid of the setItemCount...but if I remember correctly >> that won't work because it will hide the method before it can be aliased. >> So see if %alias works for you. If not, then we can investigate whether >> %rename should handle this case or if would be better adding another >> feature directive to Ruby SWIG called %setter or some such thing. >> > > This works like you say: using %alias works to create the "itemCount=" > method, but the old "setItemCount" is still there. > > So I still need a ruby proxy class to remove one or at least hide it > by making it private. > Or I can inject a piece of code in the init block and call > rb_undef_method on the setItemCount wrapper, but that's just plain > ugly in my eyes. > > Now, having the ruby proxy is not a big problem for me, and i can live > with having that. > But for others this might be a problem, so maybe investigating a > potential %setter > directive might be a good idea regardless of my situation. That would > also be more convenient in general. > > I would suggest not making this new directive specific for making > setters, though, but more like a %rubyrename: working like %rename but > entering the wrapper generation at the same stage of %alias. > In other words, a variant of %rename that doesn't generate wrapper > functions but just uses calls to the ruby interpreter (rb_*) to alter > the class definitions. > I'm not an expert of swig internals though, so what I say might be > utter nonsense. > Forgive me in advance if this is the case. > > > |
From: Marcelo M. <mm...@ac...> - 2006-02-02 00:38:27
|
About this thread.... How are you using rename? did you just try: %rename("itemCount=") setItemCount(); ie, using quotes?, I guess the invalid symbol error only appears if you try like this: %rename(itemCount=) setItemCount(); Marcelo Charlie Savage wrote: > Thinking about this a bit more, I assume the same applies to getters. > So if your case was slightly different: > > uint getItemCount(); > void setItemCount(uint s); > > It would be nice to be able to use this code in Ruby like this: > > puts some_object.item_count > some_object.item_count = 5 > > I like your idea of a rename that does not happen in C++ but instead > happens when defining a method in a scripting language. So maybe > something like %targetRename > > %targetRename getItemCount() "itemCount"; > %targetRename setItemCount() "itemCount=" > > The reason this is different than just plane %rename is that it lets > you use identifiers that are legal in the scripting language but not > in C++. For Ruby this would be methods like equals?, modify!, > itemCount=. It would also avoid conflict with C++ keywords. > > Seems like this would also be generally useful in other languages. > Thoughts? > > Charlie > > > nerochiaro wrote: > >>>The %predicate and %bang methods are for methods that end in ? or ! - so >>>that's not what you want. >>> >>> >> >>Of course not, but they do a similar thing. >>I mentioned them because they too allow me to have names that are >>illegal in C/C++ but are ok in ruby. >> >> >> >>>Try using the %alias directive - I've had luck with that in the past when %rename >>>does not work (for example, the name conflicts with a C++ keyword). >>>So in your case: %alias setItemCount "itemCount="; >>> >>>If that works, then you'll end up with two methods exposed, one being >>>setItemCount the other being itemCount. You might try then to use >>>%ignore to get rid of the setItemCount...but if I remember correctly >>>that won't work because it will hide the method before it can be aliased. >>>So see if %alias works for you. If not, then we can investigate whether >>>%rename should handle this case or if would be better adding another >>>feature directive to Ruby SWIG called %setter or some such thing. >>> >>> >>> >> >>This works like you say: using %alias works to create the "itemCount=" >>method, but the old "setItemCount" is still there. >> >>So I still need a ruby proxy class to remove one or at least hide it >>by making it private. >>Or I can inject a piece of code in the init block and call >>rb_undef_method on the setItemCount wrapper, but that's just plain >>ugly in my eyes. >> >>Now, having the ruby proxy is not a big problem for me, and i can live >>with having that. >>But for others this might be a problem, so maybe investigating a >>potential %setter >>directive might be a good idea regardless of my situation. That would >>also be more convenient in general. >> >>I would suggest not making this new directive specific for making >>setters, though, but more like a %rubyrename: working like %rename but >>entering the wrapper generation at the same stage of %alias. >>In other words, a variant of %rename that doesn't generate wrapper >>functions but just uses calls to the ruby interpreter (rb_*) to alter >>the class definitions. >>I'm not an expert of swig internals though, so what I say might be >>utter nonsense. >>Forgive me in advance if this is the case. >> >> >> >> |
From: Charlie S. <cf...@in...> - 2006-02-02 07:30:49
Attachments:
smime.p7s
|
Hi Marcelo, You are completely right...learn something new every day. I'll put something in the Ruby documentation about this case. Might be good to update the general %rename documentation - it doesn't actually mention anything about quotes. There are 4 examples (out of roughly 120) of using rename with quotes in the documentation (and one in the ruby section) - so you could deduce it though. Charlie Marcelo Matus wrote: > About this thread.... > > How are you using rename? did you just try: > > %rename("itemCount=") setItemCount(); > > ie, using quotes?, I guess the invalid symbol error only appears if > you try like this: > > %rename(itemCount=) setItemCount(); > > Marcelo > > > Charlie Savage wrote: > >> Thinking about this a bit more, I assume the same applies to >> getters. So if your case was slightly different: >> >> uint getItemCount(); >> void setItemCount(uint s); >> >> It would be nice to be able to use this code in Ruby like this: >> >> puts some_object.item_count >> some_object.item_count = 5 >> >> I like your idea of a rename that does not happen in C++ but instead >> happens when defining a method in a scripting language. So maybe >> something like %targetRename >> >> %targetRename getItemCount() "itemCount"; >> %targetRename setItemCount() "itemCount=" >> >> The reason this is different than just plane %rename is that it lets >> you use identifiers that are legal in the scripting language but not >> in C++. For Ruby this would be methods like equals?, modify!, >> itemCount=. It would also avoid conflict with C++ keywords. >> Seems like this would also be generally useful in other languages. >> Thoughts? >> >> Charlie >> >> >> nerochiaro wrote: >> >>>> The %predicate and %bang methods are for methods that end in ? or ! >>>> - so >>>> that's not what you want. >>>> >>> >>> Of course not, but they do a similar thing. >>> I mentioned them because they too allow me to have names that are >>> illegal in C/C++ but are ok in ruby. >>> >>> >>> >>>> Try using the %alias directive - I've had luck with that in the >>>> past when %rename >>>> does not work (for example, the name conflicts with a C++ keyword). >>>> So in your case: %alias setItemCount "itemCount="; >>>> >>>> If that works, then you'll end up with two methods exposed, one being >>>> setItemCount the other being itemCount. You might try then to use >>>> %ignore to get rid of the setItemCount...but if I remember correctly >>>> that won't work because it will hide the method before it can be >>>> aliased. >>>> So see if %alias works for you. If not, then we can investigate >>>> whether >>>> %rename should handle this case or if would be better adding another >>>> feature directive to Ruby SWIG called %setter or some such thing. >>>> >>>> >>> >>> This works like you say: using %alias works to create the "itemCount=" >>> method, but the old "setItemCount" is still there. >>> >>> So I still need a ruby proxy class to remove one or at least hide it >>> by making it private. >>> Or I can inject a piece of code in the init block and call >>> rb_undef_method on the setItemCount wrapper, but that's just plain >>> ugly in my eyes. >>> >>> Now, having the ruby proxy is not a big problem for me, and i can live >>> with having that. >>> But for others this might be a problem, so maybe investigating a >>> potential %setter >>> directive might be a good idea regardless of my situation. That would >>> also be more convenient in general. >>> >>> I would suggest not making this new directive specific for making >>> setters, though, but more like a %rubyrename: working like %rename but >>> entering the wrapper generation at the same stage of %alias. >>> In other words, a variant of %rename that doesn't generate wrapper >>> functions but just uses calls to the ruby interpreter (rb_*) to alter >>> the class definitions. >>> I'm not an expert of swig internals though, so what I say might be >>> utter nonsense. >>> Forgive me in advance if this is the case. >>> >>> >>> >>> > > > |
From: nerochiaro <ner...@gm...> - 2006-02-02 09:15:32
|
> About this thread.... > How are you using rename? did you just try: > %rename("itemCount=3D") setItemCount(); > ie, using quotes?, I guess the invalid symbol error only appears if you t= ry like this: > %rename(itemCount=3D) setItemCount(); Using %rename with quotes seems to work fine. Thanks for pointing this out. Just out of curiosity, what is the rationale behind the choice to have separate directives for %bang and %predicate in ruby ? If I understand correctly one could just use %rename with quotes to add the question/exclamation mark to ruby method names. |
From: Charlie S. <cf...@in...> - 2006-02-02 09:22:43
Attachments:
smime.p7s
|
Well, the %bang method is probably not very useful (due to my misunderstanding of %rename). Perhaps it should be removed (it was just added in a couple of weeks ago). The %predicate method is a bit more useful since it sticks in a check at the end to ensure that a boolean value is returned (see the documentation for more info). Charlie nerochiaro wrote: >> About this thread.... >> How are you using rename? did you just try: >> %rename("itemCount=") setItemCount(); >> ie, using quotes?, I guess the invalid symbol error only appears if you try like this: >> %rename(itemCount=) setItemCount(); >> > > Using %rename with quotes seems to work fine. > Thanks for pointing this out. > > Just out of curiosity, what is the rationale behind the choice to have > separate directives for %bang and %predicate in ruby ? > If I understand correctly one could just use %rename with quotes to > add the question/exclamation mark to ruby method names. > > > ------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. Do you grep through log files > for problems? Stop! Download the new AJAX search engine that makes > searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! > http://sel.as-us.falkag.net/sel?cmd=k&kid3432&bid#0486&dat1642 > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user > > > |
From: nerochiaro <ner...@gm...> - 2006-02-02 12:44:12
|
>> Just out of curiosity, what is the rationale behind the choice to have >> separate directives for %bang and %predicate in ruby ? >> If I understand correctly one could just use %rename with quotes to >> add the question/exclamation mark to ruby method names. > > Well, the %bang method is probably not very useful (due to my > misunderstanding of %rename). Perhaps it should be removed (it was just > added in a couple of weeks ago). > > The %predicate method is a bit more useful since it sticks in a check at > the end to ensure that a boolean value is returned (see the documentation > for more info). Oh i see. I didn't know about the check on the return value. It makes sense then. As for removing bang, well, it doesn't make much of a difference. It's just two ways of doing the same thing (%bang and %rename). Not a bad thing probably, as long as both are properly documented. |
From: William S F. <ws...@fu...> - 2006-02-02 21:45:12
|
nerochiaro wrote: >>>Just out of curiosity, what is the rationale behind the choice to have >>>separate directives for %bang and %predicate in ruby ? >>>If I understand correctly one could just use %rename with quotes to >>>add the question/exclamation mark to ruby method names. >> Well, the %bang method is probably not very useful (due to my >>misunderstanding of %rename). Perhaps it should be removed (it was just >>added in a couple of weeks ago). >> >> The %predicate method is a bit more useful since it sticks in a check at >>the end to ensure that a boolean value is returned (see the documentation >>for more info). > > Oh i see. I didn't know about the check on the return value. It makes > sense then. > As for removing bang, well, it doesn't make much of a difference. > It's just two ways of doing the same thing (%bang and %rename). Not a > bad thing probably, as long as both are properly documented. > > Personally, I'd rather see just one way to solve a problem to keep things simple. Many solutions are solved using basic SWIG building blocks and all that is required is to document the solution in the documentation. If %bang is just a form of %rename and you really want to keep %bang, then I suggest implementing %bang as a macro using %rename, rather than having extra code in ruby.cxx to handle this. William |
From: Charlie S. <cf...@in...> - 2006-02-02 22:02:14
Attachments:
smime.p7s
|
Agree with your point William. I'll take out the code in ruby.cxx and replace it with a macro as you suggest. Charlie William S Fulton wrote: > nerochiaro wrote: >>>> Just out of curiosity, what is the rationale behind the choice to have >>>> separate directives for %bang and %predicate in ruby ? >>>> If I understand correctly one could just use %rename with quotes to >>>> add the question/exclamation mark to ruby method names. >>> Well, the %bang method is probably not very useful (due to my >>> misunderstanding of %rename). Perhaps it should be removed (it was >>> just >>> added in a couple of weeks ago). >>> >>> The %predicate method is a bit more useful since it sticks in a >>> check at >>> the end to ensure that a boolean value is returned (see the >>> documentation >>> for more info). >> >> Oh i see. I didn't know about the check on the return value. It makes >> sense then. >> As for removing bang, well, it doesn't make much of a difference. >> It's just two ways of doing the same thing (%bang and %rename). Not a >> bad thing probably, as long as both are properly documented. >> >> > Personally, I'd rather see just one way to solve a problem to keep > things simple. Many solutions are solved using basic SWIG building > blocks and all that is required is to document the solution in the > documentation. If %bang is just a form of %rename and you really want > to keep %bang, then I suggest implementing %bang as a macro using > %rename, rather than having extra code in ruby.cxx to handle this. > > William > > |