int square(double a[],double b[]) { // Init Julia jl_init_with_image("/Users/fgans/julia/julia-4d1b751dda/lib/julia", "sys.ji"); JL_SET_STACK_BASE; // Define Array Type for 1D Array jl_value_t* array_type = jl_apply_array_type(jl_float64_type, 1); // Connect C-Arrays to julia Arrays jl_array_t *a_jl = jl_ptr_to_array_1d(array_type, a, 1, 0); jl_array_t *b_jl = jl_ptr_to_array_1d(array_type, b, 1, 0); // Load julia code jl_eval_string("include(\"square.jl\")"); // Get function jl_function_t *func = jl_get_function(jl_main_module, "square"); if (func==NULL) { printf("Function not found!\n"); return -1; } // Apply function jl_call2(func, (jl_value_t*)a_jl,(jl_value_t*)b_jl); if (jl_exception_occurred()) printf("%s \n", jl_typeof_str(jl_exception_occurred())); return 0; }
//try load julia DataArrays and DataFrames packages SEXP Julia_LoadDataArrayFrame() { jl_eval_string("using DataArrays,DataFrames"); if (jl_exception_occurred()) { jl_show(jl_stderr_obj(), jl_exception_occurred()); Rprintf("\n"); jl_exception_clear(); } else DataArrayFrameInited = 1; return R_NilValue; }
//first pass creat array then convert it to DataArray //second pass assign NA to element static jl_value_t *TransArrayToDataArray(jl_array_t *mArray, jl_array_t *mboolArray, const char *VarName) { char evalcmd[evalsize]; jl_set_global(jl_main_module, jl_symbol("TransVarName"), (jl_value_t *)mArray); jl_set_global(jl_main_module, jl_symbol("TransVarNamebool"), (jl_value_t *)mboolArray); snprintf(evalcmd, evalsize, "%s=DataArray(TransVarName,TransVarNamebool)", VarName); jl_value_t *ret = jl_eval_string(evalcmd); if (jl_exception_occurred()) { jl_show(jl_stderr_obj(), jl_exception_occurred()); Rprintf("\n"); jl_exception_clear(); return (jl_value_t *) jl_nothing; } return ret; }
//basically factor in R is 1-dim INTSXP and contain levels static jl_value_t *TransArrayToPoolDataArray(jl_array_t *mArray, jl_array_t *mpoolArray, size_t len, const char *VarName) { char evalcmd[evalsize]; jl_set_global(jl_main_module, jl_symbol("varpools"), (jl_value_t *)mpoolArray); jl_set_global(jl_main_module, jl_symbol("varrefs"), (jl_value_t *)mArray); snprintf(evalcmd, evalsize, "%s=PooledDataArray(ASCIIString,Uint32,%d)", VarName, len); jl_eval_string(evalcmd); snprintf(evalcmd, evalsize, "%s.pool=%s", VarName, "varpools"); jl_eval_string(evalcmd); snprintf(evalcmd, evalsize, "%s.refs=%s", VarName, "varrefs"); jl_eval_string(evalcmd); jl_value_t *ret = jl_eval_string((char *)VarName); if (jl_exception_occurred()) { jl_show(jl_stderr_obj(), jl_exception_occurred()); Rprintf("\n"); jl_exception_clear(); return (jl_value_t *) jl_nothing; } return ret; }
static jl_value_t *R_Julia_MD_NA_DataFrame(SEXP Var, const char *VarName) { SEXP names = getAttrib(Var, R_NamesSymbol); size_t len = LENGTH(Var); if (TYPEOF(Var) != VECSXP || len == 0 || names == R_NilValue) return (jl_value_t *) jl_nothing; char evalcmd[evalsize]; char eltcmd[eltsize]; const char *onename; SEXP elt; for (size_t i = 0; i < len; i++) { snprintf(eltcmd, eltsize, "%sdfelt%d", VarName, i + 1); elt = VECTOR_ELT(Var, i); //vector is factor or not if (getAttrib(elt, R_LevelsSymbol) != R_NilValue) R_Julia_MD_NA_Factor(elt, eltcmd); else R_Julia_MD_NA(elt, eltcmd); onename = CHAR(STRING_ELT(names, i)); if (i == 0) snprintf(evalcmd, evalsize, "%s=DataFrame(%s =%s)", VarName, onename, eltcmd); else snprintf(evalcmd, evalsize, "%s[symbol(\"%s\")]=%s", VarName, onename, eltcmd); //Rprintf("%s\n",evalcmd); jl_eval_string(evalcmd); if (jl_exception_occurred()) { jl_show(jl_stderr_obj(), jl_exception_occurred()); Rprintf("\n"); jl_exception_clear(); return (jl_value_t *) jl_nothing; } } return (jl_value_t *) jl_nothing;; }
static NOINLINE int true_main(int argc, char *argv[]) { if (jl_core_module != NULL) { jl_array_t *args = (jl_array_t*)jl_get_global(jl_core_module, jl_symbol("ARGS")); if (args == NULL) { args = jl_alloc_cell_1d(0); JL_GC_PUSH1(&args); jl_set_const(jl_core_module, jl_symbol("ARGS"), (jl_value_t*)args); JL_GC_POP(); } assert(jl_array_len(args) == 0); jl_array_grow_end(args, argc); int i; for (i=0; i < argc; i++) { jl_value_t *s = (jl_value_t*)jl_cstr_to_string(argv[i]); jl_set_typeof(s,jl_utf8_string_type); jl_arrayset(args, s, i); } } jl_function_t *start_client = jl_base_module ? (jl_function_t*)jl_get_global(jl_base_module, jl_symbol("_start")) : NULL; if (start_client) { jl_apply(&start_client, 1); return 0; } // run program if specified, otherwise enter REPL if (argc > 0) { if (strcmp(argv[0], "-")) { return exec_program(argv[0]); } } ios_puts("WARNING: Base._start not defined, falling back to economy mode repl.\n", ios_stdout); if (!jl_errorexception_type) ios_puts("WARNING: jl_errorexception_type not defined; any errors will be fatal.\n", ios_stdout); while (!ios_eof(ios_stdin)) { char *volatile line = NULL; JL_TRY { ios_puts("\njulia> ", ios_stdout); ios_flush(ios_stdout); line = ios_readline(ios_stdin); jl_value_t *val = (jl_value_t*)jl_eval_string(line); if (jl_exception_occurred()) { jl_printf(JL_STDERR, "error during run:\n"); jl_static_show(JL_STDERR, jl_exception_in_transit); jl_exception_clear(); } else if (val) { jl_static_show(JL_STDOUT, val); } jl_printf(JL_STDOUT, "\n"); free(line); line = NULL; uv_run(jl_global_event_loop(),UV_RUN_NOWAIT); } JL_CATCH { if (line) { free(line); line = NULL; } jl_printf(JL_STDERR, "\nparser error:\n"); jl_static_show(JL_STDERR, jl_exception_in_transit); jl_printf(JL_STDERR, "\n"); jlbacktrace(); } } return 0; }
int main() { jl_init(NULL); { // Simple running Julia code jl_eval_string("println(sqrt(2.0))"); } { // Accessing the return value jl_value_t *ret = jl_eval_string("sqrt(2.0)"); if (jl_is_float64(ret)) { double retDouble = jl_unbox_float64(ret); printf("sqrt(2.0) in C: %e\n", retDouble); } } { // Same as above but with function handle (more flexible) jl_function_t *func = jl_get_function(jl_base_module, "sqrt"); jl_value_t* argument = jl_box_float64(2.0); jl_value_t* ret = jl_call1(func, argument); if (jl_is_float64(ret)) { double retDouble = jl_unbox_float64(ret); printf("sqrt(2.0) in C: %e\n", retDouble); } } { // 1D arrays jl_value_t* array_type = jl_apply_array_type( jl_float64_type, 1 ); jl_array_t* x = jl_alloc_array_1d(array_type , 10); JL_GC_PUSH1(&x); double* xData = jl_array_data(x); size_t i; for(i=0; i<jl_array_len(x); i++) xData[i] = i; jl_function_t *func = jl_get_function(jl_base_module, "reverse!"); jl_call1(func, (jl_value_t*) x); printf("x = ["); for(i=0; i<jl_array_len(x); i++) printf("%e ", xData[i]); printf("]\n"); JL_GC_POP(); } { // define julia function and call it jl_eval_string("my_func(x) = 2*x"); jl_function_t *func = jl_get_function(jl_current_module, "my_func"); jl_value_t* arg = jl_box_float64(5.0); double ret = jl_unbox_float64(jl_call1(func, arg)); printf("my_func(5.0) = %f\n", ret); } { // call c function jl_eval_string("println( ccall( :my_c_sqrt, Float64, (Float64,), 2.0 ) )"); } { // check for exceptions jl_eval_string("this_function_does_not_exist()"); if (jl_exception_occurred()) { jl_show(jl_stderr_obj(), jl_exception_occurred()); jl_printf(jl_stderr_stream(), "\n"); } } jl_atexit_hook(); return 0; }