zoukankan      html  css  js  c++  java
  • Scheme 中的 pair 和 list 简述

    pair

    (cons 1 2)
    > (1 . 2)
    

    系统返回(1 . 2)。cons 操作给两个地址分配了内存空间,并把存放指向 1 的地址放在一个空间,把存放指向2的地址放在另一个空间。存放指向1的地址的内存空间被称作 car 部分,对应的,存放指向2的地址的内存空间被称作 cdr 部分。
    car 和 cdr 分别是寄存器地址部分(Contents of the Address part of the Register)和寄存器减量部分(Contents of the Decrement part of the Register)的简称。这些名字最初来源于 Lisp 首次被实现所使用的硬件环境中内存空间的名字。这些名字同时也表明 Cons 单元的本质就是一个内存空间。
    cons 这个名字是术语构造(construction)的简称。


    (cons 1 (cons 2 (cons 3 (cons 4 5))))
    =>  (1 2 3 4 . 5)
    

    (1 2 3 4 . 5) 是对 (1 . (2 . (3 . (4 . 5)))) 的一种简化。


    > (cadr f)
    2
    > (car (cdr f))  ;等价
    2
    
    > (define f (cons 1 (cons 2 (cons 3 (cons 4 5)))))
    > f
    (1 2 3 4 . 5)
    > (car f)
    1
    > (cdr f)
    (2 3 4 . 5)
    > (cadr f)
    2
    
    > (define f (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 6))))))
    > f
    (1 2 3 4 5 . 6)
    > (cddddr f)
    (5 . 6)
    > (cdddddr f)
    . . cdddddr: undefined;
     cannot reference undefined identifier
    

    最多支持四级操作。c...r


    > (define f (cons 1 2))
    > f
    (1 . 2)
    > (set-car! f 10)
    > f
    (10 . 2)
    > (set-cdr! f 20)
    > f
    (10 . 20)
    
    > (define f (cons 1 (cons 2 3)))
    > f
    (1 2 . 3)
    > (set-cdr! f 4)
    > f
    (1 . 4)
    

    使用 set-car!set-cdr! 修改 .


    list

    2.2.1 Representing Sequences

    > '(1 2 3)
    (1 2 3)
    > (list 1 2 3)
    (1 2 3)
    > (define f (list 1 2 3))
    > f
    (1 2 3)
    > (list-ref f 0) ;通过索引取值
    1
    > (list-ref f 2)
    3
    > (list-tail f 2) ;返回给定索引及以后的所有值
    (3)
    > (list-tail f 0)
    (1 2 3)
    

    pair?list?null? 判断过程可以分别用来检查它们的参数是不是一个序对,列表或空列表。

    Scheme 中的 booleans 类型用 #t、#f 来分别表示 true 和 false 。

    > (pair? '(1 . 2))
    #t
    > (pair? '(1 2))
    #t
    > (pair? '())
    #f
    > (pair? '(1 . 2))
    #t
    > (pair? '(cons 1 2))
    #t
    > (pair? '(1 2 3))
    #t
    > (pair? (list 1 2 3))
    #t
    > (list? '(1 2 3))
    #t
    > (list? (cons 1 2))
    #f
    
    > (list? (cons 1 (cons 2 3)))
    #f
    > (list? (cons 1 (cons 2 '())))
    #t
    > (list? (cons 1 '()))
    #t
    > (null? '())
    #t
    
    > (list 1 2 3 4)
    (1 2 3 4)
    > (define f (cons 1 (cons 2 (cons 3 (cons 4 '())))))
    > f
    (1 2 3 4)
    > (list? f)
    #t
    

    连续的点对且以nil('())结尾,形似 C语言 的链表,而用list?判断得到的结果也为真。

    在 SICP 一书中 nil 用于表示序对 ( pair ) 的链结束,也可以当作一个不包含任何元素的序列,空表。

    不过作者推荐直接使用 '() 表示空表,而舍弃变量 nil 。

    > (define f (list 1 2 3 4))
    > f
    (1 2 3 4)
    > (car f)
    1
    > (cdr f)
    (2 3 4)
    > (cddr f)
    (3 4)
    > (caddr f)
    3
    

    可以向前面一样使用 carcdr


    > (define x '(1 2 3))
    > (define y '(4 5 6))
    > (define z (append x y)) ;合并两个 list 
    > z
    (1 2 3 4 5 6)
    > x
    (1 2 3)
    > y
    (4 5 6)
    
  • 相关阅读:
    Python 学习笔记:需要仔细阅读一个函数
    asp.net 实现一个简单CAS Server
    用代码旋转屏幕
    Cassandra API60 Java 代码示例
    Ajax跨域访问代理类,支持GET和POST方法
    Android 给自己的类加个事件
    Python 学习笔记: 备份工具
    Android SQLiteHelper
    转:在 CLI 中練習 Data Model
    Java修饰符public,private,protected及默认的区别
  • 原文地址:https://www.cnblogs.com/ftae/p/6798649.html
Copyright © 2011-2022 走看看