[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Scheme-reports] Legacy caar to cddddr

On Fri, 21 Oct 2011, Aubrey Jaffer wrote:

> | I've used those procedures myself, and *every* single time it has
> | been a mistake.  I'd rather they go away so I'm not tempted, and am
> | forced to properly abstract from the start.
> C*R procedures are very useful in symbolic algebra, for graphs and
> trees, and for manipulating programs (such as compiling).  Claims of
> their demise are premature.

I agree.  I have found them useful for manipulating programs.  Once you are 
used to them, you can see at a glance what they are doing (just like with CAR 
and CDR).

Here is an example of their use in a renaming-style macro (as WG2 promises us 
we will have).  Used here are CAR, CDR, CADR, CDDR, CADDR, and CDDDR.  All 
these are used in a completely obvious and transparent way.  This is not a 
"code smell".

     (define-syntax do
       (lambda (exp r c)
         (or (and (pair? (cdr exp))
                  (pair? (cddr exp)))
         (let ((specs (cadr exp))
               (end (caddr exp))
               (body (cdddr exp))
               (loop (syntax loop)))
           (or (and (list? specs)
                    (every? do-spec? specs)
                    (list? end))
            (,(r 'letrec) ((,loop
                       (,(r lambda) ,(map car specs)
                         (,(r 'cond) ,end
                               (,(r 'else) ,@body
                                       ,@(map (lambda (spec)
                                                (if (null? (cddr spec))
                                                    (car spec)
                                                    (caddr spec)))
              (,loop ,@(map cadr specs))))))))

Scheme-reports mailing list