Common lisp学习笔记(3):特殊形式与宏初探

《Successful Lisp》Chapter 3 - Essential Lisp in Twelve Lessons
Lesson 3 - Some Examples of Special Forms and Macros 读书笔记.

特殊形式

setq:设置符号的值

(setq 称号 "隔壁老王")
-> 隔壁老王
称号
-> 隔壁老王
(setq 某变量 57)
-> 57
某变量
-> 57

setq 的第一个参数是符号,而这个符号并不会被求值,第二个参数会被求值作为setq的返回值,并且这个值会被绑定到第一个符号参数,
setq 可以同时对任意个符号赋值,并返回最右侧参数的值.

(setq 年 2018 月 5 日 5)
-> 5
年
-> 2018
月
-> 5
日
-> 5

LET

let形式会创建词法变量

(let ((a 3)
      (b 4)
      (c 5))
    (* (+ b c) a))
-> 27
a
-> The variable A is unbound.

上面的代码中,创建了词法变量a,b,c,并通过一个算术表达式调用了这些变量,而let形式则返回了这个算术表达式的值.
可以用以下方式描述:

(let (bindings) forms)

bindings是任意多个符号-值列表,而forms则是任意个会被求值的形式,而let形式则返回最后一个形式的值.

let形式中对符号的变量绑定会覆盖形式外部同名符号的变量绑定:

(setq a 89)
-> 89
(let ((a 3))
    (+ a 2))
-> 5
a
-> 89

let形式中对符号的变量绑定是并行(同时进行)的:

(setq w 77)
-> 77
(let ((w 8)
      (x w))
    (+ w x))
-> 85 
w
-> 77

是不是以为要返回16了?
let的兄弟let*的串行(依次进行)绑定可以满足你的期望:

(setq u 37)
-> 37
(let* ((v 8)
       (u v))
    (+ u v))
->16

COND:条件求值

(let ((a (random 100)))
    (cond ((< a 50) "小数")
          ((>= a 50) "大数")
          (t "蛤?")))

cond形式中可以有任意个判别形式,比如上例中的(< a 50),(>= a 50)以及t,而判别形式后则是判别形式返回t后会求值的体(body)形式,注意到判别形式会按顺序求值,当某个判别形式返回t后,cond会直接返回该判别形式后最后一个体形式的值,而不去求值其余的判别形式.在cond的最后通常给出一个判别形式t,以便出现意外情况后程序依旧稳定.

QUOTE

这个操作符可以阻止符号被求值一次,好比穿了一层免疫”求值”一次的外衣

(setq b 8)
-> 8
(setq a b)
-> 8
a
-> 8  ;注意到这里a被绑定了符号b求值后的值
(setq a (quote b))
-> b
a
-> b  ;而这里绑定了符号b本身

(quote b)等价于’b,后者被称为语法糖

猜你喜欢

转载自blog.csdn.net/skydoot/article/details/80207974