UP | HOME

定义函数

Table of Contents

在本章中,会讲解如何 自定义函数 。由于Sheme是函数式编程语言,需要通过编写小型函数来构造程序。因此,明白如何构造并组合这些函数对掌握Scheme尤为关键

在前端定义函数非常不便,因此通常需要在文本编辑器中编辑好代码,并在解释器中加载它们

定义简单函数

可以使用 define 来将一个 符号 与一个 绑定 。可以通过这个操作符定义例如 字符函数任何类型的全局参数

使用任意一款编辑器来编辑下面的代码,并将它们存储为 hello.scm ,放置在类似于C:\doc\scheme\的文件夹下:

; Hello world as a variable
(define vhello "Hello world")    

; Hello world as a function
(define fhello (lambda ()         
         "Hello world"))

接下来,向 Scheme解释器 输入下面的命令:

(cd "C:\\doc\\scheme")
;Value 14: #[pathname 14 "c:\\doc\\scheme\\"]

(load "hello.scm")
;Loading "hello.scm" -- done
;Value: fhello

通过这些命令, hello.scm 就被 加载到解释器

    如果你的当前目录被设定在了脚本所在目录,那么你就不需要再输入第一行的命令了

然后,向解释器输入下面的命令:

vhello ; "Hello world"

fhello ; #<procedure:fhello>

(fhello) ; "Hello world"
    第1行中,我们声明了一个全局参数vhello,并将其与"Hello,World"绑定起来。

    第2行声明了一个返回“Hello World”的过程
  • 特殊形式 define 用于 声明变量
    • define 接受两个参数:define运算符会使用第一个参数作为全局参数,并将其与第二个参数绑定起来
  • 特殊形式 lambda 用于 定义过程
    • lambda 需要至少一个的参数:第一个参数是由 定义的过程所需的参数组成的表 。因为本例 fhello 没有参数,所以参数表是空表
在解释器中输入vhello,解释器返回“Hello,World”

如果你在解释器中输入fhello,它也会返回像下面这样的值:#<procedure:fhello>,这说明了Scheme解释器把过程和常规数据类型用同样的方式对待
Scheme解释器通过内存空间中的数据地址操作所有的数据,因此,所有存在于内存空间中的对象都以同样的方式处理。

如果把fhello当过程对待,你应该用括号括住这些符号,比如(fhello):
然后解释器会按照以前讲述的规则那样对它求值,并返回“Hello World”

定义有参数的函数

可以通过在 lambda放一个参数表 来定义有参数的函数

;; hello with name
(define hello
  (lambda (name)
    (string-append "Hello " name "!")))

;; sum of three numbers
(define sum3
  (lambda (a b c)
    (+ a b c)))

(hello "Lucy") ; "Hello Lucy!"

(sum3 10 20 30) ; 60
  • 函数 hello :有一个参数 name ,并会把 "Hello" 、name的值、和 '!'连结在一起并返回
  • 函数 sum3 :此函数有三个参数并返回这三个参数的和
    预定义函数string-append可以接受任意多个数的参数,并返回将这些参数连结在一起后的字符串

简化函数定义

lambda 定义函数是一种规范的方法,但也可以使用下面代码展示的短形式:

;; hello with name
(define (hello name)
  (string-append "Hello " name "!"))


;; sum of three numbers
(define (sum3 a b c)
  (+ a b c))

在这种形式中,函数按照它们 被调用的形式 被定义

Next:分支

Previous:序对和列表

Home:目录