I have now tried to go back to the basic example in the documentation by calling a single valued function sigmoid from module NumericFuns using jl_eval_string with no success. The code snippet below calling "Base.sqrt(2.0)" works as anticipated, but the snippet calling "NumericFuns.sigmoid(0.0)" ends up in a seg fault...
jl_value_t *ret = (jl_value_t*)(jl_eval_string("Base.sqrt(2.0)")); if (jl_is_float64(ret)) { double ret_unboxed = jl_unbox_float64(ret); printf("sqrt(2.0) in C: %e \n", ret_unboxed); } // Call sigmoid from NumericFuns module jl_value_t* sig = (jl_value_t*) (jl_eval_string("NumericFuns.sigmoid(0.0)")); if(jl_is_float64(sig)){ double unsig = jl_unbox_float64(sig); } Any suggesions? Thanks, Einar On Fri, Sep 5, 2014 at 7:23 PM, Tobias Knopp <tobias.kn...@googlemail.com> wrote: > Yes, Jakes suggestion looks good. When I wrote the embedding doku I also > played around with several internal functions and it turned out that > jl_eval_string is very versatile and can be used in various circumstances. > > Einar: Would be great if you could test it and improve the embedding > documentation (on the github page) with an example how to get arbitrary > module pointer. > > Thanks > > Tobi > > Am Freitag, 5. September 2014 17:46:33 UTC+2 schrieb Jake Bolewski: > >> It's jl_eval_string located in jl_api.c in src. >> >> so you would do >> jl_value_t * func2 = jl_eval_string("DSP.hanning") >> >> The best way to play around with Julia's c-api is within julia itself. >> julia> pkg_ptr = ccall(:jl_eval_string, Ptr{Void}, (Ptr{Cchar},), >> "Base.Pkg.clone") >> Ptr{Void} @0x00007fd11c1754a0 >> >> julia> unsafe_pointer_to_objref(ans) >> clone (generic function with 2 methods) >> >> julia> typeof(ans) >> Function >> >> That way you can prototype what you want much more easily. >> >> On Friday, September 5, 2014 9:32:43 AM UTC-4, Einar Otnes wrote: >>> >>> Thank you for your help on this. It seems that the 'jl_eval_global_var' >>> function is local as I got the error "undefined reference to >>> `jl_eval_global_var'" when linking. I replaced >>> your suggestion with: >>> >>> jl_module_t* jl_dsp_module = (jl_module_t*) >>> jl_get_binding(jl_main_module, jl_symbol("DSP")); >>> jl_function_t* func2 = jl_get_function(jl_dsp_module,"hanning"); >>> >>> This compiles OK, but I get a "segfault (core dumped)" when running the >>> line with 'jl_get_function' . >>> >>> Any ideas or thoughts? >>> >>> Thanks, >>> >>> Einar >>> >>> >>> >>> >>> >>> >>> >>> >>> On Fri, Sep 5, 2014 at 11:15 AM, Ivar Nesje <iva...@gmail.com> wrote: >>> >>>> I would guess that something like >>>> >>>> module = jl_eval_global_var >>>> <https://github.com/JuliaLang/julia/blob/6277015ee3d46f20149136d092525bec95b6e29d/src/julia.h#L917> >>>> (jl_main_module, jl_sym >>>> <https://github.com/JuliaLang/julia/blob/6277015ee3d46f20149136d092525bec95b6e29d/src/julia.h#L666> >>>> ("MyModule")) >>>> >>>> would work, but I don't have the required testing setup to see if it >>>> actually works. (Where is my C REPL?) The embedding API has not gotten much >>>> attention (yet), so it is mostly documented in source, and it is likely >>>> that there will be some adjustments. >>>> >>>> >>>> On Friday, September 5, 2014 10:09:03 AM UTC+2, Einar Otnes wrote: >>>>> >>>>> Sorry, I'm a bit slow. How do I look up a binding for a specific >>>>> module? In other words, how would I explicitly get to call the "fftfreq" >>>>> function in the "DSP" module from C/C++? >>>>> >>>>> Is this this documented anywhere in Julia docs? >>>>> >>>>> Thanks, >>>>> Einar >>>>> >>>>> >>>>> >>>>> On Wednesday, September 3, 2014 3:10:59 PM UTC+2, Isaiah wrote: >>>>>> >>>>>> If you have defined a module already (by eval'ing julia code?) then >>>>>> you can look up the binding and cast that to a jl_module_t. >>>>>> On Sep 3, 2014 8:14 AM, "Einar Otnes" <eot...@gmail.com> wrote: >>>>>> >>>>>>> Dear experts, >>>>>>> >>>>>>> I've looking at the documentation " Embedding Julia" ( >>>>>>> http://julia.readthedocs.org/en/latest/manual/embedding/) to figure >>>>>>> out how I can call my own julia functions from within C, and I'm >>>>>>> struggling >>>>>>> to figure out how I should define the jl_module_t that corresponds the >>>>>>> module I've defined. The examples show that there is an instance of >>>>>>> jl_module_t, "jl_base_module", that you need to provide to be able to >>>>>>> call a function defined in the base module. How do I define a >>>>>>> corresponding >>>>>>> jl_module_t type for the modules that are defined outside of standard >>>>>>> julia, e.g. for the external packages or the modules I have created >>>>>>> myself? >>>>>>> >>>>>>> Thanks for your help. >>>>>>> >>>>>>> Best regards, >>>>>>> >>>>>>> Einar Otnes >>>>>>> >>>>>>> >>>