[gambit-list] destructuring bind define-type

David Rush kumoyuki at gmail.com
Tue Jun 2 17:09:39 EDT 2009


2009/6/2 lowly coder <lowlycoder at huoyanjinjing.com>:
> 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).

*sigh* The naming will be confusing because of your previous choices, but...

(with-cons p
  (lambda (p1 p2)
    (with-p3 p1
      (lambda (x1 y1 z2)
         (with-p3 p2
           (lambda (x2 y2 z2)
             (make-point3 (+ x1 x2) (+ y1 y2) (+ z1 z2))
             ))))))

If you are implementing a bunch of dyadic operations you can of course
encapsulate this via recursive application of the pattern. This is
better than a macro because it is, in fact, more flexible; to say
nothing of the phasing issues that can come into play when you start
building up a large macro library.

This is an example of a general Scheme style rule which doesn't seem
to get propagated so much anymore in c.l.s: when given a choice
between using a function and a macro, using a function is almost
always the right choice. It is certainly true until you learn just how
powerful LAMBDA and full TCO really are.

david rush
-- 
GPG Public key at http://cyber-rush.org/drr/gpg-public-key.txt



More information about the Gambit-list mailing list