`

(译)Scheme简明教程5-Forms代码结构

阅读更多

第三章 Forms代码结构

读者们会发现迄今为止我们提供的Scheme示例程序也都是s-表达式。这对所有的Scheme程序来说都适用:程序是数据。

因此,字符数据#\c也是一个程序,或一个代码结构。我们将使用更通用的说法代码结构而不是程序,这样我们也可以处理程序片段。

Scheme计算代码结构#\c得到结果#\c,因为#\c可以自运算。但不是所有的s-表达式都可以自运算。比如symbol 表达式 xyz运算得到的结果是xyz这个变量所承载的值;list 表达式 (string->number "16")运算的结果是数字16(注:之前学过的list类型的数据都是类似(1 2 3 4 5)这样,所以称(string->number "16")为列表s-表达式)

也不是所有的s-表达式都是有效的程序。如果你直接输入点值对(1 . 2),你将会得到一个错误。

Scheme运行一个列表形式的代码结构时,首先要检测列表第一个元素,或列表头。如果这个列表头是一个过程,则代码结构的其余部分则被当成将传递给这个过程的参数集,而这个过程将接收这些参数并运算。

如果这个代码结构的列表头是一个特殊的代码结构,则将会采用一种特殊的方式来运行。我们已经碰到过的特殊的代码结构有begin define set!Begin可以让它的子结构可以有序的运算,而最后一个子结构的结果将成为整个代码结构的运行结果。define会声明并会初始化一个变量。set! 可以给已经存在的变量重新赋值。

3.1          Procedures(过程)

我们已经见过了许多系统过程,比如,cons string->list等。用户可以使用代码结构lambda来创建自定义的过程。例如,下面定义了一个过程可以在它的参数上加上2

(lambda (x) (+ x 2))

第一个子结构,(x)是参数列表。其余的子结构则构成了这个过程执行体。这个过程可以像系统过程一样,通过传递一个参数完成调用:

((lambda (x) (+ x 2)) 5)

=>  7

如果我们希望能够多次调用这个相同的过程,我们可以每次使用lambda重新创建一个复制品,但我们有更好的方式。我们可以使用一个变量来承载这个过程:

(define add2

  (lambda (x) (+ x 2)))

只要需要,我们就可以反复使用add2为参数加上2

(add2 4) =>  6

(add2 9) =>  11

(译者注:定义过程还可以有另一种简单的方式,直接用define而不使用lambda来创建:

(define (add2 x)

       (+ x 2))

)

3.1.1     过程的参数

lambda 过程的参数由它的第一个子结构(紧跟着lambda标记的那个结构)来定义。add2是一个单参数或一元过程,所以它的参数列表是只有一个元素的列表(x)。标记x作为一个承载过程参数的变量而存在。在过程体中出现的所有x都是指代这个过程的参数。对这个过程体来说x是一个局部变量。

我们可以为两个参数的过程提供两个元素的列表做参数,通常都是为n个参数的过程提供n个元素的列表。下面是一个可以计算矩形面积的双参数过程。它的两个参数分别是矩形的长和宽。

(define area

  (lambda (length breadth)

    (* length breadth)))

我们看到area将它的参数进行相乘,系统过程*也可以实现相乘。我们可以简单的这样做:

(define area *)

 

3.1.2     可变数量的参数(不定长参数)

有一些过程可以在不同的时候传给它不同个数的参数来完成调用。为了实现这样的过程,lambda表达式列表形式的参数要被替换成单个的符号。这个符号会像一个变量一样来承载过程调用时接收到的参数列表。

通常,lambda的参数列表可以是一个列表构结(x ),一个符号,或者(x . z)这样的一个点值对结构。当参数是一个点值对结构时,在点之前的所有变量将一一对应过程调用时的前几个参数,点之后的那个变量会将剩余的参数值作为一个列表来承载。

(译者注:以下是几种可变参数的写法:

((lambda (x y z)

         (begin

            (display x)

            (newline)

            (display y)

            (newline)

            (display z)

            (newline) ) )

            1 2 3)

(define (t x y z)

             (begin

                (display x)

                (newline)

                (display y)

                (newline)

                (display z)

                (newline) ) )

(t 1 2 3)等价;

((lambda x

         (begin

            (display x) ) )

            1 2 3 4)

(define (t . x)

        (begin

           (display x) ) )

(t 1 2 3 4)等价;

((lambda (x . y)

         (begin

            (display x)

            (newline)

            (display y)

            (newline) ) )

            1 2 3 4 5)

(define (t x . y)

        (begin

           (display x)

           (newline)

           (display y)

           (newline) ) )

(t 1 2 3 4 5)等价。

3.2          Apply过程

apply过程允许我们直接传递一个装有参数的list 给一个过程来完成对这个过程的批量操作。

(define x '(1 2 3))

 

(apply + x)

=>  6

通常,apply需要传递一个过程给它,后面紧接着是不定长参数,但最后一个参数值一定要是list。它会根据最后一个参数和中间其它的参数来构建参数列表。然后返回根据这个参数列表来调用过程得到的结果。例如,

(apply + 1 2 3 x)

=>  12

3.3          有序执行

我们使用begin这个特殊的结构来对一组需要有序执行的子结构来进行打包。许多Scheme的代码结构都隐含了begins。例如,我们定义一个三个参数的过程来输出它们,并用空格间格。一种正确的定义是:

(define display3

  (lambda (arg1 arg2 arg3)

    (begin

      (display arg1)

      (display " ")

      (display arg2)

      (display " ")

      (display arg3)

      (newline))))

Scheme中,lambda的语句体都是隐式的begin代码结构。因此,display3语句体中的begin不是必须的,不写时也不会有什么影响。display3更简化的写法是:

(define display3

  (lambda (arg1 arg2 arg3)

    (display arg1)

    (display " ")

    (display arg2)

    (display " ")

    (display arg3)

    (newline)))

分享到:
评论

相关推荐

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

    5. Fluent-Scheme-UDFs的高级特性,例如如何使用RP_Get和RP_Set函数在运行时获取和设置变量的值。 6. Fluent-Scheme的内置函数库,可能包括用于数学计算的函数、字符串处理函数等。 7. 与Fluent图形用户界面(GUI)...

    scheme简明教程

    这是一本在国外比较有名的Scheme编程语言的入门教材。本教材适合任何对Scheme编程语言感兴趣的人阅读,尤其是有其他编程语言(特别是动态语言)编程经验,希望快速了解Scheme的不同点并且快速上手写点东西的人。

    fluent——scheme简明中文手册

    5. Fluent-Scheme的编程结构 - Fluent-Scheme语言支持条件判断、循环和函数定义。 - 例如,if条件判断语句、do循环语句、格式化输出Format等。 - 用户可利用内置函数和过程进行复杂的仿真模型设置。 6. Fluent-...

    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血管造影

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

    2. **API调用**: 使用Java或Kotlin代码调用Scheme-Lib提供的API,启动Scheme解释器并执行相关脚本。 3. **脚本编写**: 编写Scheme代码,实现需要的功能或逻辑。 4. **交互机制**: 设计Java和Scheme之间的数据交换...

    mit-scheme源代码

    2. 源代码解压:将压缩包`mit-scheme-c-20090107`解压到适当目录,通常在终端中使用`tar -zxvf mit-scheme-c-20090107.tar.gz`命令完成解压。 3. 配置与编译:进入解压后的目录,使用`./configure`进行配置,检查...

    A Preprocessing Scheme for High-Cardinality Categorical Attributes

    "A Preprocessing Scheme for High-Cardinality Categorical Attributes"这个主题探讨的就是如何有效地处理这类问题。 一、高基数类别变量的挑战 1. 维度灾难:高基数会导致数据的维度增加,这可能会引起过拟合,...

    fluent_scheme语言手册

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

    mit-scheme-fererence

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

    mit-scheme的基本使用教程

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

    HA-ColorSchemeDesigner09-yfy

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

    iOS——Scheme是什么、怎么自定义Scheme、JLRoutes的使用-代码

    iOS——Scheme是什么、怎么自定义Scheme、JLRoutes博文的使用中的源代码 博文地址:http://blog.csdn.net/u010127917/article/details/50451251

    Python库 | scheme-2.0.2.tar.gz

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

    scheme语言中文教程

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

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

    《Teach Yourself Scheme in Fixnum Days》是一本详尽的教程,旨在帮助读者在有限的时间内掌握Scheme语言的基础及进阶知识。此书由Dorai Sitaram撰写,并且在网络上部分中文翻译已经存在(参考链接:...

    In-pixel charge addition scheme applied in time-delay integration CMOS image sensors

    An addition scheme applicable to time-delay integration (TDI) CMOS image sensor is proposed, which adds signals in the charge domain in the pixel array. A two-shared pixel structure adopting two-...

    Scheme语言基础教程

    ### Scheme语言基础教程 #### Scheme语言概述 Scheme作为MIT基于LISP语言开发的一种变体,具有独特的地位。它不仅保留了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_自学教程.pdf

    ### Scheme自学教程知识点详解 #### 一、Scheme简介与学习目的 **知识点1:Scheme语言定位** Scheme是一种功能强大的Lisp方言,具有简洁且高度可扩展的语法结构,非常适合计算机科学的学习与研究。它强调函数式...

Global site tag (gtag.js) - Google Analytics