今天的题目是函数,先看一下匿名函数。

Perl里是这样的

$f = sub{ return $_[0]+$_[1]+$_[2];

};

print &$f(1,2,3)."\n";

lua里是这样的

f = function(x,y,z) return x+y+z end

print (f(1,2,3))

python里使用了lambda概念,实现是这样的,也可以通过全局函数apply调用任意的函数

f = lambda x,y,z : x+y+z

print f(1,2,3)

#or print apply(f, 1, 2, 3)

ruby没有仔细看过,似乎必须这样。可能由于ruby中所有的东西都是对象,所以一定要一个显式的call来调用函数,也可以使用send方式

f = proc { |x,y,z| print x+y+z

}

f.call(1,2,3)

#or the small talk way

#f.send "call", 1, 2, 3

#k.send :call, 1, 2, 3

再看Closure,Closure这个概念很难解释,但是在脚本语言里的作用非常大,现在的脚本语言无一例外的支持它。主要的用途在于Callback函数和iterator中,也就是需要在一个函数需要保留一些外界的value时,提供一个轻量级的方案。对象方法也能提供类似的功能,像C++中STL的iterator就是用inner

class实现的,C中的回调函数通常需要传递一个对象指针,在脚本语言中完全没有必要这么复杂。各种语言实现基本一致,详细的例子可以看看类似iterator的实现代码或者Qt\GTK\wxWindows之类的脚本类库,看一个简单的例子。

Perl的实现

sub CreateObj

{

# parameter

my ($str) = @_;

# This is the closure function that saves external str

value

$callback = sub {

print "$str called\n";

};

return $callback;

}

$call = CreateObj("CB1"); &$call();

python里的实现

def CreateObj(str):

def callback(): print str," called"

return callback

call = CreateObj("CB1")

call()

lua里的实现

function CreateObj(str)

function callback()

print (str.." called")

end

return callback

end

call = CreateObj("CB1")

call

ruby里的实现

def CreateObj(str)

# use proc object instead of anonymous function

return proc { || print str, " called"

}

end

p1 = CreateObj("CB1")

p1.call()

最后看一个有趣的特性,叫做Proper tail call。看下面的伪代码

function test()

begin

return test()

end

这是一个典型的死循环递归调用,在绝大多数语言中类似的调用很快就会导致Stack

Overflow。但是在Perl和Lua中就不会发生,原因就在于当解析器发现函数调用的最后一行是return一个函数调用时,它就会很“智能地”把这个调用延后到函数返回之后再调用,这样就避免了堆栈溢出的问题。所以下面两段代码也不会出问题。

Perl的代码

sub cycle{

print "s\n";

return cycle();

};

cycle();

lua的代码

function cycle()

local dir = io.read()

print (dir)

return cycle()

end

cycle()

上面的例子也许没有什么实际用处,仔细想想这个特性在构造状态机之类的功能是非常有用的,比如一个状态机有三个状态,lua里可以这样写

function state1()

input = getinput()

if (input == 2) then

return state2()

end if (input == 3) then

return state3()

end end

function state2()

input = getinput()

if (input == 1) then

return state1()

end if (input == 3) then

return state3()

end end

function state3()

input = getinput()

if (input == 1) then

return state1()

end if (input == 2) then

return state2()

end end

给定一个初始状态

init = state1()

然后整个状态机就自动地运行下去了,节省了大量通常的状态机编程需要考虑的状态存储、对象设计问题。

perl python ruby_perl,lua,python,ruby的对比(3) -- lambda,closure,proper tail function call相关推荐

  1. Python、Lua和Ruby比较——脚本语言大P.K.

    译者按:Python.lua和ruby在C/C++是日渐式微的情况下,在java/.net的围歼中努力抗争的三个当红小生.在Tom Gutschmidt的著作<Game Programmng w ...

  2. lua与python_动态大比拼Python、Lua和Ruby

    赖勇浩(http://blog.csdn.net/lanphaday) 译 译者按:Python.lua和ruby在C/C++是日渐式微的情况下,在java/.net的围歼中努力抗争的三个当红小生.在 ...

  3. 脚本语言语言脚本语言:Shell , JavaScript、VBScript、Perl、PHP、Python、Ruby、Lua

    今天一直在研究脚本语言语言之类的问题,上午正好有机会和大家共享一下. 脚本语言:Shell , JavaScript.VBScript.Perl.PHP.Python.Ruby.Lua 工作控制语言和 ...

  4. 黑客用python还是ruby-Python、Lua和Ruby之优劣

    Python Python的优点: 1.Python比其它语言有更多扩展模块. 2.在网上可以找到很多Python教程.不仅如此,还有大量的英文书籍和资料.Python.org有很多为初学者准备的依主 ...

  5. Perl、PHP、Python、Java和Ruby的比较(来自知乎)

    ◆ 语言的发展趋势一定是动静结合.刚柔并济 ◆ Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯 ◆ 或许优雅正是来自对细节和规范的重视 ◆ (RoR)与Ruby结合之后,便如 ...

  6. 比较Perl、PHP、Python、Java和Ruby

    !预览 · 语言的发展趋势一定是动静结合.刚柔并济 · Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯 · 或许优雅正是来自对细节和规范的重视 · (RoR)与Ruby结合之 ...

  7. php与python缺点_php,python,ruby,perl的优缺点?

    提问者采纳 2012-02-25 08:41 perl基本已经被淘汰,在各方面几乎已经没有优势,虽然说还正在开发perl6啊什么的,不过基本上大势已去.虽然在部分场合还有应用,不过大部分都只是因为历史 ...

  8. Perl,PHP,Python,Ruby概要及各自特点

    http://run-wang.iteye.com/blog/1290061 程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C ...

  9. Perl、PHP、Python、Java和Ruby的比较

    提问 ◆ Perl.Python.Ruby和PHP各自有何特点? ◆ 为什么动态语言多作为轻量级的解决方案? ◆ LAMP为什么受欢迎? ◆ Ruby on Rails为什么会流行? ◆ 编程语言的发 ...

最新文章

  1. 钉钉、支付宝合种树,2-4天领证,限量9个名额
  2. 【强化学习】Sarsa 和 Sarsa(λ)
  3. 2019~2020年IDC行业发展趋势预测
  4. 5.QT中关于HTTPClient相关的操作,Json数据传输
  5. c语言巩固,巩固一下C语言中的指针
  6. bootstrap,datetimepicker日期时间选择器-限制时间段,以及中文显示问题
  7. html生成pdf表格线加粗,iText 用 HTMLWorker 转换 HTML 为 PDF 时可设置表格列宽度
  8. elasticsearch5.0.0中索引和文档接口的变化
  9. Framework学习(二)Android的启动过程
  10. grpc java 泛型_gRPC中Any类型的使用(Java和NodeJs端)
  11. Mathpix图片转LaTeX,Word快速插入LaTeX公式教程
  12. 2014.7.30-8.3日广大网友的提问解答(答问题的第2个工作周)
  13. 博文视点学院直播:如何用产品思维解决生活中的迷茫
  14. B9 Concurrent 重入锁(ReentrantLock)
  15. Go语言实战(一)环境配置
  16. java程序员的项目经历如何写,大量教程
  17. Spark入门程序(idea,scala)
  18. 英语不规则动词变化时态变化表
  19. 【强化学习】强化学习介绍
  20. 机器学习:数据归一化(Scaler)

热门文章

  1. yii mysql 缓存_yii2优化 - 开启 Schema 缓存
  2. Log4j2突发重大漏洞
  3. android开机后自动执行shell,init.rc启动 shell脚本
  4. vue 加载太慢_Vue首页加载过慢 解决方案
  5. access mysql oracle数据库_Oracle Access 数据库连接 使用
  6. 计算机网络子网划分路由配置实验报告,完整的子网划分与路由交换实验报告 珍藏版哦...
  7. 条令考试小程序辅助器_计算机一级考试干货!
  8. Java反射 Constructor类
  9. datax 导入数据中文乱码_DataX在有赞大数据平台的实践
  10. php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...