1.1.4 组合性的程序

1.1.4 组合性的程序
我们已经了解到了一些LISP语言的在其它的知名的编程语言
中必有的元素。

   数字和算术操作是原生的数据和程序。

   组合的嵌套性提供了组合操作的一种方法。

   把名称与值关联起来的定义提供了一种有限的抽象的方法。

现在我们学习程序定义,这是一种更有表达力的抽象技术,就是给一个复合的
操作命名,再作为一个单位来引用。
我们开始研究一下,如何表达平方的概念。 我们可以说
“对数的平方,就是它自身乘以自身” 这在我们的语言中是如下表达的:
(define (square x) (* x x)
我们能以如下的方式来理解
(define (square x)           (* x x)
               ^                 ^
  对于数的平方,就是它自身乘以自身
我们这有一个复合的程序,它被赋予square 这个名称。
程序表达了自身相乘的操作。乘数的名称为X,它与自然语言中的角色是一样的。
执行定义,就创建了这个复合的程序,并把它与名称square相关联起来。
一个程序定义的通用形如下:
(define (<name> <formal parameters>) <body>)

<name>是在环境变量中的关联到一个程序定义的符号。
<formal parameters> 是形式参数,即程序体中的用来引用程序的相应的实际参数的
变量名称。 <body> 是在程序被应用时形式参数被替换成实际的参数的情况下,
一个能产生程序应用 的返回值的表达式。<name> 和<formal parameters>
被放在了括号中。正如实际调用时一样。
有了square的定义,我们能现在使用它
(square 21)
441

(square (+ 2 5))
49

(square (square 3))
81
在定义其它的程序时,我们也能使用square 作为程序的一部分。例如
x*x+y*y 能被表达为
(+ (square x) (square y))
我们能很容易地定义一个程序 sum-of-squares ,接受两个数据作为参数,
计算平方和。
(define (sum-of-squares x y)
       (+ (square x) (square y))
)

(sum-of-squares 3 4)
25

在定义更进一步的程序时,我们现在能够使用sum-of-squares 作为程序的一部分。
(define (f a)
       (sum-of-squares (+ a 1) (* a 2))
)

(f 5)
136

使用复合程序的方式与使用原生程序的方式完全一样。实际上,
通过查看sum-of-squares的定义我们并不知道 square 这个程序
是像 +和*这样的原生程序被嵌入解释器中,还是被定义成一个复合程序。

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/81384626
今日推荐