局部变量
编辑教程局部变量
在前面的章节中,我已经讲述了如何定义函数。在本节中,我讲介绍局部变量,这将会使定义函数变得更加容易。
let表达式
使用let表达式可以定义局部变量。格式如下:
(let binds body)
变量在binds定义的形式中被声明并初始化。body由任意多个S-表达式构成。binds的格式如下:
[binds] → ((p1 v1) (p2 v2) ...)
声明了变量p1、p2,并分别为它们赋初值v1、v2。变量的作用域(Scope)为body体,也就是说变量只在body中有效。
例1:声明局部变量i和j,将它们与1、2绑定,然后求二者的和。
(let ((i 1) (j 2))
(+ i j))
;Value: 3
let表达式可以嵌套使用。
例2:声明局部变量i和j,并将分别将它们与1和i+2绑定,然后求它们的乘积。
(let ((i 1))
(let ((j (+ i 2)))
(* i j)))
;Value: 3
由于变量的作用域仅在body中,下列代码会产生错误,因为在变量j的作用域中没有变量i的定义。
(let ((i 1) (j (+ i 2)))
(* i j))
;Error
let表达式可以用于引用定义在同一个绑定中的变量。实际上,let只是嵌套的let表达式的语法糖而已。
(let* ((i 1) (j (+ i 2)))
(* i j))
;Value: 3
例3:函数quadric-equation用于计算二次方程。它需要三个代表系数的参数:a、b、c (ax^2 + bx + c = 0),返回一个存放答案的实数表。通过逐步地使用let表达式,可以避免不必要的计算。
;;;The scopes of variables d,e, and f are the regions with the same background colors.
(define (quadric-equation a b c)
(if (zero? a)
'error ; 1
(let ((d (- (* b b) (* 4 a c)))) ; 2
(if (negative? d)
'() ; 3
(let ((e (/ b a -2))) ; 4
(if (zero? d)
(list e)
(let ((f (/ (sqrt d) a 2))) ; 5
(list (+ e f) (- e f)))))))))
(quadric-equation 3 5 2) ; solution of 3x^2+5x+2=0
;Value 12: (-2/3 -1)
这个函数的行为如下:
如果二次项系数a为0,函数返回'error。 | |
---|---|
如果a ≠ 0,则将变量d与判别式(b^2 - 4ac)的值绑定。 | |
如果d为负数,则返回'()。 | |
如果d不为负数,则将变量e与-b/2a绑定。 | |
如果d为0,则返回一个包含e的表。 | |
如果d是正数,则将变量f与√(d/2a)绑定,并返回由(+ e f)和(- e f)> 构成的表。 |
实际上,let表达式只是lambda表达式的一个语法糖:
(let ((p1 v1) (p2 v2) ...) exp1 exp2 ...)
;⇒
((lambda (p1 p2 ...)
exp1 exp2 ...) v1 v2)
这是因为lambda表达式用于定义函数,它为变量建立了一个作用域。
练习1
编写一个解决第四章练习1的函数,该函数旨在通过一个初始速度v和与水平面所成夹角a来计算飞行距离。
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
选择支付方式:
立即支付
¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟