(cond ((= (pointer-address root) 0)
'())
(else
- (let loop ((i 0))
- (cond ((= i size)
- '())
- (else
- (cons (element-proc root (* element-size i))
- (loop (+ i 1)))))))))
+ (reverse
+ (let loop ((i 0) (res '()))
+ (cond ((= i size)
+ res)
+ (else
+ (loop (+ i 1) (cons (element-proc root (* element-size i)) res)))))))))
(define (get-element-address root-pointer offset)
(make-pointer (+ (pointer-address root-pointer) offset)))
get-element-address
sized-string
wrap)
+
+
+;;; Function Mappers
+
+(define-syntax define-foreign-function
+ (lambda (x)
+ (syntax-case x (->)
+ ((_ ((foreign-lib name) arg-type ...) -> return-type)
+ (with-syntax ((name-string (datum->syntax x (symbol->string (syntax->datum #'name)))))
+ #'(define name
+ (pointer->procedure return-type
+ (dynamic-func name-string foreign-lib)
+ (list arg-type ...))))))))
+
+(export-syntax define-foreign-function)