下面是参考了Standford大学的CS157课的一个PPT。作为一个非常基本的LISP入门,给大家一个感性的认识。一般情况下我们可以安装CLISP,Common Lisp,这个是标准。在Windows下和Linux下都有相应的版本。
在Windows下可以直接双击相应的软件,然后打开;在Linux下可以安装完clisp后,输入clisp开启clisp的命令行。退出输入(quit),必须要加括号,因为Lisp的所有的函数调用都是以括号开始,括号结束。新人在看到一堆括号后,会觉得有点恐慌,不过一般的编辑器,只要支持Lisp,都会提供缩进和括号匹配的。
解释器的模式是REPL:read-eval-print-loop。输入一个命令,解释, 打印,然后执行。Lisp将最后一个值作为返回值。尝试如下命令:
(+ 1 2 3)
会打印6。恭喜,我们已经开始使用了第一个函数+。Lisp的函数都是放在后面函数后面,
以空格区分,注意不是逗号。
原子数据和列表。原子数据包括变量名,数值,nil(保留),T(保留)。nil表示空值,T表示含义很多。可表示真,可以表示在对象系统中的基类等。在Lisp中唯一的假值是nil。而且Lisp是大小写不敏感的。
(setq my-age 24)
上述语句setq表示赋值函数。q表示quote,即不对第二个参数求eval,直接赋值为第三个参数。
列表是用括号扩起来的一系列数据。例如(a), (+ 6 7), (a (e f g) h), (), nil。ni既是一个原子值,有是一个空的列表。对列表进行计算
(+ 6 7) ; => 13
(foo 17 18 19) ; => Error (function not defined)
(+ my-age 4) ; => 28
对列表进行计算时,首先对每个元素计算,然后在相应的函数上调用这些参数。
Lisp提供很多内置函数:+, *, - , /, max, min, sqrt。针对列表还有一些列的内置函数。
(cons 'a nil) ; => (a)
(list 'a 'b 'c) ; => (a b c)
(append '(a b c) (d e f) => (a b c d e f)
这里的单引号表示告诉Lisp,不要对这些值求eval,而是用这些值的本身。访问List的元素,有以下函数
(first (list 1 2 3)) ; => 1
(rest (list 1 2 3)) ; => ( 2 3)
(car (list 1 2 3)) ; => 1
(cdr (list 1 2 3)) ; => (2 3)
其中car和cdr是可以重复使用的。例如caar,cdar等。
分支使用if,cond,when, unless,循环使用dotimes,dolist,还有强大的loop。
(if (zerop a)
(true-branch)
(false-branch))
(dotimes (i count) (body-form))
定义函数defun关键字。
(defun hello-world (name)
(format t "~a~a" "hello world" name))
打印有两个函数,print和format。一般的print就可以满足需求。format类似与C语言的printf,可以设置标签,不过它是以~开始,不是%。
(format ouput-stream control-string variable*)
output-stream表示输出stream,t表示标准输出,nil表示可以以字符串输出。其它的表示写到其它流当中。控制字符串有以下常用的: