>
> Oh man...
> and why would anyone may want to use this? :)
>
> Sure you can do whatever it takes to implement a feature you want so badly,
> but hey..
> If something that takes so much effort and so inefficient as result, would
> you consider abandon the idea and use something else instead? :)
> Because it is straightly against the philosophy of NB: be fast and
> explicit.
> And you seem to be in favor of implicitness.
> Well, nevertheless, it is a honorable goal, so good luck :)


You are right. Actually it was just a workaround to see if I could bypass
some of the "limitations" but it is definitely too ugly and inefficient to
be useful.
The C code will be changed to fit Pharo and that will do the trick.

And let me remind you that despite that NB implements FFI to speak with C,
> it is not obliged to implement features of C language itself. It lets you
> speak with C programs, but not lets you write programs like in C (see the
> difference? :)
>

You are definitely right once again. I noticed today that lately I was
writing more C-ish code in Pharo than Smalltalk-ish code...
But I really like NativeBoost :(

2015-07-16 18:33 GMT+02:00 Igor Stasenko <siguc...@gmail.com>:

>
>
> On 15 July 2015 at 11:16, Matthieu Lacaton <matthieu.laca...@gmail.com>
> wrote:
>
>> Hello Igor,
>>
>> Thanks for your answer.
>>
>> I implemented something like that for the printf function:
>> Basically, it generates a method with matching arguments and executes it.
>>
>> *printf:* stringFormat *args:* tab
>>>
>>>     | argNumber functionArgs functionPrototype methodCorpse
>>> methodSelector argsArray |
>>>
>>>     ((tab size % 2) = 0) ifFalse: [
>>>         Transcript show: 'error'.
>>>         ^self.
>>>     ].
>>>
>>>     argNumber := 0.
>>>     functionPrototype := 'printf: stringFormat'.
>>>     functionArgs := ''.
>>>     methodCorpse := ''.
>>>     argsArray := (Array new: (tab size / 2) + 1).
>>>     argsArray at: 1 put: stringFormat.
>>>
>>>     1 to: tab size by: 2 do: [ :i |
>>>         functionPrototype := functionPrototype, ' arg', argNumber
>>> asString, ': ', (tab at: i) asString, argNumber asString.
>>>         functionArgs := functionArgs, ' ', (tab at: i) asString, ' ',
>>> (tab at: i) asString, argNumber asString, ','.
>>>         argsArray at: argNumber + 2 put: (tab at: i + 1).
>>>         argNumber := argNumber + 1.
>>>     ].
>>>     functionArgs := functionArgs allButLast.
>>>
>>>     methodCorpse := functionPrototype, Character cr asString, '
>>> <primitive: #primitiveNativeCall module: #NativeBoostPlugin>', Character cr
>>> asString, Character cr asString, '    ^self nbCall: #( void printf ( String
>>> stringFormat,', functionArgs asString, ' ) )', Character cr asString, '
>>>     module: NativeBoost CLibrary'.
>>>
>>>     methodSelector := self class compile: methodCorpse.
>>>
>>>     self perform: methodSelector withArguments: argsArray.
>>>
>>
>>
>> Then you can call it like that :
>>
>> MyClass printf: 'Test of printf. String: %s, Int : %d, Long: %ld, Char:
>> %c, Double: %lf' args: { 'String'. 'This is a string'. 'int'. 100. 'long'.
>> 10000000. 'char'. 89. 'double'. 3.14159 }.
>>
>>
>> I also tried it for some other variadic functions and, on my computer (I
>> am running archlinux), it seemed to work for every type of argument except
>> "float". It works fine for "double" though.
>> For "char" you need to pass the integer ASCII value directly for it to
>> work. I tried with "Character value: xxx" but it didn't work.
>>
>> I know that this is very hackish and very bad, and I am aware it has some
>> drawbacks. Moreover I am not even sure it will work everytime.
>> But for now it seems to work ...
>>
>> Oh man...
> and why would anyone may want to use this? :)
>
> Sure you can do whatever it takes to implement a feature you want so badly,
> but hey..
> If something that takes so much effort and so inefficient as result, would
> you consider abandon the idea and use something else instead? :)
> Because it is straightly against the philosophy of NB: be fast and
> explicit.
> And you seem to be in favor of implicitness.
> Well, nevertheless, it is a honorable goal, so good luck :)
>
>
>> 2015-07-13 19:24 GMT+02:00 Igor Stasenko <siguc...@gmail.com>:
>>
>>>
>>>
>>> On 10 July 2015 at 10:18, Matthieu Lacaton <matthieu.laca...@gmail.com>
>>> wrote:
>>>
>>>> Hello,
>>>>
>>>> Is it possible with NativeBoost to create a binding for a variadic
>>>> function ?
>>>>
>>>> I've seen the printf example in NBCPrinter but this implementation is
>>>> kind of cheating since it always pass just a %s as format and one already
>>>> formatted string to the C function.
>>>>
>>>> I've written a simple variadic function which adds every integer it
>>>> receives as argument (first argument is for the number of following
>>>> arguments) :
>>>>
>>>> int add(int number,...);
>>>>
>>>> In Pharo I've tried something like this :
>>>>
>>>> *add: *number *arg1: *first *arg2: *second
>>>>> <primitive: #primitiveNativeCall module: #NativeBoostPlugin>
>>>>>
>>>>> ^ self nbCall: #( int add (int number, int first, int second))
>>>>>   module: 'libMyLib.so'
>>>>>
>>>>
>>>> and it works fine with two arguments.
>>>>
>>>> Basically, doing so, I would need one method per number of arguments so
>>>> it's not very cool.
>>>>
>>>> I thought that maybe I could pass an array as argument to my Pharo
>>>> method but I didn't really find a way to figure out how to define the
>>>> nbCall without having a "Generic failure".
>>>>
>>>> *add: *number *args: *anArray
>>>>> <primitive: #primitiveNativeCall module: #NativeBoostPlugin>
>>>>>
>>>>> ^ self nbCall: #( int add (int number, ??? anArray))
>>>>>   module: 'libMyLib.so'
>>>>>
>>>>
>>>> Do you have an idea ?
>>>>
>>>>
>>> In short, there's no marshaller for converting an array of items, to
>>> same number of things on stack. That could solve the problem with your
>>> example: passing array of objects of *same* type. But in general, it is not
>>> what C variadic function(s) standing for. Because they stand for any number
>>> of arguments, of any type.
>>> In C, since all program is compiled statically, compiler knows the
>>> number of passed arguments and their types through compiling each
>>> particular call site(s) to variadic function. Which means that in fact, you
>>> are still supplying all information needed by compiler *before* run time.
>>>
>>> In variadic functions, you can pass any arguments of any type,
>>> but for converting each of them, you must tell NB what kind of
>>> marshaller should be used for it , which means, that it is impossible to
>>> know before run time, since you cannot know how many arguments you may
>>> pass, not speaking about their types.
>>>
>>>
>>>
>>>
>>>> Thanks,
>>>>
>>>> Matthieu
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Igor Stasenko.
>>>
>>
>>
>
>
> --
> Best regards,
> Igor Stasenko.
>

Reply via email to