函數漫筆

函數是主要的一種程序抽象形式,能夠將一組獨立的行爲用一個名字和其相應的參數來代替。是一種更高形式而且被大多數人所承認的抽象形式。程序員

不一樣的語言的函數特色:編程

不一樣數量的返回值: C 語言的函數定義只能返回一個,若是涉及到多個值的返回,須要用數組或者 結構攜帶不一樣的值返回。在 Python 中也是如此,多個值返回的狀況是用一個數組來模擬的。數組

第一類值(first class value): 一些語言能夠將函數用一個變量來表示,從而能夠像普通變量 同樣對函數進行運算,或看成函數的參數傳遞給另外的函數。數據結構

在 Lua 中是這樣定義的:閉包

local function_name = function (a,b) print("something") end併發

Javascript 也有相似的表達形式:函數式編程

var functionname = function (a,b) { return (a + b) }函數

Perl 語言中:指針

my $function = sub { print("hello world) }調試

調用的時候,使用:

$function->()

Ruby 中:

function_name = lamba (a,b) { puts("hello world") }

但調用的時候,須要用 function_name.call(a,b) 的形式

在 C 語言中,因爲指針的存在,能夠定義一個指針來表示函數,從而實現將函數做爲變量進行傳遞。

PHP 從 5.3 纔開始支持匿名函數的語法定義。

Lisp 的宏:

許多人說 Lisp 的宏是 Lisp 獨特的功能,屬於在別的語言中沒有的特性。而模式就是語言不夠的時候尋求的解決辦法。

以我所知,Perl 語言中有這種機制,但因爲 Perl 語言的代碼不是一種簡單 的數據結構,因此,對代碼的預處理成爲很是複雜和難以調試的技能,不多被人掌握和使用。

Perl 語言的二號人物,Conway 就開發了一系列的模塊,使用了這種危險和高超的形式。 Perl6::Export 就是這樣的典型例子。雖然使用針對代碼自己的宏,讓程序員增長更大的 靈活性,更容易實現編寫「可以寫代碼的代碼」,但同時也增長了代碼自己的許多潛在 的風險。但一些人就是喜歡這樣的在刀尖上跳舞的技術,而且樂此不疲的追求。

函數嵌套也是許多語言不一樣的地方,在函數中編寫函數:

在 Python 語言中,能夠定義函數中的函數,而在 Ruby 中,就不能。 在 Perl 語言中,能夠將函數的返回值定義爲一個匿名函數。

閉包的主要用途是將必定範圍的變量的範圍加載到一個函數的定義中,每次調用這個 函數的時候,這些變量可以保存上次調用後所保留的值。從而實現迭代器和保存狀態 等許多功能。

但在函數式編程中,有一個原則就是消除函數的反作用,也就是說:一個函數在固定 的輸出狀況下,應當有固定的輸出。但迭代器是一個特例,他每次調用,都會按照順序 調取一個集合中的值,直到集合的末尾,不知道這個特例是否打破了函數式編程的原則。

在現今許多大型應用中,併發程序要求調用的變量,函數等資源是不可變的,這樣在 多個併發的場景中,每一個進程就沒必要擔憂在本身的運算過程當中,所依據的東西是否穩定。否則就會出現不可預知的後果。就好象在面向對象的編程中,類變量是方法所不能改變的。

將來的語言可能會出現進程變量,併發類等概念。 多個併發進程中,進程變量保持不變,每一個進程 都有本身獨立的變量,多個進程一塊兒運行,按照一個存儲收集結果的協議, 能夠快速完成一個龐大的任務。

相關文章
相關標籤/搜索