如何优雅的入门LISP(一)

*其实我不会LISP,以下内容都是我瞎编的*


笑话一则:

一个间谍从NASA的主机盗取了一个用Lisp编写的核心程序,为了证明自己说的是真话,他打印出了程序的最后一页: 

))))))))))))))))))))))))))))) 
)))))))) 
)))))))))))))))))))))))))))))))))))))))) 
)))))))))))))))))))))))))))))))) 
 



一 形式(Form)

LIsp程序是由形式(Form)排列起来构成的。它通过以下规则进行求值。

1、符号(Symbol)会被解释为变量,求出该变量所绑定的值。

2、除符号以外的原子,则求出其自身的值。即:整数就是整数本身,字符串就是字符串本身。

3、如果形式为表,则头一个符号为函数名,剩余的元素为参数(这是CommonLisp等Lisp-2系列的Lisp中的行为)。


表示函数名的部分,还分为函数、特殊形式和宏三种类型。

1、函数在将参数求值后会被调用。

2、特殊形式相当于其他语言的控制结构,比如赋值 (setq n 10)。

3、Lisp中的宏,可以在对表达式求值时,通过对构成程序的表进行操作,从而改写程序本身。


二 求值

quote 操作符接受一个实参,并完封不动地返回它。

Common Lisp 定义 ' 作为 quote 的缩写。


三 输出

(format t "Hello, LISP~%")
(format t "~A plus ~A equals ~A. ~%" 1 2 3)
Hello, LISP
1 plus 2 equals 3.

(setq n 10)
(print n)

10


四 局部变量

(let ( (x 1) (y 2) ) 
    (format t "x = ~A, y = ~A. ~%" x y))
(let ( (q 3) ) 
    (format t "q = ~A. ~%" q))

x = 1, y = 2.
q = 3.


五 全局变量

(defparameter *glob* 99)
(defparameter *PI* 3.14)
(format t "glob = ~A, PI = ~A. ~%" *glob* *PI*)
glob = 99, PI = 3.14.

六 常量

(defconstant const *glob*)
(defconstant const2 123)
(format t "const = ~A, const2 = ~A. ~%" const const2)
const = 99, const2 = 123.

七 赋值

(setf *glob* 999999)
(let ((n 10)) (setf n 2) (format t "glob = ~A, n = ~A" *glob* n))

glob = 999999, n = 2


八 算数

(print (+ 2 3 4))
(let ((a 10)) 
    (setf a (* a 3))
    (print a))
9

30


九 分支

符号 t 表示真, nil 表示假,空表()也表示假。

函数listp:若参数是一个列表则返回真。

函数null:若参数是一个空表则返回真。

函数not:若参数是nil则返回真。

条件式if接受三个参数,一个test表达式、一个then表达式、一个else表达式。最后一个参数可以省略。

若test求值为 t,则对then表达式求值并返回该值,若为nil,则对else表达式求值并返回该值。

(if (> 2 3)
    (print 2)
    (print 3))
3


(print
    (if (listp '(a b c))
        (+ 1 2)
        (+ 5 6)))
3

十 循环

do是最基本的迭代操作符

do的第一个参数是一组变量的初始化列表,每个元素是如下形式(variable initial update),表示变量名、初值、每次循环要做的操作。

第二个参数是一个或多个表达式,第一个表达式用来测试循环终止,其余的表达式依次求值,最后一个表达式作为do的返回值。

接下来的参数是循环体,每次循环依次执行。

 (print
    (do ((i 0 (+ i 1))) 
        ((> i 10) 9999)
            (print i)))
0

1

2

3

4

5

6

7

8

9

10

9999


十一 函数

defun来定义函数,通常接受三个以上的参数,第一个参数是函数名;第二个参数是一个列表,里面是函数接受的参数;第三个参数是表达式列表,即函数主体。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值