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)
posted @ 2016-11-10 11:34  fyk1Ex  阅读(584)  评论(0)    收藏  举报