Lisp tutorial

古弘
2023-12-01

  下面是参考了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表示可以以字符串输出。其它的表示写到其它流当中。控制字符串有以下常用的:

  1. ~d,输出整数
  2. ~[,cnt]f, 输出浮点数
  3. ~[cnt]%, 输出浮点数
  4. ~%换行
 类似资料:

相关阅读

相关文章

相关问答