2013-02-18 170 views
6

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

(let ((x 2)) 
    (+ x 3)) 

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

回答

11

声明“Scheme是一种函数式编程语言”是不正确的。在Scheme中,函数式编程风格受到鼓励,但不是强迫的。事实上,你可以使用set!(赋值语句!)修改任何变量的值:

(define x 10) 
(set! x (+ x 3)) 
x 
=> 13 

就问题的let声明,记得表达这个功能,比如一个:

(let ((x 10)) 
    (+ x 3)) 
=> 13 

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

((lambda (x) 
    (+ x 3)) 
10) 
=> 13 

注意到一个let在其变量执行一次性single assignments,所以它不违反任何纯功能编程原理本身,以下可以肯定一个let表达的:

表达式的评估不具有的副作用,如果它不改变机器的可观察到的状态,并为同一输入

还生产相同的值,维基百科引用:

不纯粹的功能语言既提供了单一的分配,也提供了真正的分配(尽管真正的分配通常使用频率比命令式编程语言少)。例如,在方案,单分配(带let)和真分配(带set!)可以在所有变量被使用,并且提供了用于内部列表,载体,字符串破坏性更新专门的基元等

+1

甲函数式编程语言鼓励并提供功能,但不一定强制执行功能性编程。 – ThePiercingPrince 2014-02-25 14:39:27