zoukankan      html  css  js  c++  java
  • lisp构造表

    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

  • 相关阅读:
    2007年8月小记
    2007年7月小记
    CS2007.1 在多应用程序中的单点登录
    C#类型转换2
    checkbox与说明文字无法对齐的问题
    css中的内容溢出
    javascript获取的层(div)高度
    C#类型转换3
    js修改css样式表解析(转)
    (转)javascript选择id class
  • 原文地址:https://www.cnblogs.com/youxin/p/3420108.html
Copyright © 2011-2022 走看看