on-lisp要点(一)
来源:互联网 发布:手机视频监控软件 编辑:程序博客网 时间:2024/06/05 08:20
chapter-2
1.symbol-value & symbol-function
lisp中可以通过symbol-value, symbol-function从对应的symbol获取变量值和函数值。
(defun double (x) (* x 2))(defvar double 0)(setq double 2)(symbol-value 'double)(symbol-function 'double)
2、将函数,谓词作为参数
与其把功能写死,不如传进去一个函数参数。
mapcar remove-if sort
3.闭包
(defun make-adder (n) #(lambda (x) (+ x n))
4.局部函数
(defun count-instances (obj lsts) (labels ((instances-in (lst) (if (consp lst) (+ (if (eq (car lst) obj) 1 0) (instances-in (cdr lst))) 0))) (mapcar #'instances-in lsts)))
5.eql&equal
eql比较两个对象是否是同一个对象,equal表示两个对象的内容是否相同。
chapter-3
1、副作用&函数式编程
函数式编程意味着利用返回值而不是副作用来写程序。副作用包括破坏性修改对象(例如通过replaca)以
及变量赋值(例如通过setq)。如果副作用很少并且局部化,程序就会容易阅读,测试和调试。(感觉就是吐槽命令式编程C&C++)
2、返回多值(values,multiple-value-bind)
(defun powers (x) (values x (sqrt x) (expt x 2)
3.简码之美(lisp宏)
如果说简洁是智慧的灵魂,那么它和效率也同是优秀软件的本质特征。编写和维护一个程序的开销与其长
度成正比。同等条件下,程序越短越好.
chapter-5
1记住过去.
通用的将函数设计为记忆的代码:
(defun memoize (fn) (let ((cache (make-hash-table :test #'equal))) #'(lambda (&rest args) (multiple-value-bind (val win) (gethash args cache) (if win val (setf (gethash args cache) (apply fn args)))))))
2 复合函数
(defun compose (&rest fns) (if fns (let ((fn1 (car (last fns))) (fns (butlast fns)))#'(lambda (&rest args) (reduce #'funcall fns :from-end t :initial-value (apply fn1 args)))) #'identity))
3、条件,逻辑变形
if else的变形,and,or的变形实现
(defun fif (if then &optional else) #'(lambda (x) (if (funcall if x) (funcall then x) (if else (funcall else x)))))(defun fint (fn &rest fns) (if (null fns) fn (let ((chain (apply #'fint fns)))#'(lambda (x) (and (funcall fn x) (funcall chain x))))))(defun fun (fn &rest fns) (if (null fns) fn (let ((chain (apply #'fun fns)))#'(lambda (x) (or (funcall fn x) (funcall chain x))))))
4.在cdr上递归
(defun lrec (rec &optional base) (labels ((self (lst) (if (null lst) (if (functionp base) (funcall base) base) (funcall rec (car lst) #'(lambda () (self (cdr lst))))))) #'self)); copy-list(lrec #'(lambda (x f) (cons x (funcall f)))); remove-duplicates(lrec #'(lambda (x f) (adjoin x (funcall f)))); find-if,(defun find-if-1 (pred) (lrec #'(lambda (x f) (if (funcall pred x) x (funcall f)))));for some function fn(defun some-1 (pred) (lrec #'(lambda (x f) (or (funcall pred x) (funcall f)))))
5. 在子树上递归
(defun ttrav (rec &optional (base #'identity)) (labels ((self (tree) (if (atom tree) (if (functionp base) (funcall base tree) base) (funcall rec (self (car tree)) (if (cdr tree) (self (cdr tree))))))) #'self)); our-copy-tree(ttrav #'cons); count-leaves(ttrav #'(lambda (l r) (+ l (or r 1))) 1); flatten(ttrav #'nconc #'mklist)(defun trec (rec &optional (base #'identiy)) (labels ((self (tree) (if (atom tree) (if (functionp base) (funcall base tree) base) (funcall rec tree #'(lambda () (self (car tree))) #'(lambda () (if (cdr tree) (self (cdr tree)))))))) #'self))(trec #'(lambda (o l r) (or (funcall l) (funcall r))) #'(lambda (tree) (and (oddp tree) tree)))
- on-lisp要点(一)
- on-lisp要点-----宏(二)
- lisp 函数(一)
- lisp学习总结(一)
- Lisp学习笔记(一)
- LISP 学习笔记 (一)-初识LISP,表达式写法
- COMMON LISP语言学习笔记(一)
- Practical Common Lisp学习笔记(一)
- 如何优雅的入门LISP(一)
- lisp基本语法——(一)
- C要点(一)
- hadoop要点(一)
- lisp(一)环境搭建
- ARM汇编语言要点(一)
- Struts2 要点笔记(一)
- UML要点总结(一)
- JavaScript学习要点(一)
- HTTP学习要点(一)
- 多线程和多进程的区别(小结)
- Java基础加强---泛型
- Java基础加强---ClassLoader(类加载器)
- [Java]Java内存查看与分析
- Java基础加强---动态代理
- on-lisp要点(一)
- Drupal7_11:主题Pixture Reloaded的安装
- 【SVN】MyEclipse8.5S安装SVN详解
- 11.22日记
- 交通灯管理系统
- 视频直播网页——WebCam V3.5的制作
- ubuntu下查看恶意登录的shell命令
- 银行业务调度系统
- Java异常机制