perl python ruby_perl,lua,python,ruby的对比(3) -- lambda,closure,proper tail function call
今天的题目是函数,先看一下匿名函数。
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相关推荐
- Python、Lua和Ruby比较——脚本语言大P.K.
译者按:Python.lua和ruby在C/C++是日渐式微的情况下,在java/.net的围歼中努力抗争的三个当红小生.在Tom Gutschmidt的著作<Game Programmng w ...
- lua与python_动态大比拼Python、Lua和Ruby
赖勇浩(http://blog.csdn.net/lanphaday) 译 译者按:Python.lua和ruby在C/C++是日渐式微的情况下,在java/.net的围歼中努力抗争的三个当红小生.在 ...
- 脚本语言语言脚本语言:Shell , JavaScript、VBScript、Perl、PHP、Python、Ruby、Lua
今天一直在研究脚本语言语言之类的问题,上午正好有机会和大家共享一下. 脚本语言:Shell , JavaScript.VBScript.Perl.PHP.Python.Ruby.Lua 工作控制语言和 ...
- 黑客用python还是ruby-Python、Lua和Ruby之优劣
Python Python的优点: 1.Python比其它语言有更多扩展模块. 2.在网上可以找到很多Python教程.不仅如此,还有大量的英文书籍和资料.Python.org有很多为初学者准备的依主 ...
- Perl、PHP、Python、Java和Ruby的比较(来自知乎)
◆ 语言的发展趋势一定是动静结合.刚柔并济 ◆ Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯 ◆ 或许优雅正是来自对细节和规范的重视 ◆ (RoR)与Ruby结合之后,便如 ...
- 比较Perl、PHP、Python、Java和Ruby
!预览 · 语言的发展趋势一定是动静结合.刚柔并济 · Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯 · 或许优雅正是来自对细节和规范的重视 · (RoR)与Ruby结合之 ...
- php与python缺点_php,python,ruby,perl的优缺点?
提问者采纳 2012-02-25 08:41 perl基本已经被淘汰,在各方面几乎已经没有优势,虽然说还正在开发perl6啊什么的,不过基本上大势已去.虽然在部分场合还有应用,不过大部分都只是因为历史 ...
- Perl,PHP,Python,Ruby概要及各自特点
http://run-wang.iteye.com/blog/1290061 程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C ...
- Perl、PHP、Python、Java和Ruby的比较
提问 ◆ Perl.Python.Ruby和PHP各自有何特点? ◆ 为什么动态语言多作为轻量级的解决方案? ◆ LAMP为什么受欢迎? ◆ Ruby on Rails为什么会流行? ◆ 编程语言的发 ...
最新文章
- 钉钉、支付宝合种树,2-4天领证,限量9个名额
- 【强化学习】Sarsa 和 Sarsa(λ)
- 2019~2020年IDC行业发展趋势预测
- 5.QT中关于HTTPClient相关的操作,Json数据传输
- c语言巩固,巩固一下C语言中的指针
- bootstrap,datetimepicker日期时间选择器-限制时间段,以及中文显示问题
- html生成pdf表格线加粗,iText 用 HTMLWorker 转换 HTML 为 PDF 时可设置表格列宽度
- elasticsearch5.0.0中索引和文档接口的变化
- Framework学习(二)Android的启动过程
- grpc java 泛型_gRPC中Any类型的使用(Java和NodeJs端)
- Mathpix图片转LaTeX,Word快速插入LaTeX公式教程
- 2014.7.30-8.3日广大网友的提问解答(答问题的第2个工作周)
- 博文视点学院直播:如何用产品思维解决生活中的迷茫
- B9 Concurrent 重入锁(ReentrantLock)
- Go语言实战(一)环境配置
- java程序员的项目经历如何写,大量教程
- Spark入门程序(idea,scala)
- 英语不规则动词变化时态变化表
- 【强化学习】强化学习介绍
- 机器学习:数据归一化(Scaler)
热门文章
- yii mysql 缓存_yii2优化 - 开启 Schema 缓存
- Log4j2突发重大漏洞
- android开机后自动执行shell,init.rc启动 shell脚本
- vue 加载太慢_Vue首页加载过慢 解决方案
- access mysql oracle数据库_Oracle Access 数据库连接 使用
- 计算机网络子网划分路由配置实验报告,完整的子网划分与路由交换实验报告 珍藏版哦...
- 条令考试小程序辅助器_计算机一级考试干货!
- Java反射 Constructor类
- datax 导入数据中文乱码_DataX在有赞大数据平台的实践
- php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...