I am trying to use a package function in my lisp library that will later be called from a C application. To be precise, it is shorten function from the str package.
Here is my lisp library text:
;; (require :str) ;; (use-package :str)
(defun echo-string (s) (coerce (format nil "Recieved input: ~10A" (shorten-string s)) 'base-string))
(defun shorten-string (s) (declare (string s)) (let ((l (length s))) (if (> l 10) (concat (shorten 7 s) (substring (- l 3) nil s)) s)))
First lines are commented out because i do not know their necessity in the library. That's part of the question.
However, all i get when trying to use any function from this library is a number of undecipherable errors, like this:
Here is my C code for a minimal case:
#include <stdlib.h> #include <stdio.h> #include <ecl/ecl.h>
// utility functions
cl_object make_cl_string(const char * pstring) { return ecl_make_constant_base_string(pstring, strlen(pstring)); }
int main(int argc, const char* argv[]) { /* Initialize ECL */ ecl_set_option(ECL_OPT_TRAP_SIGSEGV, false); cl_boot(argc, argv);
extern void init_lib_ASDF(cl_object); ecl_init_module(NULL, init_lib_ASDF);
// is this necessary? extern void init_lib_ECL_QUICKLISP(cl_object); ecl_init_module(NULL, init_lib_ECL_QUICKLISP); cl_object ecl_module_name = make_cl_string("ecl-quicklisp"); cl_require(1, ecl_module_name); cl_object str_module_name = make_cl_string("str"); cl_require(1, str_module_name); // this code fails, not clear what use as package designator /* cl_object str_package_name = make_cl_string(":str"); */ /* cl_use_package(1, str_package_name); */ extern void init_embedded_console(cl_object); ecl_init_module(NULL, init_embedded_console);
// library calls cl_object fname = make_cl_string("ECHO-STRING"); cl_object echo_func = cl_find_symbol(1, fname); assert(ECL_SYMBOLP(pstate->echo_func));
const char * line = "hello"; cl_object call_result = cl_funcall(2, echo_func, make_cl_string(line)); char * msg_str = malloc(call_result->string.fillp + 1); memcpy(msg_str, call_result->string.self, call_result->string.fillp + 1); printf("Output: %s\n", msg_str); free(msg_str);
const char * line2 = "hello"; call_result = cl_funcall(2, echo_func, make_cl_string(line2)); msg_str = malloc(call_result->string.fillp + 1); memcpy(msg_str, call_result->string.self, call_result->string.fillp + 1); printf("Output: %s\n", msg_str); free(msg_str);
return 0; }
What should be done for me to be able to use some package (installed with quicklisp) from my ECL library? How should the initialisation be done?