【战役总结】Common Lisp : A Gentle Introduction to Symbolic Computation

一.内容简介
     整本书一共分成了14章,介绍了Common Lisp编程的入门级内容,虽然如此,整本书所介绍的内容是非常生动有趣的,且动手的练习也很多,每章都有Keyboard Exercise——就是那种需要你动手按照说明编写代码的大练习,比较有趣的几个键盘练习有:掷骰子游戏(第五章)、一个简单知识系统的模式匹配器(第七章)、家谱数据库(第八章)、一元函数画图程序(第九章)、经典的TIC-TAC-TOE游戏(第十章)、DNA含氮碱基匹配(第十一章)、判定网络(第十二章)、解密游戏(第十三章)和用宏实现的模拟有限状态机的简单DSL(第十四章)。
     全书让我印象深刻的地方,除了大量的实践练习,就是Lisp语言带给我的编程的新感觉,贯穿全书的是各种丰富的图表,对各种概念进行了直观生动的讲解,以及Lisp语言基于REPL的交互式编程方式。第七章标题为“Applicative Programming”,其实它讲解了运用Lisp语言进行函数式编程的方式,不需要定义过多的变量,通过几个列表操作函数外加lambda表达式就能完成想要的工作,非常地便捷且具有很强的表达能力;第八章的递归讲得也非常精彩,通过一个虚构的“龙的故事”,将递归娓娓道来,深入浅出地教你如何用递归来思考问题,创造性地将递归思维分为三个步骤,以下是书中原话:
Three rules for solving problem recursively --- take every recursive problem as if it were a journey
1) Know when to stop;
2) Decide how to take one step;
3) Break the journey down into that step plus a smaller journey.
     然后,将递归分为八种基本模式:(1)双测试尾递归、(2)单测试尾递归、(3)单测试增量递归、(4)列表构造递归、(5)多变量递归、(6)条件增量递归、(7)多重递归、(8)CAR/CDR递归;最后介绍了尾递归——一种对递归调用的优化方式,不过我感觉在其他语言中,编译器不一定会对其进行优化,但对函数式编程语言来说这个是必须的。这章节内容搭配上Lisp语言大道至简的表达能力,对递归的介绍出神入化,以至于学完之后用递归思考问题变成了一种很自然的思维方式,不过在日常工作学习中还需要多练习才是,我感觉这章和最后一章对宏的基础介绍是需要经常重新复习的内容。第十一章介绍的是迭代,也就是循环,这章介绍了Lisp语言的三种迭代结构:基本的dotimes和dolist,以及实现复杂功能的do循环。
     最后要说的是第十四章,本章介绍了有关宏和编译的内容,Macro是Lisp语言区别于其他任何语言的强大功能,当然,这章对macro也只介绍了一些基础知识,但依靠一点点基础知识,已经能在键盘练习环节编写出一个简单的模拟有限状态机的领域特定语言了——尽管该语言只有两个表达式。读完本书,只是入门,要使用Lisp来编写大型的,复杂的软件还需要深入学习,不过不得不说的是,学习这本书的过程真是非常的有收获。接下来,应该好好读读《Practical Common Lisp》、《ANSI Common Lisp》和《On Lisp》等书了。

二. 读书笔记及参考
"The greatest pleasure in programmig comes from gettng a lot done with code that simply and clearly expresses your intention."

"As we saw in the mini keyboard exercises, the way to solve any nontrivial
programming problem is to divide the problem into smaller, more manageable
pieces. This is done by writing and testing several simple functions, then
combining them to produce a solution to the main problem."

1. 关于Emacs
emacs 启动slime环境
M-x slime

缓冲区切换
C-x b

C-c C-c 将当前Lisp代码读入REPL环境
C-x C-s 保存文件

2. Common Lisp语言处理器分两部分——Reader和Evaluator

Reader:字符串转化为S-表达式
Evaluator:S-表达式转化为Lisp形式

S-表达式:列表和原子
原子:
1)number
2)string literal
以上自求值
3)symbol:求值为所代表的对象,T和NIL自求值,:开头的关键字符号自求值
*var*:全局变量
+var+:常量

Lisp 形式
原子
以符号开头的列表
function call forms:按顺序求值,然后作为参数传递给第一个符号代表的函数
macro forms:以S-表达式作为参数,返回的Lisp形式替代原有宏(宏扩展)
step 1:元素以未求值的形式传给宏函数
step 2:宏的展开式按照一般求值规则进行
special forms:按特殊规则进行求值,如IF,QUOTE

相等谓词
=:numbers
CHAR=:characters
EQ:object identity,two objects are EQ if they're identical
EQL:与EQ类似,但保证相同类型的数值或字符相等

3. Lisp代码风格参考
;;;; Four semicolons are used for a file header comment;

;;; A comment with three semicolons will usually be a paragraph
;;; comment that applies to a large section of code that follows

(defun foo (x)
(dotimes (i x)
;; Two semicolons indicate this comment applies to the code
;; that follows. Note that this comment is indented the same
;; as the code that follows
(some-function-call) ; this comment applies to this line only
(another i)))

4. 函数
定义形式:
(defun  name (parameter*)
  "Optional documentation string."
  body-form*)

举例
(defun verbose-sum (x y)
  "Sum any two numbers after printing a message."
  (format t "Summing ~d and ~d. ~%“ x y)
  (+ x y))
传参形式(按顺序)
1)required

2)可选参数&optional
(defun foo (a b &optional c d) (list a b c d))
为可选参数提供默认值
(defun foo (a &optional (b 10)) (list a b))
可选参数的默认值可以通过其他参数计算得来
(defun make-rectangle (width &optional (height width)) ...)
使用多余变量判断可选参数的值是调用者传进来的还是默认提供的
(defun foo (a b &optional (c 3 c-supplied-p))
  (list a b c c-supplied-p))

3)以列表形式出现的其余参数:&rest
提供可变参数机制(以列表形式存放)
(defun + (& rest numbers) ...)

4)关键字参数:&key
(defun foo (&key a b c) (list a b c))
(foo)
(foo :a 1)
(foo :a 1 :c 3)
为关键字参数提供默认值
(defun foo (&key (a 0) (b 0 b-supplied-p) (c (+ a b)))
(list a b c b-supplied-p))
在函数内为关键字参数提供不同参数名,可用于接耦公共API描述和具体实现,不常用
(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p))
  (list a b c c-supplied-p))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值