[gambit-list] destructuring bind define-type
David St-Hilaire
sthilaid at iro.umontreal.ca
Tue Jun 2 08:36:03 EDT 2009
lowly coder wrote:
> Suppose I have the following:
>
> (define-type p3 x y z)
>
> (define (with-cons c func) (func (car c) (cdr c))))
>
> (define (with-p3 p func) (func (p3-x p) (p3-y p) (p3-z p)))
>
> (define p (cons (make-p3 1 2 3) (make-p3 4 5 6)))
>
> Now, ideally I want to write:
>
> (destructure-bind (cons (p3 x1 y1 z1) (p3 x2 y2 z2))
> (make-point3 (+ x1 x2) (+ y1 y2) (+ z1 z2)))
>
> How can I do this with with-cons / with-p3? (It seems I can only go
> done one level of nesting).
I think you might want to investigate time into using an object system
with generic functions... Gambit's define-type is juste a raw data
container with not much meat around it...
That said, if the usage your mentionning is just want you want to do,
then you can hardcode the macro for pairs of p3 objects:
(define-macro (destructure-bind pair-p3 . body)
(let ((arg (gensym 'arg))
(p1 (gensym 'p1))
(p2 (gensym 'p2)))
`(let* ((,arg ,pair-p3)
(,p1 (car ,arg))
(,p2 (cdr ,arg))
(x1 (p3-x ,p1))
(y1 (p3-y ,p1))
(z1 (p3-z ,p1))
(x2 (p3-x ,p2))
(y2 (p3-y ,p2))
(z2 (p3-z ,p2)))
, at body)))
> (destructure-bind (cons (make-p3 1 2 3) (make-p3 4 5 6))
(make-p3 (+ x1 x2) (+ y1 y2) (+ z1 z2)))
#<p3 #6 x: 5 y: 7 z: 9>
I hope it can help you...
David
More information about the Gambit-list
mailing list