Common Lisp - 函数

  • 目录 {:toc}

无参数

1
2
3
4
(defun hello ()
"print hello world"
(format t "hello world~%"))
(hello)

必要参数

1
2
3
4
5
(defun fun-params-must (x y)
"x + y"
(format t "~a~%" (+ x y)))

(fun-params-must 1 2)

可选参数 ( 默认值参数 )

1
2
3
4
5
6
(defun fun-params-opt-default (x y &optional w (z (progn (format t "opt z~%") x) z-su ))
"function with opt z-su ---> z-supplied-p"
(list x y w z z-su))

(format t "~a ~%" (fun-params-opt-default 1 2 3))
(format t "~a ~%" (fun-params-opt-default 1 2 3 4))

剩余参数 ( 可变参数 )

1
2
3
4
5
6
7
(defun fun-params-rest (x
&optional y
(z (progn (format t "z use default value ~%") (+ x y)) z-supplied-p)
&rest values)
(format t "~a ~%" (list x y z z-supplied-p values)))
(fun-params-rest 1 2) ;;; (1 2 3 NIL NIL)
(fun-params-rest 1 2 3 4 5 6 7) ;;;; 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))
(format t "~a ~%" (list x a b b-supplied-p c c-supplied-p)))

(fun-params-key 1) ;;; (1 NIL 10 NIL 20 NIL)
(fun-params-key 1 12 22 :b 5 :c 6 :a 4) ;;; (1 4 5 T 20 NIL) need restart-condition select
(fun-params-key 1 :b 5 :c 6 :a 4) ;;; (1 4 5 T 20 NIL)
(fun-params-key 1 :b 5 :callers-name 6 :a 4) ;;; (1 4 5 T 6 T)

  • 关键字参数不要和可选参数、剩余参数混合使用,会出现一些奇怪的行为
  • 关键字参数和可选参数同时存在时,用关键字参数替代

返回 return-from

1
2
3
4
5
6
7
(defun fun-retun-from (n)
(dotimes (i 10)
(dotimes (j 10)
(when (> (* i j) n)
(return-from fun-retun-from (list i j))))))

(fun-retun-from 20)

函数作为数据

1
2
3
4
5
6
7
8
9
10
11
12
 (defun fun-call-apply (a  b)
(format t "~a~%" (list a b)))
(funcall #'fun-call-apply 20 1)
(apply #'fun-call-apply '(1 (2 3)))



(defun fun-call-apply (a b &key k)
(format t "~a~%" (list a b k)))

(funcall #'fun-call-apply 20 1)
(apply #'fun-call-apply '(1 (2 3) :k 1))

Common Lisp - 函数
http://blog.soul11201.com/2020/06/28/commonlisp-function/
作者
soul11201
发布于
2020年6月28日
许可协议