2013-02-18 103 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