ome*_*ega 7 scheme functional-programming let
在作为函数式编程语言的方案中,没有赋值语句.但在一份let声明中
(let ((x 2))
(+ x 3))
Run Code Online (Sandbox Code Playgroud)
您要分配2到x,为什么不这样违反,有函数式编程没有赋值语句的原则?
Ósc*_*pez 12
语句"Scheme是一种函数式编程语言"是不正确的.在Scheme中,鼓励使用函数编程风格,但不强制使用.实际上,您可以使用set!(赋值语句!)来修改任何变量的值:
(define x 10)
(set! x (+ x 3))
x
=> 13
Run Code Online (Sandbox Code Playgroud)
关于问题的let陈述,请记住这样的表达式:
(let ((x 10))
(+ x 3))
=> 13
Run Code Online (Sandbox Code Playgroud)
......它只是语法糖,并且它的实现如下:
((lambda (x)
(+ x 3))
10)
=> 13
Run Code Online (Sandbox Code Playgroud)
请注意,一个let执行一次单一的分配在其变量,所以它不违反任何纯功能编程原理本身,可以肯定一个的以下let表达式:
如果表达式的评估没有改变机器的可观察状态,并且为相同的输入生成相同的值,则表达式的评估没有副作用
另外,引用维基百科:
不纯的函数式语言既提供单一赋值,也提供真正的赋值(尽管真正的赋值通常使用频率低于命令式编程语言).例如,在Scheme中,单个赋值(with
let)和true赋值(withset!)都可以用于所有变量,并且提供专用原语用于列表,向量,字符串等内部的破坏性更新.