Skip to content

Commit 8108d4d

Browse files
committed
Add jlfunc (or jltryfunc)
1 parent 650bf7b commit 8108d4d

File tree

5 files changed

+50
-3
lines changed

5 files changed

+50
-3
lines changed

NAMESPACE

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ useDynLib(jl4R, .registration = TRUE)
33
# exportPattern("^\\jl_")
44
# exportPattern("^\\jlR_")
55
export(
6-
jl, jleval, jlrun, jlcall,
6+
jl, jleval, jlrun, jlcall, jlfunc,
77
R, toR,
8-
jlR, jlcallR,
8+
jlR, jlcallR, jlfuncR,
99
## unsafe function (closest to julia C API)
1010
jlvalue_eval,
1111
jlvalue, is.jlvalue,

R/jl4R.R

+15
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,22 @@ jlcall <- jltrycall <- function(meth, ..., parent_envir = parent.frame()) {
8686
jlvalue_or_jlexception(match.call(), jlval)
8787
}
8888

89+
jlfunc <- jltryfunc <- function(meth, ..., parent_envir = parent.frame()) {
90+
args <- jl_rexprs2(substitute(list(...)), parent_envir)
91+
## print(list(jltcargs=args, call=match.call(), s = substitute(list(...)),env=ls(parent_envir)))
92+
nmargs <- names(args)
93+
if(is.null(nmargs)) nmargs <- rep("",length(args))
94+
kwargs <- args[nmargs != ""]
95+
args <- args[nmargs == ""]
96+
## print(list(args=args, kwargs=kwargs))
97+
## print(lapply(args, jl))
98+
## print(.RNamedList2jlNamedTuple(kwargs))
99+
jlval <- .jlvalue_tryfunc(meth, jl(lapply(args, jl)), .RNamedList2jlNamedTuple(kwargs))
100+
jlvalue_or_jlexception(match.call(), jlval)
101+
}
102+
89103
jlcallR <- jltrycallR <- function(meth, ...) toR(jltrycall(meth, ...))
104+
jlfuncR <- jltryfuncR <- function(meth, ...) toR(jltryfunc(meth, ...))
90105

91106
# apply a method call
92107
jlvalue_call <- function(meth , ...) {

R/jl_internals.R

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
.External("jl4R_jlvalue_trycall", meth, jlargs, jlkwargs, PACKAGE = "jl4R")
3131
}
3232

33+
.jlvalue_tryfunc <- function(meth, jlargs, jlkwargs = jlvalue_eval("[]")) {
34+
if(!.jlrunning()) .jlinit()
35+
.External("jl4R_jlvalue_tryfunc", meth, jlargs, jlkwargs, PACKAGE = "jl4R")
36+
}
37+
3338
.jlvalue_call0 <- function(meth) {
3439
if(!.jlrunning()) .jlinit()
3540
.External("jl4R_jlvalue_call0", meth, PACKAGE = "jl4R")

inst/julia/JL4R.jl

+8
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ function jltrycall(fname, args, kwargs)
2727
end;
2828
end
2929

30+
function jltryfunc(f, args, kwargs)
31+
try
32+
f(args...; kwargs...);
33+
catch e
34+
e #showerror(stdout,e)
35+
end;
36+
end
37+
3038
end

src/jl4R.c

+20-1
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,24 @@ SEXP jl4R_jlvalue_trycall(SEXP args) {
753753
return resR;
754754
}
755755

756+
SEXP jl4R_jlvalue_tryfunc(SEXP args) {
757+
jl_value_t *res=NULL, *jlarg=NULL, *jlarg2=NULL;
758+
jl_function_t *func=NULL, *jlv=NULL;
759+
SEXP resR;
760+
761+
jl_module_t *jl_jl4r_module = (jl_module_t*)jl_get_global(jl_main_module, jl_symbol("JL4R"));
762+
func = jl_get_function(jl_jl4r_module, "jltryfunc");
763+
764+
JL_GC_PUSH4(&jlv,&res,&jlarg,&jlarg2);
765+
jlv = (jl_function_t*)get_preserved_jlvalue_from_R_ExternalPtrAddr(CADR(args));
766+
jlarg=(jl_value_t*)get_preserved_jlvalue_from_R_ExternalPtrAddr(CADDR(args));
767+
jlarg2=(jl_value_t*)get_preserved_jlvalue_from_R_ExternalPtrAddr(CADDDR(args));
768+
res = jl_call3(func, jlv, jlarg, jlarg2);
769+
resR=(SEXP)jlvalue(res);
770+
JL_GC_POP();
771+
return resR;
772+
}
773+
756774
SEXP jl4R_jlvalue_func_call(SEXP jl_func, SEXP jl_args, SEXP jl_nargs) {
757775
int nargs;
758776
jl_value_t **args;
@@ -900,12 +918,13 @@ static const R_ExternalMethodDef externalMethods[] = {
900918
// {"jl4R_as_Rvector",(DL_FUNC)&jl4R_as_Rvector,-1},
901919
// {"jl4R_as_jlRvector",(DL_FUNC)&jl4R_as_jlRvector,-1},
902920
{"jl4R_jlvalue_eval",(DL_FUNC) &jl4R_jlvalue_eval,-1},
921+
{"jl4R_jlvalue_trycall",(DL_FUNC) &jl4R_jlvalue_trycall,-1},
922+
{"jl4R_jlvalue_tryfunc",(DL_FUNC) &jl4R_jlvalue_tryfunc,-1},
903923
{"jl4R_jlvalue_call0",(DL_FUNC) &jl4R_jlvalue_call0,-1},
904924
{"jl4R_jlvalue_call1",(DL_FUNC) &jl4R_jlvalue_call1,-1},
905925
{"jl4R_jlvalue_call2",(DL_FUNC) &jl4R_jlvalue_call2,-1},
906926
{"jl4R_jlvalue_call3",(DL_FUNC) &jl4R_jlvalue_call3,-1},
907927
{"jl4R_jlvalue_func_call1",(DL_FUNC) &jl4R_jlvalue_func_call1,-1},
908-
{"jl4R_jlvalue_trycall",(DL_FUNC) &jl4R_jlvalue_trycall,-1},
909928
{"jl4R_jlvalue2R",(DL_FUNC) &jl4R_jlvalue2R,-1},
910929
{"jl4R_typeof2R",(DL_FUNC) &jl4R_typeof2R,-1},
911930
{"jl4R_jl_symbol",(DL_FUNC) &jl4R_jl_symbol,-1},

0 commit comments

Comments
 (0)