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

name that baby



Perhaps we should just go with the similarity of BABY-DOE and COMPOSE.

A multiple-values cognizant version of COMPOSE might be implemented as

     (define (compose g f)
       (lambda x (baby-doe (lambda () (apply g x)) f)))

(The argument order is the reverse of traditional COMPOSE.)  The
result of COMPOSE is a function that accepts as many arguments as
G.  The result of COMPOSE calls F on all the values returned by G.

Given this COMPOSE as primitive, we can define BABY-DOE as

  (define (baby-doe thunk bunk)
    ((compose thunk bunk))

Why not make COMPOSE the primitive and flush BABY-DOE?  Even with the
extra parens the name is half the length of "CALL-WITH-VALUE."  Or if
those extra parens bother you -- how did you get this far? -- then

   (define (compose-and-go a b)
     ((compose a b)))

Or how about this.  If we are going to rename VALUES to CONTINUE, then
rename BABY-DOE to CONTINUE-FROM or CONTINUING.  Then KMP's example
reads

   (continuing (lambda () (continue 1 2)) cons)

But then why stop at two arguments?  COMPOSE is usually n-ary.

   (define (swap x y) (values y x))

   (continuing (lambda () (continue 1 2)) swap cons) 
   => (2 . 1)

-Norman