Lisp函数
(defun
verbose-sum (x y)
"Sum any two numbers after..." ;描述函数用途,可以通过DOCUMENTATION函数获取
(format t "Summing ~d and ~d.~%" x y)
(+ x y)) ;函数返回值,也可以通过return-from在任意位置返回
形参列表
必选参数
可选参数
(defun foo (a b &optional c (d 10)) (list a b c d)) 默认情况下c为nil、d为10
(defun make-rectangle (width &optional (height width)) ... ) 没有明确指定height情况下width和height相等
(defun foo (a b &optional (c 3 c-supplied-p))) 如果没指定c值情况下c-supplied-p为NIL 指定后为T
剩余参数
(defun format (stream string &rest values) ... )
(defun + (&rest values) .. )
关键字形参
(defun foo (&key a b c) (list a b c)) (foo :c 1) ----> (nil nil 1)
(defun foo (&key (a 0) (b 0 b-supplied-p)) (c (+ a b))) (list a b c b-supplied-p))
(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p)) (list a b c c-supplied-p)) (foo :apple 10 :box 20 :charlie 3)
混合不同类型
(defun foo (&rest rest &key a b c) (list rest a b c)) (foo :a 1 :b 2 :c 3) --->((:A 1 :B 2 :C 3) 1 2 3)
函数返回值
(defun foo (n)
(dotimes (i 10)
(dotimes (j 10)
(when (> (* i j) n)
(return-from foo (list i j))))))
高阶函数—将函数作为一种类型的对象
(function foo)和#'foo都会得到foo函数对象
(funcall #'foo 1 2 3) 等价于 (foo 1 2 3)
(defun plot (fn min max step) 调用方式:(plot #'exp 0 4 1/2)
(loop for i from min to max by step do
(loop repeat (funcall fn i) do (format t "*"))
(format t "~%")))
(apply #'plot plot-data) 假设plot-data是包含fn min max step的列表
(apply #'plot #'exp plot-data) 假设plot-data是包含min max step的列表
匿名函数
(lambda (parameters) body)
(funcall #'(lambda (x y) (+ x y)) 2 3) ---> 5
((lambda (x y) (+ x y)) 2 3) ----> 5
(plot #'(lambda (x) (* 2 x)) 0 10 1)
"Sum any two numbers after..." ;描述函数用途,可以通过DOCUMENTATION函数获取
(format t "Summing ~d and ~d.~%" x y)
(+ x y)) ;函数返回值,也可以通过return-from在任意位置返回
形参列表
必选参数
可选参数
(defun foo (a b &optional c (d 10)) (list a b c d)) 默认情况下c为nil、d为10
(defun make-rectangle (width &optional (height width)) ... ) 没有明确指定height情况下width和height相等
(defun foo (a b &optional (c 3 c-supplied-p))) 如果没指定c值情况下c-supplied-p为NIL 指定后为T
剩余参数
(defun format (stream string &rest values) ... )
(defun + (&rest values) .. )
关键字形参
(defun foo (&key a b c) (list a b c)) (foo :c 1) ----> (nil nil 1)
(defun foo (&key (a 0) (b 0 b-supplied-p)) (c (+ a b))) (list a b c b-supplied-p))
(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p)) (list a b c c-supplied-p)) (foo :apple 10 :box 20 :charlie 3)
混合不同类型
(defun foo (&rest rest &key a b c) (list rest a b c)) (foo :a 1 :b 2 :c 3) --->((:A 1 :B 2 :C 3) 1 2 3)
函数返回值
(defun foo (n)
(dotimes (i 10)
(dotimes (j 10)
(when (> (* i j) n)
(return-from foo (list i j))))))
高阶函数—将函数作为一种类型的对象
(function foo)和#'foo都会得到foo函数对象
(funcall #'foo 1 2 3) 等价于 (foo 1 2 3)
(defun plot (fn min max step) 调用方式:(plot #'exp 0 4 1/2)
(loop for i from min to max by step do
(loop repeat (funcall fn i) do (format t "*"))
(format t "~%")))
(apply #'plot plot-data) 假设plot-data是包含fn min max step的列表
(apply #'plot #'exp plot-data) 假设plot-data是包含min max step的列表
匿名函数
(lambda (parameters) body)
(funcall #'(lambda (x y) (+ x y)) 2 3) ---> 5
((lambda (x y) (+ x y)) 2 3) ----> 5
(plot #'(lambda (x) (* 2 x)) 0 10 1)

浙公网安备 33010602011771号