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