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,后者被称为语法糖

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lockedkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值