这一章主要介绍了几个原语,包括car、cdr、cons、define、lambda、null?、eq?、pair?,以及1个自定义函数atom?。
car接受一个非空列表,并取其表头元素。cdr接受一个非空列表,并取其表头以外的元素。cons用于构建点对。lambda用于构建一个匿名函数,比如(lambda (n) (+ n 1))返回的是一个可以把入参+1的匿名函数。define用于赋值,比如(define inc (lambda (n) (+ n 1)))把刚才的匿名函数赋值为inc。null?用于判断入参是否为空列表。eq?用于判断两个atom是否相等。pair?用于判断入参是否是点对。atom?用于判断入参是否是原子。入参不为非空列表、也不为点对,即为原子。
隐藏的知识点:点对
“点对”指的是形如(x . y)的东西,和Java中的Pair或者二元组的概念类似。其中x和y本身可以是原子也可以是点对。比如以下都是合法的:
'(a . b)
'(a . (b . c))
'((a . b) . (c . d))
'(a . '())
点对可以从右往左化简,过程中,点号可以省略、y的位置如果是个'()也可以省略。 因此,以上可以简写成:
'(a b)
'(a (b c)) -> '(a b c)
'((a b) (c d)) -> '((a b) c d)
'(a)
所以,列表(空列表除外)可以说是点对的一种简化表示。