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

Re: [Scheme-reports] Legacy caar to cddddr

On Sun, 23 Oct 2011, Alex Shinn wrote:

On Sat, Oct 22, 2011 at 11:46 PM, Andre van Tonder <andre@x> wrote:
On Fri, 21 Oct 2011, Aubrey Jaffer wrote:

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".

Personally I think it is.  `cadr' is `second' and `caddr' is `third',
which makes things clearer, and `cdddr' is (list-tail ls 3) or
maybe `third-tail'.

Maybe for a virgin programmer, but they don't make things clearer to someone who is used to the C*R deconstructors (e.g., anyone familiar with Scheme or LISP). Anyone who has programmed macros in this style knows that every additional argument in the descent simply needs another D, etc. SECOND, THIRD, LIST-TAIL, etc., very much lack the elegance and conciseness of the C*R notation. For example, should the argument of LIST-TAIL should be 3 or 4? I would have to look it up every single time, and invariably I count wrong. CDDDR I can just do in my mind in a second, and I know that to get REST arguments I just replace the last CA#R in my descent with CD#R. Also lost is the nice algebra of the letters internal to C*R - for example if I changed the syntax of the macro example by inserting a new parameter all I would need to do to everything after that element is to insert an additional D before the R - it is MUCH cleaner and less work to change CADR to CADDR, CADDR to CADDDR, than the more awkward changing of SECOND to THIRD and THIRD to FOURTH, etc.

Finally, you have the elegant algebra (CXYR z) = (CXR (CYR z)) where X and Y are strings of As and Ds. What elegant algebra do THIRD, SECOND, and LIST-TAIL satisfy?

Another example shows their use in small graph structures: e.g., in CDADADR, the list of symbols DADAD describes a descent path in a binary tree at a glance.

Scheme-reports mailing list