方案让声明

ome*_*ega 7 scheme functional-programming let

在作为函数式编程语言的方案中,没有赋值语句.但在一份let声明中

(let ((x 2))
    (+ x 3))
Run Code Online (Sandbox Code Playgroud)

您要分配2x,为什么不这样违反,有函数式编程没有赋值语句的原则?

Ó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赋值(with set!)都可以用于所有变量,并且提供专用原语用于列表,向量,字符串等内部的破坏性更新.