首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scheme let语句

Scheme let语句
EN

Stack Overflow用户
提问于 2013-02-19 03:15:12
回答 2查看 9.8K关注 0票数 10

在函数式程序设计语言scheme中,没有赋值语句。但是在let语句中

代码语言:javascript
复制
(let ((x 2))
    (+ x 3))

您将2赋值给x,那么为什么这不违反函数式编程中没有赋值语句的原则呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-19 03:18:24

"Scheme is a functional programming language“这句话是错误的。在Scheme中,鼓励函数式编程风格,但不是强制的。实际上,您可以使用set! (一个赋值语句!)用于修改任何变量的值:

代码语言:javascript
复制
(define x 10)
(set! x (+ x 3))
x
=> 13

关于问题的let语句,请记住下面这样的表达式:

代码语言:javascript
复制
(let ((x 10))
  (+ x 3))
=> 13

..。它只是语法上的糖,在引擎盖下它是这样实现的:

代码语言:javascript
复制
((lambda (x)
   (+ x 3))
 10)
=> 13

请注意,let对其变量执行一次性single assignments,因此它本身不违反任何纯粹的函数式编程原则,以下是let表达式可以肯定的:

如果表达式的求值不改变机器的可观察状态,并且为相同的输入生成相同的值,则表达式的求值不会产生副作用

另外,引用维基百科的话:

不纯函数式语言提供单一赋值和真实赋值(尽管真实赋值的使用频率通常低于命令式编程语言)。例如,在Scheme中,单个赋值(使用let)和真实赋值(使用set!)都可以在所有变量上使用,并且提供了专门的原语,用于列表、向量、字符串等内部的破坏性更新。

票数 15
EN

Stack Overflow用户

发布于 2013-02-19 03:18:18

http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment

基本上,这是一个允许的单一赋值。由于副作用,其他赋值是不允许的。

编辑:允许引用,因为正如Oscar所说,这不是强制性的,而是建议的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14943681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档