This would be really neat to have, but as someone who has written a lot of FFI (foreign function interface) code in Common Lisp which has a very powerful such interface, there are a lot of nuances that needs to be covered in order to have a decent FFI.
For example, what if you need to call a function which accepts a struct as its first argument which contains a pointer to another struct which in turn has a list of unsigned integers of size Foo (defined with a typedef in a .h file of course). The second argument being a pointer to a callback function. That just gives a small idea of the issues one would come across. Thankfully there is a C library, libffi, which can help here. It's designed to assist when creating an FFI for something like GNU APL. I recommend anyone who considers taking up this project to investigate it. libffi can be found here: https://github.com/libffi/libffi I certainly would really like it if this was implemented. Regards, Elias On 8 Feb 2017 03:01, "Juergen Sauermann" <juergen.sauerm...@t-online.de> wrote: > Hi Xiao-Yong, > > I believe this could be achieved by a single "master"-native function > which then loads the > actual DLL as specified by the arguments of the master function. Referring > to the example in > link you gave below: > > * a=: 'kernel32 GetProfileStringA s *c *c *c *c s' > b=: 'windows';'device'; 'default'; (32$'z');32 > a cd b > +--+-------+------+-------+--------------------------------+--+ > |31|windows|device|default|HP LaserJet 4P/4MP,HPPCL5MS,LPT |32| > +--+-------+------+-------+--------------------------------+--+* > > This would become in GNU APL: > > * a← 'kernel32 GetProfileStringA s *c *c *c *c s' > b← 'windows' 'device' 'default' (32⍴'z') 32** 'universal-dll-loader' ⎕FX > 'cd'** a cd b ⍝ dlopen("kernel32.dll"), dlsym("GetProfileStringA") on first > access,** ⍝ and call GetProfileStringA with argument b* > > The *universal-dll-loader.so* needs to be written only once and contains > mainly the code from github below. > That code somehow goes into the *native/template_F12.cc* code of GNU APL and > thats it. > > If you need help doing this then please let me know. > > /// Jürgen > > > > On 02/07/2017 06:30 PM, Xiao-Yong Jin wrote: > > It would be nice if one doesn't need to write wrappers and the APL system can > do the > structure conversions within the APL interpreter. In J, you can dlopen a > library > and pass J values directly without writing and compiling C, see > > http://www.jsoftware.com/help/user/call_procedure.htm > > and the relevant code is at > > https://github.com/jsoftware/jsource/blob/master/jsrc/x15.c > > It would simplify using external libraries a lot. > > > On Feb 4, 2017, at 7:38 AM, Juergen Sauermann <juergen.sauerm...@t-online.de> > <juergen.sauerm...@t-online.de> wrote: > > Hi, > > yes there is: native functions. You can load shared libraries and ⎕FX > functions in > them to be called from APL code. The src/native directory contains a few > templates > that you can use as a starting point and to call your favourite library from > them. > > Of course you need to provide wrappers from/to APL values to/from the data > structures expected or produced by the libraries. > > Coming back to your other problems, if you do not like the terminal I/O of > GNU APL, then > you can write your own one and call libapl from it. I have extended libapl > recently, giving > you the full functionality of GNU APL without the specific ways how it > handles terminal IO. > > /// Jürgen > > > On 02/04/2017 02:52 AM, enz...@gmx.com wrote: > > is there method for loading a c lib and using it in apl ? cdecl? like this > in fpc? > > ftp://ftp.freepascal.org/fpc/docs-pdf/CinFreePascal.pdf > > > > > > >