(defun fun-params-rest (x &optional y (z (progn (formatt"z use default value ~%") (+ x y)) z-supplied-p) &rest values) (formatt"~a ~%" (list x y z z-supplied-p values))) (fun-params-rest12) ;;; (1 2 3 NIL NIL) (fun-params-rest1234567) ;;;; result: (1 2 3 T (A 4 B 5 C 6) 4 5 6)
关键字参数
1 2 3 4 5 6 7 8 9
(defun fun-params-key (x &key a (b (*10 x) b-supplied-p) ((:callers-name c) (*20 x) c-supplied-p)) (formatt"~a ~%" (list x a b b-supplied-p c c-supplied-p)))
(fun-params-key1) ;;; (1 NIL 10 NIL 20 NIL) (fun-params-key11222:b5:c6:a4) ;;; (1 4 5 T 20 NIL) need restart-condition select (fun-params-key1:b5:c6:a4) ;;; (1 4 5 T 20 NIL) (fun-params-key1:b5:callers-name6:a4) ;;; (1 4 5 T 6 T)
关键字参数不要和可选参数、剩余参数混合使用,会出现一些奇怪的行为
关键字参数和可选参数同时存在时,用关键字参数替代
返回 return-from
1 2 3 4 5 6 7
(defun fun-retun-from (n) (dotimes (i10) (dotimes (j10) (when (> (* i j) n) (return-from fun-retun-from (list i j))))))
(fun-retun-from20)
函数作为数据
1 2 3 4 5 6 7 8 9 10 11 12
(defun fun-call-apply (a b) (formatt"~a~%" (list a b))) (funcall #'fun-call-apply 201) (apply #'fun-call-apply '(1 (23)))
(defun fun-call-apply (a b &key k) (formatt"~a~%" (list a b k)))