函数是主要的一种程序抽象形式,能够将一组独立的行为用一个名字和其相应的参数来代替。是一种更高形式而且被大多数人所承认的抽象形式。程序员
不一样的语言的函数特色:编程
不一样数量的返回值: 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 语言中,能够将函数的返回值定义为一个匿名函数。
闭包的主要用途是将必定范围的变量的范围加载到一个函数的定义中,每次调用这个 函数的时候,这些变量可以保存上次调用后所保留的值。从而实现迭代器和保存状态 等许多功能。
但在函数式编程中,有一个原则就是消除函数的反作用,也就是说:一个函数在固定 的输出状况下,应当有固定的输出。但迭代器是一个特例,他每次调用,都会按照顺序 调取一个集合中的值,直到集合的末尾,不知道这个特例是否打破了函数式编程的原则。
在现今许多大型应用中,并发程序要求调用的变量,函数等资源是不可变的,这样在 多个并发的场景中,每一个进程就没必要担忧在本身的运算过程当中,所依据的东西是否稳定。否则就会出现不可预知的后果。就好象在面向对象的编程中,类变量是方法所不能改变的。
将来的语言可能会出现进程变量,并发类等概念。 多个并发进程中,进程变量保持不变,每一个进程 都有本身独立的变量,多个进程一块儿运行,按照一个存储收集结果的协议, 能够快速完成一个庞大的任务。