IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    函数式编程初体验

    Reverland (lhtlyy@gmail.com)发表于 2012-05-14 00:00:00
    love 0

    跑题的前言

    光阴飞逝,这本书已经看了半个月了。我没想过会这么啃一本英文书,收获良多,疑惑也多。匆匆学习到这一章时,再回头看前面的,恍若隔世。人的忘性还是很大的,如果不使用,终归一定会忘记的。希望自己能将这个爱好坚持下去,在此祭奠遗忘的R和perl。


    什么是函数式编程

    我是从来看不进去定义的,实例更符合我认识世界的习惯,所以有人想明白什么是函数式编程,请参看维基百科.

    关于函数式编程的特性和优点,阮一峰的日志有个比较好的笔记:函数式编程初探.

    特性

    • 函数式编程对同样的参数总会给出同样的值
    • 函数式编程不会产生副作用,仅仅返回一个计算的结果
    • 还有种像菜谱式的程序被认为是脏的程序,但能直接做很多事。纯函数完全不能做任何事,所以函数式编程通常将这两种程序分开。
    • 函数式编程可以写得更快、更紧凑、更少bug。

    实例

    ;the clean, functional part
    (defun add-widget (database widget)
      (cons widget database))
    
    ;the dirty, nonfunctional part
    (defparameter *database* nil)
    
    (defun main-loop ()
      (loop (princ "Please enter the name of a new widget:")
            (setf *database* (add-widget *database* (read)))
            (format t "The database contains the following: ~a~%" *database*)))
    
    (defparameter *my-list* '(4 7 2 3))
    
    ;For demonstration purposes only. A lisper would not write code like this.
    (loop for n below (length *my-list*)
          do (setf (nth n *my-list*) (+ (nth n *my-list*) 2)))
    *my-list*
    (defun add-two (list)
      (when list
        (cons (+ 2 (car list)) (add-two (cdr list)))))
    (add-two nil)
    ;A lisper will use high-order function like this
    (mapcar (lambda (x)
              (+ x 2))
            '(4 7 2 3))


沪ICP备19023445号-2号
友情链接