存档

文章标签 ‘Lisp’

Common Lisp笔记-2.数字表达与算术运算

2009年12月3日 duo 没有评论

Lisp是历史第二悠久的高级语言,仅次于Fortran,可以把它看做解释性语言,因为可以在命令行下直接输入命令,然后得到结果,这个过程被称为REPL(Read-Eval-Print Loop)。比如最简单的数字表达:(再次说明下Lisp用分号;表示注释,这里我用$表示命令提示符)

$ 10  ;整数
10
$ 20/2 ;可约整数之比
10
$  #b10010  ;二进制用 #b为前缀
18
$ #o76       ;八进制以 #o为前缀
62
$ #xABCD   ;十六进制
43981
$ 2/3  ;俩整数若不能整除,则表示为分数
2/3
$ 3/2  ;即使能写成有限小数也表示为分数,意味着Lisp可以精确地表达有理数
3/2
$  #c(2 1)  ;Lisp用#c前缀来表示复数,不多说了
#C(2 1)

再看一些算术运算的例子:

$  (+ 9 8 7) ;  可以任意操作数,任意不光指很多,也可以 0个或者1个
24
$  (- 10 2 3) ; 第一个是被减数,其他都是减数
5
$ (* 2 3 4)  ;规则同加法
24
$ (/ 3 2 2)  ;除法规则同减法
3/4
$ (+ 8)    ;注意,只有一个操作数,此时加法默认另外一个操作数为加法群的单位元 0
8
$  (+)  ;所以没有操作数的时候,就是单位元
0
$  (* 8) ;乘法群单位元为1
8
$  (*) ; 应该可以猜到
1
$  (- 2)  ;默认被减数是0
-2
$  (/ 2) ;默认被除数是 1, 注意(-) 和(/)这种误操作数的减法和除法语法错误,会报错。
1/2

再看一些比较运算:
= 用来表示相等,如果参数都相等则返回T,否则返回nil
(= 1 1) ==> T
(= 10 20/2) ==> T
(= 1 1.0 #c(1.0 0.0) #c(1 0)) ==> T

不等于用/= 来表示
(/= 1 1) ==> NIL
(/= 1 2) ==> T
(/= 1 2 3) ==> T
(/= 1 2 3 1) ==> NIL
(/= 1 2 3 1.0) ==> NIL

小于大于不大于不小于分别用 <, >, <=, and >= 表示,类似这些比较也可以有多个参数,每个参数与右边的参数比。
(< 2 3) ==> T
(> 2 3) ==> NIL
(> 3 2) ==> T
(< 2 3 4) ==> T
(< 2 3 3) ==> NIL
(<= 2 3 3) ==> T
(<= 2 3 3 4) ==> T
(<= 2 3 4 3) ==> NIL

另外还有取最大最小值的max和min函数
(max 10 11) ==> 11
(min -12 -10) ==> -12
(max -1 2 -3) ==> 2

参考: Practical Common Lisp  Chapter 10

分类: Lisp 标签:

Common Lisp笔记-1.Lisp环境搭建

2009年11月13日 duo 2 条评论

很早就想学习Lisp语言,因为它的高深神秘,感觉Lisp之于其它编程语言就像TAOCP之于其它算法书一样。网上找了很多介绍文章和电子书来看,不过一上来就被什么atom,list等概念弄晕了,甚至还听说lisp程序代码本身就是数据结构,可以被操作的说法,立刻换Tab去看娱乐八卦文章去了。

不过最近读传奇程序员的八卦访谈合集《Coders at Work》, 发现这个采访者写过一本《Practical Common Lisp》,官网可以免费看,发现确实写的好,至少让我能看下去。就把读这本书的笔记整理下,记录下整个过程的困惑疑问,以及开窍的过程。

首先得有个Lisp环境,这个简单,作者Peter Seibel在官网上附上了一个地址, 本质上就是个Emacs加Slime,加一些书上要用到的代码宏库什么的集成环境。不过我没用这个,我用的是单纯的Lisp in a box。如果你用Windows系统,最简单了,先下载安装base installer,再下载安装CLISP module,然后开始菜单就能看到安好了,点击就能用了。若是Linux,如果安了emacs,需要安装lisp(我是ubuntu下apt-get install cmucl)和SLIME,如果不习惯emacs,可以找找别的lisp编程环境,我就没经验了,具体怎么下载安装配置我就不细说了。一切就绪后,在emacs里 Alt+x 输入 slime,就启动了lisp环境。

其实linux下最简单的方法是安装lisp之后,直接在terminal输入lisp,就出来一个lisp的环境,类似python的调用方法,但这样就没有一个适合lisp的editor,总所周知,lisp的语法是比较变态的,不用一个专门的editor是很痛苦的。

看见了命令行,可以输入一些简单命令体会一下,唯一需要说明的是Lisp用分号(可以不止一个)表示注释。

;;;一些简单命令
>(+ 2 3)                          ;加法,可以试下减法乘法除法
5                                    ;结果
>(+ 1 2 3)                       ;可以加很多数
6
>"hello, world"
"hello, world"
>(format t "hello, world")     ;format 类似于C的printf函数
hello, world                       ;函数本身的效应
NIL                                  ;函数的返回值,NIL表示False
>(defun hello-world () (format t "hello, world"))  ;定义函数
HELLO-WORLD                   ;每个表达式都有返回值,定义函数的话返回定义的函数名
>(hello-world)                    ;调用函数
hello, world
NIL                                  ;不解释了

总之吧,现阶段,Lisp就是很多括号,运算符在最前,每个命令都有个返回值。

分类: Lisp 标签: