第五章 词法变量
Scheme的变量有一定的词法作用域,即,它们在程序代码中只对特定范围的代码结构可见。迄今为止我们所见过的全局变量也没有例外的:它们的作用域是整个程序,这也是一种特定的作用范围。
我们也碰见过一些示例包含局部变量。它们都是lambda过程的参数,当过程被调用时这些变量会被赋值,而它们的作用域仅限于在过程的内部。例如:
(define x 9)
(define add2 (lambda (x) (+ x 2)))
x => 9
(add2 3) => 5
(add2 x) => 11
x => 9
这里有一个全局变量x,还有一个局部变量x,就是在过程add2中那个字母x。全局变量x的值一直是9。第一次调用add2过程时,局部的x会被赋值为3,而第二次调用add2时,局部变量x的会被赋值为全局变量x的值,即,9。当过程的调用结束时,全部变量x仍然是9。
而set!代码结构可修改变量的赋值。
(set! x 20)
上面代码将全局变量x的值9修改为20,因为对于set!全局变量是可见的。如果set!是在add2过程体内被调用,那修改的就是局部变量x:
(define add2
(lambda (x)
(set! x (+ x 2))
x))
这里set!在局部变量x上加上2,并且会返回局部变量x的新值。(从结果来看,我们无法区分这个过程和先前的add2过程)。我们可以像先前一样使用全局的x做参数值来调用add2:
(add2 x) => 22
(记住全局变量x的值现在是20,而不是9!)
add2过程内的set!调用仅会影响局部变量x。尽管局部变量x被赋了全局变量x的值,但后者不会因为set!为局部变量x赋值而受影响。
x => 20
注意我们做这些讨论是因为我们为局部变量和全局变量使用了同样的标识x。在某些代码中,这个叫x的标识符指的是语法闭包中的局部x变量,这会暂时隐藏闭包外或全局变量x的值。例如,
(define counter 0)
(define bump-counter
(lambda ()
(set! counter (+ counter 1))
counter))
bump-counter是一个没有参数的过程(没有参数的过程也称作thunk). 它没有引入局部变量和参数,这样就不会隐藏任何值。在每次调用时,它会修改全局变量counter的值,让它增加1,然后返回它当前的值。下面是一些bump-counter的成功调用示例:
(bump-counter) => 1
(bump-counter) => 2
(bump-counter) => 3
5.1 let 和 let*
并不是一定要显式的创建过程才可以创建局部变量。有个特殊的代码结构let可以创建一列局部变量以便在其结构体中使用:
(let ((x 1)
(y 2)
(z 3))
(list x y z))
=> (1 2 3)
和lambda一样,在let结构体中,局部变量x(赋值为1)会暂时隐藏全局变量x(赋值为20)。
局部变量x、y、z分别被赋值为1、2、3,这个初始化的过程并不作为let过程结构体的一部分。因此,在初始化时对x的引用都指向了全局变量x,而不是局部变量x。
(let ((x 1)
(y x))
(+ x y))
=> 21
上面代码中,因为局部变量x被赋值为1,而y被赋上了值为20的全局变量x。
有时候,用let依次的创建局变量非常的方便,如果在初始化区域中可以用先创建的变量来为后创建的变量赋值也会非常方便。let*结构就可以这样做:
(let* ((x 1)
(y x))
(+ x y))
=> 2
在初始化y变量时的x,指的是前面刚创建好的变量x。这个例子完全等价于下面这个let嵌套的程序,更深了说,实际上就是let嵌套的缩写。
(let ((x 1))
(let ((y x))
(+ x y)))
=> 2
我们也可以把一个过程做为值赋给变量:
(let ((cons (lambda (x y) (+ x y))))
(cons 1 2))
=> 3
在这个let构结体中,变量cons将它的参数进行相加。而在let结构的外面,cons还是用来创建点值对。
5.2 fluid-let
一个词法变量如果没有被隐藏,在它的作用域内一直都为可见状态。有时候,我们有必要装一个词法变量临时的设置为一个固定的值。为此我们可使用fluid-let结构(fluid-let是一个非标准的特殊结构。可参见8.3,在Scheme中定义fluid-let)。
(fluid-let ((counter 99))
(display (bump-counter)) (newline)
(display (bump-counter)) (newline)
(display (bump-counter)) (newline))
这和let看起来非常相像,但并不是暂时的隐藏了全局变量counter的值,而是在fluid-let执行体中临时的将全局变量counter的值设置为了99直到执行体结束。因此执行体中的三句display产生了结果
100
101
102
当fluid-let表达式计算结束后,全局变量counter会恢复成之前的的值。
counter => 3
注意fluid-let和let的效果完全不同。fluid-let不会和let一样产生一个新的变量。它会修改已经存的变量的值绑定,当fluid-let结束时这个修改也会结束。
为了清楚的说明这一些,可以思考这个根据前一个示例用let替换fluid-let后的程序。这次的输出是
4
5
6
即,初始值为3的全局变量counter,被每一次bump-counter的调用更新。而新创建的初始值为99的词法变量counter并没有影响到bump-counter的执行,因为尽管bump-counter是在局部变量counter的作用域内被调用的,但bump-counter的结构体并不在这个作用域内。所以bump-counter中的counter仍然指的是全局变量counter,最后的值为6。
counter => 6
分享到:
相关推荐
5. Fluent-Scheme-UDFs的高级特性,例如如何使用RP_Get和RP_Set函数在运行时获取和设置变量的值。 6. Fluent-Scheme的内置函数库,可能包括用于数学计算的函数、字符串处理函数等。 7. 与Fluent图形用户界面(GUI)...
这是一本在国外比较有名的Scheme编程语言的入门教材。本教材适合任何对Scheme编程语言感兴趣的人阅读,尤其是有其他编程语言(特别是动态语言)编程经验,希望快速了解Scheme的不同点并且快速上手写点东西的人。
由于提供的文件内容片段实际上并没有提供关于标题“fluent——scheme简明中文手册”的具体内容,而是呈现了一些无序的数字和章节标题,我们无法直接基于这些片段生成详尽的知识点。但我们可以根据手册的标题,以及...
标题与描述中的“统一方案(unified scheme)”与“基于笔触的自适应渲染(adaptive stroke-based rendering)”是本文的关键概念,涉及到计算机图形学领域中的非摄影真实感渲染技术(NPR)。该论文由Hyung W. Kang...
从实用角度考虑,尽管稳定分布缺乏封闭形式的概率密度和分布函数,但已知可以使用均匀分布于区间[0,1]的两个独立变量来生成稳定分布的随机变量。 这种分布的特性直接转化为了对高维向量进行“sketching”的技术,即...
CorSegRec: A Topology-Preserving Scheme for Extracting Fully-Connected Coronary Arteries from CT Angiography CorSegRec:拓扑保持 全连通提取方案 冠状动脉CT血管造影
4. Fluent-Scheme-UDFs 接口 Fluent Scheme 提供了一个 UDFs(User-Defined Functions)接口,允许用户定义自己的函数。该接口包括: * 数据交换:通过使用 `udf` 函数,可以在 Fluent 和 Scheme 之间交换数据。 *...
7. **Fluent-VariablenundFunktionen, Scheme-Literatur**: - FLUENT变量和函数部分列出了FLUENT软件中特定的变量和函数,它们可以与Scheme脚本一起使用。 - Scheme相关文献部分推荐了学习Scheme语言的书籍,帮助...
"A Preprocessing Scheme for High-Cardinality Categorical Attributes"这个主题探讨的就是如何有效地处理这类问题。 一、高基数类别变量的挑战 1. 维度灾难:高基数会导致数据的维度增加,这可能会引起过拟合,...
**Android Scheme Libs: Scheme-Lib for Android** Scheme-Lib是一个专门为Scheme编程语言设计的库,特别针对Android平台进行了优化和适配。Scheme是一种历史悠久、功能强大的Lisp方言,以其简洁的语法和强大的函数...
在Scheme语言的中文教程中,初学者可以通过详细学习其语法和规则,来掌握如何使用这种语言进行编程。教程中会详细讲解各种基础概念,例如: - 操作符和数据类型:包括基本的数值操作符如加法(+)、减法(-)、乘法...
- **标题**:“mit-scheme-fererence”(应当是“MIT Scheme Reference”的误拼)指向了MIT Scheme的一个版本的手册,这是一份详尽的技术文档,用于指导用户如何有效地使用MIT Scheme这一Lisp方言进行编程。...
《Teach Yourself Scheme in Fixnum Days》是一本详尽的教程,旨在帮助读者在有限的时间内掌握Scheme语言的基础及进阶知识。此书由Dorai Sitaram撰写,并且在网络上部分中文翻译已经存在(参考链接:...
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-...
资源分类:Python库 所属语言:Python 资源全名:scheme-2.0.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
《HA-ColorSchemeDesigner09-yfy:探索配色艺术与专业工具的奥秘》 在数字设计领域,色彩搭配是至关重要的一环,它能够直接影响到用户对产品的第一印象和使用体验。"HA-ColorSchemeDesigner09-yfy" 是一款专为设计...
- **环境变量**:通过设置环境变量调整Scheme的工作环境。 ##### 3.3 内存使用情况 - **内存管理**:了解Scheme如何管理和优化内存使用,避免出现内存溢出等问题。 - **性能优化**:提供一些技巧帮助开发者优化代码...
标题中的"PyPI 官网下载 | calysto_scheme-1.4.5-py2.py3-none-any.whl"表明这是一个从Python Package Index (PyPI)官方源下载的软件包,具体是`calysto_scheme`的1.4.5版本。PyPI是Python社区最常用的第三方库分发...
《MIT-Scheme的基本使用教程》 MIT-Scheme是一款基于R5RS标准的Scheme实现,它以其简洁、高效和可扩展性著称。本教程将详细讲解如何使用MIT-Scheme进行编程,包括在命令行环境和Emacs编辑器下的操作。 一、MIT-...