知道lisp这一门语言,应该是半年前的事了,FreeBSD技术交流群的董老师,一直群里宣扬lisp, 说lisp是MIT计算系学生必修课程,并且他本人也一直在学习。有一天,他将国内lisp界的代表人物—伞哥的blog发到群里,我花了几个小时,认真将他博客文章几乎都看完,一是觉得伞哥此人是一个很有意思的人,二是lisp应该是一种比较有趣的语言。于是乎,我慢慢开始关注lisp语言了
首先,lisp这个理论,是1958年,美国的约翰.麦肯锡提出来的,最早只是以论文的形式存在,并没有形成真正的编程语言,随着计算机科学的发展,其才慢慢的成为了编程语言。现在的lisp的方言有许多种,也即是许多不同的实现方式。其中最著名的莫过于common lisp和scheme. 其它的,我也不了解.
Lisp是List processer,也就是链式处理的简称,那么在lisp中,它基本的数据结构只有两种,原子和列表(atom and list ),其它的结构,可以通过列表来达到.
原子: 数字(整形,浮点型,复数等),字符,字符串,
列表: (list 1 3 4 67 ) 或是’( 1 3 5 78 )
使用列表做为列表的成员
使用字符串作为列表的成员
使用已经绑定了值的符号作为列表的成员
使用标准宏的结果作为列表成员
宏:lisp中的宏和C语言的宏,名字虽然是相同的,但其功能与用法,与C语言有很大的区别
如dolist宏,它的作用是将列表中的元素,依次绑定到一个变量当中,最后输出一个nil
dolist的另一个作用,把解引用中的所有元素依次绑定到指定的变量
Cons的作用,对两个变量进行操作,变量可能是符号,或是列表
Cdr,取列表变量从第二个元素到最后一个元素
Car取列表(或是解引用)的第一个元素
Let 用法
(let
((var1 value)
(var2 value))
body)
在上图中
((a 10 ) (b 10)) 将a和b的变量都绑定为10, 程序主体 (print ( + a b) )
函数的返回值为print的返回值
Common lisp相关运算
Common lisp的运算符和其它的编程语言不太一样,它是将运算符放在第一位,如在我们的C语言中,运算符一般是放在两变量中间,
( + 10 20) 两数相加
( - 20 10 ) 两数相减
( * 20 10) 两数相乘
( / 20 10) 两数相除
(mod 4 3 ) 两数相除取余数
(sqrt 4) 其值为2,取一个数的开平方
………………….
在common lisp中,不是采用在其它编程语言中常见的{}大括号进行语句块整合,而是采用()小括号的方式来进行整合
同时,也有它自己的编程风格
Common lisp表达式
If then else语句
上语句的意思,当a大于b时,打印a,否则打印b
Do 宏
(i 0) 绑定i的初始值为0, ( + 1 i)
(( > = i 4) 循环中止条件
(print I ) 程序