[alexandria-devel] curry and rcurry -> papply and rpapply?

Nikodemus Siivola nikodemus at random-state.net
Wed Aug 5 22:55:38 UTC 2009


2009/6/4 Nikodemus Siivola <nikodemus at random-state.net>:

>> What about papply or partial-apply? Or maybe p-apply? This way, The
>> reversed version might be called rp-apply. Otherwise
>> reverse-partial-apply?
>>
>> I am aware that this is a common usage/mistake in CL, but Alexandria
>> doesn't have to perpetuate this error. An unfortunate downside is
>> breaking backwards compatibility. I'm not sure what Alexandria's
>> policy is regarding this...
>>
>> I'm happy to send patches if this renaming is agreed upon.
>
> I'm not sure. I'm not totally opposed, but I'm not convinced either:
> even if it wrong, the names are "culturally correct", if you will.
> Names partial-apply and partial-reverse-apply would be my preferred
> ones if we did the renaming.

I'm slowly coming to think that calling them CURRY and RCURRY is
indeed a mistake we should stop propagating.

(defun partial-apply (function &rest partial-arguments)
  "Returns a function that calls FUNCTION with PARTIAL-ARGUMENTS followed by
the arguments it is called with."
  (declare (optimize (speed 3) (safety 1) (debug 1)))
  (let ((fn (ensure-function function)))
    (lambda (&rest more)
      (declare (dynamic-extent more))
      ;; Using M-V-C we don't need to append the arguments.
      (multiple-value-call fn (values-list partial-arguments)
(values-list more)))))

(define-compiler-macro partial-apply (function &rest partial-arguments)
  (let ((temps (make-gensym-list (length partial-arguments) "PARTIAL-ARG")))
    `(let ,(mapcar #'list temps partial-arguments)
       (declare (optimize (speed 3) (safety 1) (debug 1)))
       (lambda (&rest more)
         (declare (dynamic-extent more))
         (apply ,function , at temps more)))))

(defun reverse-partial-apply (function &rest partial-arguments)
  "Returns a function that calls FUNCTION with the arguments it is called with
followed by PARTIAL-ARGUMENTS."
  (declare (optimize (speed 3) (safety 1) (debug 1)))
  (let ((fn (ensure-function function)))
    (lambda (&rest more)
      (declare (dynamic-extent more))
      (multiple-value-call fn (values-list more) (values-list
partial-arguments)))))

Cheers,

 -- Nikodemus




More information about the alexandria-devel mailing list