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

Re: [Scheme-reports] Legacy caar to cddddr

 | Date: Fri, 21 Oct 2011 11:47:58 +0900
 | From: Alex Shinn <alexshinn@x>
 | On Fri, Oct 21, 2011 at 5:17 AM, Aubrey Jaffer <agj@x> wrote:
 | >
 | > In JACAL, polynomials are lists (of variable and coefficients) so
 | > that polynomial operations use the fastest operations that SCM
 | > (and other Scheme implementations) offers.  Changing polynomials
 | > to boxed record types would have a disastrous impact on memory
 | > usage, cache locality, and execution speed of JACAL.
 | That's fine, that's just using CAR and CDR, and possibly
 | CAAR and CDAR for the variable and coefficient of the
 | first term in the polynomial, so we're not even talking
 | about the three and four level accessors that I'm proposing
 | removing.
 | However, it would be better to abstract this:
 |   (define (term-variable x) (car x))
 |   (define (term-coefficient x) (cdr x))

That would run slower in interpreters.  We can do better by
remembering that Scheme has first-class procedures:

  (define term-variable car)
  (define term-coefficient cdr)

But those aren't how JACAL uses pairs.  It would be something like:

  (define poly:var car)
  (define bunch:first car)
  (define poly:coefficients cdr)
  (define poly:constant-term cadr)
  (define poly:linear-coefficient caddr)
  (define poly:non-constant-coefficients cddr)

Notice that we are already into the third level with CADDR.  These
accessor names do not cover all the ways in C*R they can be used.
CAR is also the constant in a coefficient list, or the first
coefficient in the CDR of a coefficient list...

CONS can be used to attach a variable to a list of coefficients, to
raise the variable exponent by 1 on all terms in a coefficient list,
to add an element to the front of a "bunch" (which serve as
mathematical vectors)...  Multiple versions of MAP would be needed.

 | in one place, which makes it easier to replace with an
 | alternate representation which could be faster in other
 | implementations.

JACAL extensively uses the properties of pairs in its manipulations,
resulting in succinct code.  So Scheme pairs are already optimized for
JACAL.  If you have a data representation with all the properties of
pairs which is faster than pairs, then replace pairs with your

 | Littering the bodies of your polynomial
 | functions with random calls to CDAR just makes the
 | code illegible and difficult to work with.

I don't find your name in any JACAL correspondence or ChangeLog.  Have
you actually looked at JACAL source?  Its unfair to declare my code
illegible without having made a serious examination of it.

One can't understand JACAL source without knowing Scheme or Lisp.  If
you know Scheme or Lisp, then uses of C*R are clear.  If not, renaming
every C*R won't be much help.

 | [Note if you've got a slow interpreter with no procedure
 | inlining but performance still matters, you can always
 | abstract with macros.]

  (define term-variable car)
  (define term-coefficient cdr)

Scheme-reports mailing list