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

Things to consider for CLtL'97



    Date: Mon, 3 Mar 86 10:43 EST
    From: Guy Steele <gls@THINK-AQUINAS.ARPA>

	Date: Fri, 28 Feb 86 17:06 EST
	From: David C. Plummer <DCP@SCRC-QUABBIN.ARPA>

	    Date: Fri, 28 Feb 86 15:04 EST
	    From: Guy Steele <gls@THINK-AQUINAS.ARPA>

		Date: Tue, 25 Feb 86 11:15 EST
		From: David C. Plummer <DCP@SCRC-QUABBIN.ARPA>

		reduce should have a :KEY keyword argument.  For example, suppose you
		have a sequence of sequences, and you want to know the sum of the
		lengths of the inner sequences.  Currently, I think you have to do
			(reduce #'(lambda (so-far subsequence)
				    (+ so-far (length sub-sequence)))
				sequence)
		but I would prefer to do
			(reduce #'+ sequence :key #'length)

	    (REDUCE #'+ (MAP (TYPE-OF sequence) #'length sequence))

	Yours conses.  Mine doesn't.

    Argh.  If you're worried about conses, use LOOP.  Seems like everyone
    else does.  (This week I am of the opinion that all those :START and
    :END keywords were a mistake.)
If I were worried about speed, I would use LOOP.  Since I wasn't, I
wanted to be pretty and still have some small spattering of efficiency.
(This month I'm trying not to use LOOP when other CL constructs are
cleanlier.)

	    ...
	    Did you mean:

		modify-seq item sequence modifier &key start end from-end test test-not
		modify-seq-if predicate sequence modifier &key start end from-end
		modify-seq-if-not predicate item sequence modifier &key start end from-end

	    ?  
	I see, I think.  Yes, I want the -IF and -IF-NOT forms as well.

	    And should they all also take a :KEY argument?
	I don't think so.  Consider what :KEY does.  It extracts a part of the
	datastructure.  To put it back, the implementation would have to do
	something like
		(setf (funcall key sequence-element)
		      (funcall modifier
			       (funcall key sequence-element)))
	and SETF of FUNCALL isn't generally invertable.

    Sorry; I meant the :KEY part to be used only in conjunction with the
    test, not the modify part of the operation.  See how tricky it is to
    specify these things?

Glorp!  I see, you meant
	(when (funcall predicate (funcall key seqeunce-element))
	  (setf <sequence-element> (funcall modifier sequence-element)))
Yeah, I guess that would be reasonable.

    Seems to me JONL once proposed an omnibus sequence function with a name
    such as MEMASSDELREMCONCQ-IF that simply took enough options to be able
    to do anything you desired with a sequence.
:-{