Hmm...Mark you enlightened me how to deal with 2 dimension array with pure Guile code. thanks! But I'll suggest Aleix to handle this issue with C code which is easier. Anyway, we don't have to do all the things with Guile code since Guile is designed to interact with C code. We just choose the way we like. I think the principle is the same: ---------------pseudo code----------------- // ac is integer ,av is a list of strings SCM scm_glut_init (SCM ac ,SCM av) { int *argc = scm_gc_malloc(sizeof(int) ,"glut-init-argc"); char **argv = NULL; SCM p; int i = 0;
*argc = scm_to_int(ac); for(p = scm_car(av) ;i < *argc ;i++ ,p = scm_cdr(p)) { argv[i] = scm_to_locale_string(p); } argv[*argc] = NULL; glut_init(argc ,argv); return SCM_UNSPECIFIED; } ---------------end------------------ PS: I didn't guarantee the code above can be used directly, just describe the principle. On Fri, Jul 27, 2012 at 12:39 AM, Mark H Weaver <m...@netris.org> wrote: > Sorry, the indentation of my example code got messed up by tabs. > Here it is again: > > > (use-modules (system foreign)) > > (define libglut-obj (dynamic-link "libglut")) > > ;; (glut-init args), where args is the complete list of command > ;; arguments (starting with the program name), calls glutInit and > ;; returns the (possibly) modified list of arguments. > (define glut-init > (let ((foo-init-raw (pointer->procedure > void > (dynamic-func "glutInit" libglut-obj) > (list '* '*))) > (saved-c-strings '())) > (lambda (args) > (let* ((num-args (length args)) > (c-strings (map string->pointer args)) > (argcp (make-c-struct (list int) > (list num-args))) > (argv (make-c-struct (make-list (+ 1 num-args) '*) > (append c-strings > (list %null-pointer))))) > (set! saved-c-strings (append c-strings saved-c-strings)) > (foo-init-raw argcp argv) > (let ((argc (car (parse-c-struct argcp (list int))))) > (map pointer->string > (parse-c-struct argv > (make-list argc '*)))))))) > > ;; Example usage > (set-program-arguments (glut-init (program-arguments))) > > Mark > >