CONS 操作符

我们刚刚学习了如何拆分一个表,现在学习如何合并一个表。 CONS 操作符就是做这件事情的。

假设有一个列表 (1 2 3) ,我们做一下 CAR 操作:

(car '(1 2 3))

返回 1 。

我们再做一下 CDR 操作:

(cdr '(1 2 3))

返回 (2 3) 。

CONS 操作符的作用就是将拆开的表连起来。

(cons 1 '(2 3))

返回的将是原来的列表 (1 2 3) 。

S 表达式

cons 操作符的第二个参数要是一个列表,才能返回一个列表。否则:

(cons 2 3)

返回

(2 . 3)

这次中间有一个点。为什么呢?

因为,表实际上是一个树(二叉树)。我们上面所用到的带括号的式子被称为 S表达式。而在S表达式中, 二叉树在表示为 (Left . Right) 。

如果左支是一个表,则就会成为如下形式。

((List) . Right)

如果右支是一个表,当然也可以表示为 (Left . (List)) ,但是此时我们一般把点省略掉,写成

(Left List)

你现在可能有些晕,用一段表达式表示就很清晰了,如下

'(3 . (2 3))

(3 2 3)

CONS操作符的作用是将两棵树连接成一棵树。

那么现在你能回答为什么CDR操作符会取出除第一个外的所有元素了吗,因为它的实质是取二叉树的右支。

总之CONS操作符的作用是连接一个元素与一个表(顺序不可颠倒)。

(cons 2 '(2 3))

(2 2 3)

如果要连接三个或以上的元素,要这样

(cons 1 (cons 2 '(3)))

(1 2 3)

真正有点实质性的是这个式子

(cons 1 (cons 2 (cons 3 nil))) ;;; (1 2 3)

(cons 3 nil) ;;; (3)

如果二叉树的右支是NIL,那么连NIL都省略掉。如

'(3 . Nil) ;;; (3)

一件有趣的事情是这样

(cdr '(3)) ;;; NIL

append 函数

append函数的作用是连接两个表。

>(append '(3 3) '(4 4))

(3 3 4 4)

形象点说,它会把最外一层括号去掉,然后连接。比如

>(append '((3)) '(4 4))

((3) 4 4)

LIST 函数

LIST 函数的意义是将所有的参数放入一个表中并返回之。

>(list 1 1 1 1)

(1 1 1 1)

>(list '(2 3) '(2) 1 2)

((2 3) (2) 1 2)

转自:http://zh.wikibooks.org/wiki/Lisp_%E5%85%A5%E9%96%80/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E6%A7%8B%E9%80%A0%E8%A1%A8

关于dot notation的详细说明:

http://c2.com/cgi/wiki?DottedPairNotation

lisp构造表的更多相关文章

  1. CSS构造表单

    结构化表单布局 <head> <meta http-equiv="Content-Type" content="text/html; charset=G ...

  2. 《how to design programs》13章用list构造表

    使用cons构造一个包含多个元素的表十分麻烦,因此scheme提供了list操作,该操作接受任意量的值作为输入以创建一个表,下面是扩展的语法: <prm>=list 扩展的scheme值的 ...

  3. 26 , CSS 构造表单

    1. 表单标签使用 2. 下拉菜单背景 3. 滚动条的使用 4. 结构化表单布局 1 1 1 1. . . . 表单标签的使用 <label for=”name”>姓名: <inpu ...

  4. 【Visual Lisp】表处理专题

    表处理大全;;★★★01.创建表★★★(setq lst '());;创建一个空表(list 1 2 3 4) '(1 2 3 4) ;;构造表的两种形式(vl-list* 1 "TT&qu ...

  5. RavenScheme简介

    RavenScheme简介 RavenScheme使用了一个运行『读入-求值-打印』循环的解释器.该解释器从标准输入反复的读入表达式,对得到的表达式求值,然后打印出结果. 如果用户键入: [加 1 2 ...

  6. Scheme语言--简单介绍

    一年前事实上有时间看完SICP这本书,后来由于种种原因,一直没有继续再学.由于SICP中使用Scheme确实应用不多.在Java,C++的语言眼里,Scheme确实非常另类.现在MIT已经放弃了使用S ...

  7. Scheme语言实例入门--怎样写一个“新型冠状病毒感染风险检测程序”

    小学生都能用的编程语言 2020的春季中小学受疫情影响,一直还没有开学,孩子宅在家说想做一个学校要求的研究项目,我就说你做一个怎么样通过编程来学习数学的小项目吧,用最简单的计算机语言来解决小学数学问题 ...

  8. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  9. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

随机推荐

  1. Android 有缓存功能的请求封装接口

    /* * @Company 浙 江 鸿 程 计 算 机 系 统 有 限 公 司 * @URL http://www.zjhcsoft.com * @Address 杭州滨江区伟业路1号 * @Emai ...

  2. .net 分页案例效果

     ;             )             {                 pageUrl += ) +  && (totalPageCount > step  ...

  3. ios 读取通讯录数据

    #import <Foundation/Foundation.h> @interface LoadingContactData : NSObject // 读取通讯录 + (Loading ...

  4. 【桌面虚拟化】之三 Persistent vs NonP

    作者:范军 (Frank Fan) 新浪微博:@frankfan7 在[桌面虚拟化]之二类型及案例中我们探讨了桌面虚拟化的两种架构,HostedVirtual Desktop (VDI) 和 Publ ...

  5. 基于MapReduce的SimRank++算法研究与实现

    一.算法应用背景 计算广告学(Computational Advertising)是一门广告营销科学,以追求广告投放的收益最大化为目标,重点解决用户与广告匹配的相关性和广告的竞价模型问题,涉及到自然语 ...

  6. [Javascript]3. Improve you speed! Performance Tips

    /** Let inheritance help with memory efficiency */ function SignalFire(ID, startingLogs){ this.fireI ...

  7. 连数据库是ODBC好还是OLEDB好

    1.连数据库是ODBC好还是OLEDB好?2.是不是只有微软的数据库才可以用OLEDB?3.要切换这两种连接,是不是只需要修改连接字符串?谢谢大家了,小弟对这三个问题不解 分享到:   2009-03 ...

  8. NET基础课--泛型(NET之美)

    1.泛型,类型或方法的一种抽象概括. 2.泛型类:在类型名后面加一个<>,其中传递占位符,也就是类型参数.where是类型约束 可以再查资料 public class SortHelper ...

  9. .net DataTable 正确排序姿势

    关于dataTable中根据列排序正确姿势做个随笔,方便查阅 System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Ad ...

  10. 代码先行-log4Net初体验

    1.安装 从http://logging.apache.org/log4net/download_log4net.cgi下载编译好的log4Net包并解压. 找到 bin\net\4.0\releas ...