cons函数实际上可以接受任何两个值,第二个参数不一定要是列表。当第二个参数不是列表的时候,打印结果会是一种特殊形式。中间用点号隔开。
因此,cons产生的值不都是list。在一般情况下,cons的结果是pair。cons?的传统表示是pair?。而first和rest的则是car和cdr。只要记住a在前d在后。
list只是一种特殊的pair。当你出错的时候,你会经常碰到非列表的点对。
打印点号的规则:当点号马上跟一个开括号,则省略点号开括号和对应的闭括号。
所以 <code>'(0 . ( 1 . 2))</code>的打印形式是<code>'(0 1 . 2)</code>,而<code>'(1 . (2 . (3 . ()))) </code>的打印形式是<code>'(1 2 3)</code>。
2.4.1用quote引用pairs和symbols
quote函数与引号等价。带引号的identifier是symbol。两者之间其实没有关系。symbol本质上就是它的字面值。它和字符串基本上一样,主要不同是打印形式。函数symbol->string,string->symbol用来互相转化。
quote一个列表会包quoet应用到列表的每一元素上面,组成一个symbol的list,内部的symbol打印时引号会被省略。
quote对字面表达式没有影响,比如数字和字符串。
2.4.2用’缩写quote
2.4.3list和Racket语法
Racket的语法不是直接定义在字符流上面。语法有两层决定。
读取层:转换字符序列到list,symbol,和其它常量
解释层:处理list,symbol,和其它常量作为表达式
读取和打印的规则统一。比如,list打印成一对括号,那么读取一对括号就会产生一个列表。一个非列表的pair打印形式中有<code>.</code>,那么一个<code>.</code>输入会产生一个点对。
two-dot转换:一对点出现在一个元素两边,并且这个元素不是列表的开头或者结尾。那么将会变成中缀表达式。