right way to wrap a C struct? added by retroj on Wed Jun 5 13:39:01 2013

(define-foreign-record-type (date "struct ln_date")
  (constructor: %%make-date)
  (destructor: %free-date)
  (int years %date-years %date-years-set!)
  (int months %date-months %date-months-set!)
  (int days %date-days %date-days-set!)
  (int hours %date-hours %date-hours-set!)
  (int minutes %date-minutes %date-minutes-set!)
  (double seconds %date-seconds %date-seconds-set!))

(define-record date this)
(define %make-date make-date)

(define (date-years d) (%date-years (date-this d)))
(define (date-months d) (%date-months (date-this d)))
(define (date-days d) (%date-days (date-this d)))
(define (date-hours d) (%date-hours (date-this d)))
(define (date-minutes d) (%date-minutes (date-this d)))
(define (date-seconds d) (%date-seconds (date-this d)))

(define (date-years-set! d v) (%date-years-set! (date-this d) v))
(define (date-months-set! d v) (%date-months-set! (date-this d) v))
(define (date-days-set! d v) (%date-days-set! (date-this d) v))
(define (date-hours-set! d v) (%date-hours-set! (date-this d) v))
(define (date-minutes-set! d v) (%date-minutes-set! (date-this d) v))
(define (date-seconds-set! d v) (%date-seconds-set! (date-this d) v))

(define (make-date . args)
  (let ((d (apply %%make-date args)))
    (set-finalizer! d %free-date)
    (%make-date d)))