`

(译)Scheme简明教程3-数据类型之复合数据类型

阅读更多

 

2.1          复合数据类型

复合数据类型是以组合的方式通过组合其它数据类型数据来获得。

2.2.1     Strings

字符串类型是由字符组成的序列(不能和symbols混淆,symbols仅是由一组字符来命名的简单类型)。你可以通过将一些字符包上闭合的双引号来得到字符串。Strings是自运算类型。

"Hello, World!"

=>  "Hello, World!"

还可以通过向string 过程传递一组字符并返回由它们合并成的字符串:

(string #\h #\e #\l #\l #\o)

=>  "hello"

现在让我们定义一个全局字符串变量 greeting

(define greeting "Hello; Hello!")

注意一个字符串数据中的分号不会得到注释。

一个给定字符串数据中的字符可以分别被访问和更改。通过向string-ref过程传递一个字符串和一个从0开始的索引号,可以返回该字符串指定索引号位置的字符。

(string-ref greeting 0)

=>  #\H

可以通在一个现有的字符串上追加其它字符串的方式来获得新字符串:

(string-append "E "

               "Pluribus "

               "Unum")

=>  "<place st="on">E Pluribus</place> Unum"

你可以定义一个指定长度的字符串,然后用期望的字符来填充它。

(define a-3-char-long-string (make-string 3))

检测一个值是否是字符串类型的过程是string?

通过调用string make-string string-append获得的字符串结果都是可修改的。而过程string-set!就可以替换字符串指定索引处的字符。

(define hello (string #\H #\e #\l #\l #\o)) 

hello

=>  "Hello"

 

(string-set! hello 1 #\a)

hello

=>  "Hallo"

2.2.2     Vectors (向量)

Vectors是像strings一样的序列,但它们的元素可以是任何类型,而不仅仅是字符,当然元素也可以是Vetors类型,这是一种生成多维向量的好方式。

这使用五个整数创建了一个vector

(vector 0 1 2 3 4)

=>  #(0 1 2 3 4)

注意Scheme表现一个向量值的方式:在用一对小括号包括起来的向量元素前面加了一个 # 字符。

make-string过程类似,过程make-vectors可以构建一个指定长度的向量:

(define v (make-vector 5))

而过程vector-ref vector-set!分别可以访问和修改向量元素。检测值是否是一个向量的过程是vector?

2.2.3     Dotted pairs(点值对) lists(列表)

点值对是将两个任意数值组合成有序数偶的复合类型。点值对的第一个数值被称作car,第二值被称作cdr,而将两个值组合成点值对的过程是cons

(cons 1 #t)

=>  (1 . #t)

点值对不能自运算,因此直接以值的方式来定义它们(即不通过调用cons来创建),必须显式的使用引号:

'(1 . #t) =>  (1 . #t)

 

(1 . #t)  -->ERROR!!!

访问点值对值的过程分别是car (car访问点值对的第一个元素) cdr(cdr访问点值对的非一个元素)

(define x (cons 1 #t))

 

(car x)

=>  1

 

(cdr x)

=>  #t

点值对的元素可以通过修改器过程set-car! set-cdr!来进行修改

(set-car! x 2)

 

(set-cdr! x #f)

 

x

=>  (2 . #f)

点值对也可以包含其它的点值对。

(define y (cons (cons 1 2) 3))

 

y

=>  ((1 . 2) . 3)

这个点值对的car运算结果car运算结果是1。而car运算结果的cdr运算结果是2。即,

(car (car y))

=>  1

 

(cdr (car y))

=>  2

Scheme提供了可以简化car cdr组合起来连续访问操作的简化过程。像caar表示car 运算结果的 car运算结果 cdar表示car运算结果的cdr运算结果,等等。

(caar y)

=>  1

 

(cdar y)

=>  2

c...r这样风格的简写最多只支持四级连续操作。像cadrcdadr,和 cdaddr都是存在的。而cdadadr这样的就不对了。

当第二个元素是一个嵌套的点值对时,Scheme使用一种特殊的标记来表示表达式的结果:

(cons 1 (cons 2 (cons 3 (cons 4 5))))

=>  (1 2 3 4 . 5)

(1 2 3 4 . 5)是对(1 . (2 . (3 . (4 . 5))))的一种简化。这个表达式的最后一个cdr运算结果是5

如果嵌套点值对最后一个cdr 运算结果是一个空列表对象,Scheme提供了一种更进一步的用表达式()来表示的简化方式。空列表没有被考虑做为可以自运算的值,所以为程序提供一个空列表值时必须用单引号方式来创建:

'() =>  ()

诸如像(1 . (2 . (3 . (4 . ()))))这样形式的点值对被简化成(1 2 3 4)这样第二元素都是一个点值对特殊形式的嵌套点值对就称作列表list。这是一个四个元素长度的列表。可以像这样来创建:

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

Scheme提供了一个list过程可以更方便的创建列表。List可以将任意个数的参数变成列表返回:

(list 1 2 3 4)

=>  (1 2 3 4)

实际上,如果我们知道列表所包含的所有元素,我们还可以用quote 来定义一个列表:

'(1 2 3 4)

=>  (1 2 3 4)

列表的元素可以通过指定索引号来访问。

(define y (list 1 2 3 4))

 

(list-ref y 0) =>  1

(list-ref y 3) =>  4

 

(list-tail y 1) =>  (2 3 4)

(list-tail y 3) =>  (4)

list-tail返回了给定索引号后的所有元素。

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

(pair? '(1 . 2)) =>  #t

(pair? '(1 2))   =>  #t

(pair? '())      =>  #f

(list? '())      =>  #t

(null? '())      =>  #t

(list? '(1 2))   =>  #t

(list? '(1 . 2)) =>  #f

(null? '(1 2))   =>  #f

(null? '(1 . 2)) =>  #f

(补:在scheme中没有list-set!过程,但我们可以自己手动加一个。

(define (list-set! l k obj) 

  (cond    ((or (< k 0) (null? l)) #f)

           ((= k 0) (set-car! l obj))   

           (else  (list-set! (cdr l) (- k 1) obj))))

)

 

分享到:
评论

相关推荐

    Fluent_Scheme简明中文手册-带书签.pdf

    2. Scheme基础,这将包括Scheme的语法、数据类型、控制结构、函数定义、以及如何使用Scheme语言进行计算。 3. 用户自定义函数(UDFs)的介绍,包括UDF的结构、如何在Fluent中加载和卸载UDFs,以及如何在UDF中使用...

    fluent——scheme简明中文手册

    由于提供的文件内容片段实际上并没有提供关于标题“fluent——scheme简明中文手册”的具体内容,而是呈现了一些无序的数字和章节标题,我们无法直接基于这些片段生成详尽的知识点。但我们可以根据手册的标题,以及...

    2004 Locality-sensitive hashing scheme based on p-stable distributions.pdf

    局部敏感哈希(Locality-sensitive hashing,简称LSH)是一种在数据挖掘领域中广泛应用于高维空间近邻搜索问题的技术。2004年的这篇论文介绍了一种基于p-稳定分布的局部敏感哈希方案,该方案提出了一种新型的哈希...

    Android-scheme-libscheme-lib是一个scheme使用的库

    **Android Scheme Libs: Scheme-Lib for Android** Scheme-Lib是一个专门为Scheme编程语言设计的库,特别针对Android平台进行了优化和适配。Scheme是一种历史悠久、功能强大的Lisp方言,以其简洁的语法和强大的函数...

    CorSegRec: A Topology-Preserving Scheme for Extracting Fully-Con

    CorSegRec: A Topology-Preserving Scheme for Extracting Fully-Connected Coronary Arteries from CT Angiography CorSegRec:拓扑保持 全连通提取方案 冠状动脉CT血管造影

    A Preprocessing Scheme for High-Cardinality Categorical Attributes

    3. 数据稀疏性:高基数往往导致数据稀疏,模型难以捕捉到隐藏的模式和关联。 二、预处理方法 1. 基本编码:最简单的方法是one-hot编码,将每个类别转换为一个二进制特征。但这种方法可能导致大量冗余特征,尤其是...

    fluent_scheme语言手册

    3. **Arithmetische Funktionen, globale und lokale Scheme-Variablen**: - 算术函数部分介绍了在Scheme中进行数学计算的函数,如加、减、乘、除等。 - 全局变量和局部变量部分解释了Scheme语言中变量的作用域和...

    Mit.Press-Teach.Yourself.Scheme.pdf (英文)

    S-表达式是Scheme中的基本数据结构之一,所有Scheme程序都可以被看作是S-表达式的集合。S-表达式可以是原子(如数字、字符串)或者是列表。 #### 三、表单 **3.1 函数** - **3.1.1 函数参数** 函数可以定义固定...

    mit-scheme-fererence

    - **标题**:“mit-scheme-fererence”(应当是“MIT Scheme Reference”的误拼)指向了MIT Scheme的一个版本的手册,这是一份详尽的技术文档,用于指导用户如何有效地使用MIT Scheme这一Lisp方言进行编程。...

    PyPI 官网下载 | calysto_scheme-1.4.5-py2.py3-none-any.whl

    标题中的"PyPI 官网下载 | calysto_scheme-1.4.5-py2.py3-none-any.whl"表明这是一个从Python Package Index (PyPI)官方源下载的软件包,具体是`calysto_scheme`的1.4.5版本。PyPI是Python社区最常用的第三方库分发...

    scheme语言中文教程

    - 表(list)操作:Scheme中的表是一种基本的数据结构,教程会介绍如何创建、访问和操作表,如list、cons、car、cdr等。 - 闭包和过程:详细解释过程的定义和闭包的概念,以及如何创建和使用过程。 - 字符串操作:...

    Fluent Scheme中文手册修订.docx

    4. Fluent-Scheme-UDFs 接口 Fluent Scheme 提供了一个 UDFs(User-Defined Functions)接口,允许用户定义自己的函数。该接口包括: * 数据交换:通过使用 `udf` 函数,可以在 Fluent 和 Scheme 之间交换数据。 *...

    HA-ColorSchemeDesigner09-yfy

    《HA-ColorSchemeDesigner09-yfy:探索配色艺术与专业工具的奥秘》 在数字设计领域,色彩搭配是至关重要的一环,它能够直接影响到用户对产品的第一印象和使用体验。"HA-ColorSchemeDesigner09-yfy" 是一款专为设计...

    mit-scheme的基本使用教程

    《MIT-Scheme的基本使用教程》 MIT-Scheme是一款基于R5RS标准的Scheme实现,它以其简洁、高效和可扩展性著称。本教程将详细讲解如何使用MIT-Scheme进行编程,包括在命令行环境和Emacs编辑器下的操作。 一、MIT-...

    Scheme语言基础教程

    ### Scheme语言基础教程 #### Scheme语言概述 Scheme作为MIT基于LISP语言开发的一种变体,具有独特的地位。它不仅保留了LISP的核心理念——一种功能性的编程方式,而且通过简化和标准化,使得学习和使用更加便捷...

    learn scheme

    同时,文档中也提到了如何使用列表来构造句子等复合数据类型。 - **环境和状态**:文档还简要提到了Scheme中环境和状态的概念,这些是理解Scheme运行时行为的关键。环境指的是变量名与值之间的映射,而状态则是指...

    Python库 | scheme-2.0.2.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:scheme-2.0.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

Global site tag (gtag.js) - Google Analytics