Safely calling lisp lambda function from C?
PR
polos.ruetz at gmail.com
Tue Sep 8 17:27:59 UTC 2015
2015-09-08 18:15 GMT+02:00, bruce li <leilmyxwz at gmail.com>:
> cl_object callback_wrapper(cl_object lambda, cl_object ...) {
> cl_funcall(2, lambda, some_params);
> }
>
> It works OK if the passed in lambda function is syntactically correct.
> But it fails disastrously if the function contains errors...
Please note: the code snippets are taken from EQL. (I hope this helps.)
Fully protected function calls:
const cl_env_ptr l_env = ecl_process_env();
CL_CATCH_ALL_BEGIN(l_env) {
CL_UNWIND_PROTECT_BEGIN(l_env) {
cl_funcall(1, (cl_object)function);
}
CL_UNWIND_PROTECT_EXIT {}
CL_UNWIND_PROTECT_END;
}
CL_CATCH_ALL_END;
> A second question is... can I traverse lisp lists in C? I would like
> to collect everything into a C++ vector and pass that on to the
> engine's API.
Trivial traversing of Lisp lists:
QStringList l;
if(LISTP(l_list)) {
cl_object l_el = l_list;
while(l_el != Cnil) {
l << toQString(cl_car(l_el));
l_el = cl_cdr(l_el);
}
}
More information about the ecl-devel
mailing list