[gambit-list] c-array

Marc Feeley feeley at iro.umontreal.ca
Sun Feb 15 00:32:54 EST 2009


On 15-Feb-09, at 12:29 AM, lowly coder wrote:

> ... wow ... thanks!
>
> On Sat, Feb 14, 2009 at 9:14 PM, Marc Feeley  
> <feeley at iro.umontreal.ca> wrote:
>
> On 14-Feb-09, at 11:58 PM, lowly coder wrote:
>
> question 1:
>
> Is it possible to write gambit code to produce the equiv of:
> int foo[200]; ?
>
> the current best I have in mind is:
> (let ((foo (malloc (* 200 8)))) ... )

Here is another, more generic, approach which uses a macro to generate  
the various functions:

(c-declare #<<end-of-c-declare

#include <stdlib.h>

end-of-c-declare
)

(define-macro (define-array-allocator-and-accessors type)

   (define (sym . syms)
     (string->symbol (apply string-append
                            (map symbol->string syms))))

   (let ((type-str (symbol->string type)))
     `(begin

        (define ,(sym 'alloc- type '-array)
          (c-lambda (int) (pointer ,type)
                    ,(string-append
                      "___result_voidstar = malloc( ___arg1 * sizeof("
                      type-str
                      ") );")))

        (define ,(sym 'free- type '-array)
          (c-lambda ((pointer ,type)) void
                    "free( ___arg1 );"))

        (define ,(sym type '-array-ref)
          (c-lambda ((pointer ,type) int) ,type
                    "___result = ___arg1[___arg2];"))

        (define ,(sym type '-array-set!)
          (c-lambda ((pointer ,type) int ,type) void
                    "___arg1[___arg2] = ___arg3;")))))

;; test it:

(define-array-allocator-and-accessors int)
(define-array-allocator-and-accessors double)

(define a (alloc-int-array 5))
(define b (alloc-double-array 10))

(int-array-set! a 1 111)
(int-array-set! a 2 222)
(pp (+ (int-array-ref a 1) (int-array-ref a 2))) ;; 333

(double-array-set! b 1 1.5)
(double-array-set! b 2 2.0)
(pp (+ (double-array-ref b 1) (double-array-ref b 2))) ;; 3.5

(free-int-array a)
(free-double-array b)






More information about the Gambit-list mailing list