[Small-cl-src] apply in terms of funcall

Andreas Fuchs asf at boinkor.net
Sun Jun 6 21:10:12 UTC 2004


On 2004-05-15, Andreas Fuchs <asf at boinkor.net> wrote:
> ;;; A few months ago, there was a thread about FUNCALL and APPLY on
> ;;; c.l.l. I wrote this code to show how APPLY might be defined in
> ;;; terms of FUNCALL.

;;; As some of you noted, this version is buggy: it doesn't do the
;;; list-as-last-arg magick correctly. Let's fix that:

;;; This code fixes that:

(defun apply-definer (max-args)
  `(defun apply-1 (f args)
     (case (length args)
       ,@(loop for arg-count from 0 to max-args
	       collect `((,arg-count)
			 (funcall
			   f
			   ,@(loop for arg-idx from 0 to (1- arg-count)
				   collect `(nth ,arg-idx args)))))
       (otherwise
	(error ,(format nil "Can't apply to more than ~A args" max-args))))))

(defmacro define-apply (max-args)
  (apply-definer (etypecase max-args
		   (symbol (symbol-value max-args))
		   (number max-args))))

(defun my-apply (f &rest args)
	   (let ((last-arg (first (last args))))
	     (apply-1 f 
		      (if (listp last-arg)
			  (append (butlast args) last-arg)
			  args))))

(define-apply ; call-arguments-limit  ; might be a bit much for the poor impl
              20                      ; let's be humane
	      )

;;; example:

#|
CL-USER> (defun print-all (&rest args) (loop for arg in args  do (print arg)))

CL-USER> (my-apply #'print-all 1 2 3 '(1 2 3))

1 
2 
3 
1 
2 
3 

NIL
|#

> ;;; License: BSD-sans-advertising.

-- 
Andreas Fuchs, <asf at boinkor.net>, asf at jabber.at, antifuchs




More information about the Small-cl-src mailing list