ffi and struct by-value return types added by klm` on Wed May 16 23:32:25 2018

(import srfi-4)

(foreign-declare "
struct vec2 {
 double x, y;
};
struct vec2 vec2_abs(struct vec2 a) {
 struct vec2 r = {a.x > 0 ? a.x : -a.x , a.y > 0 ? a.y : -a.y };
 return r;
}
")

(define (vec2-abs v)
  (let ((result (make-f64vector 2)))
    ((foreign-lambda* void ((f64vector dest)
			    (f64vector a))
		      "*((struct vec2*)dest) = vec2_abs(*((struct vec2*)a));")
     result v)
    result))

(print (vec2-abs (f64vector -1  2)))
(print (vec2-abs (f64vector  1  2)))
(print (vec2-abs (f64vector  1 -2)))