论坛首页 编程语言技术论坛

Closure & Block

浏览 10311 次
锁定老帖子 主题:Closure & Block
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-17  
引用
Q. Why Java does this? Why Java does that?
A:
To computer languages or natural languages, I always prefer to ask what and how instead of why.

Even though I know there are a lot of good and bad reasons behind them. The good ones make the language vital and successful, the bad ones make future improvement and replacement possible.

Languages (natural and programming languages included) are not rigorous science, a lot of human factors are involved. To programming languages, another factor is the cost.

This is a more philosophical and time-efficient decision of mine. You can make yours different than mine, of course.

Sorry, it is usually not a very satisfactory answer for you.


Copied from
http://bobcat.webappcabaret.net/javachina/faq/09.htm#mis_Q40

  
0 请登录后投票
   发表时间:2006-11-17  
==== 以下全是个人的感觉 =======

block是不是就是原封不动的写在那个位置上,所以刚才的那个return就是return整个函数

& 这个可能就是传入一个函数的地址,调用的时候就是执行这个方法,所以return的话只是这个方法结束,但是外面的大函数还没有结束。

感觉是两个不同运行期执行的东西。
0 请登录后投票
   发表时间:2006-11-17  
差沙 写道
==== 以下全是个人的感觉 =======

block是不是就是原封不动的写在那个位置上,所以刚才的那个return就是return整个函数

& 这个可能就是传入一个函数的地址,调用的时候就是执行这个方法,所以return的话只是这个方法结束,但是外面的大函数还没有结束。

感觉是两个不同运行期执行的东西。


I don't know why you put "个人的感觉" here????

Have you tried qiezi's or mine code????

Where you got the "所以"??? (return的话只是这个方法结束,但是外面的大函数还没有结束)

Interesting!!!!!

We need the facts, not your "个人的感觉"!!!!

Thanks!

0 请登录后投票
   发表时间:2006-11-18  
I just searched wikipedia, this is an article explains everything we need.

http://en.wikipedia.org/wiki/Closure_%28computer_science%29

Suggestion: Read, please!

Thanks!
0 请登录后投票
   发表时间:2006-11-19  
dongbin 写道
按照SICP的说法,Closure有两个含义,第一个指的就是离散数学中的定义,大概意思是:

一个定义域和函数集合,使得函数的值域仍然落进定义域。

后来不知道为什么这个词用来形容包含自由变量的函数,这个自由变量就是上面所说的Context。

其实这两个定义没有任何关系。



Actually, the concepts of math closure and computer science closure are very much related. Read both here:

http://en.wikipedia.org/wiki/Closure

Thanks!
0 请登录后投票
   发表时间:2006-11-20  
《C++沉思录》有一种提法,语言设计就是库设计,库设计就是语言设计。Block和Closure之间就体现了这样一种关系。

在Ruby中,Block是语言提供的一种机制,就像条件语句、循环语句一样,而Clousure,我们可以把它看作是由库提供的,Block在语言一级为构建Closure提供了的支持。

具体来看一下,这个支持是怎样提供的。

常见的构造Closure方法是lambda,它定义在eval.c中。同样在eval.c中,我们还可以找到如何new一个Proc对象:
rb_define_global_function("lambda", proc_lambda, 0);

static VALUE
proc_lambda()
{
    return proc_alloc(rb_cProc, Qtrue);
}

rb_cProc = rb_define_class("Proc", rb_cObject);
rb_undef_alloc_func(rb_cProc);
rb_define_singleton_method(rb_cProc, "new", proc_s_new, -1);

static VALUE
proc_s_new(argc, argv, klass)
    int argc;
    VALUE *argv;
    VALUE klass;
{
    VALUE block = proc_alloc(klass, Qfalse);

    rb_obj_call_init(block, argc, argv);
    return block;
}


关于Allocator,我写过一篇blog讨论:
管窥Ruby——Allocator

通过这段代码,我们发现,实际上,通过lambda构造出来的对象同Proc类对象拥有着共同的基础——proc_alloc,差别在于仅仅在于参数不同。实际上,这样构建出来的对象就是一个Proc类对象。《Programming Ruby》的第24章讨论到以Block做Closure时提到,通过lambda方法可以将Block转化为Proc对象,就是通过上面的方法完成的。

顺便说一下,roseanne的例子中,lambda和Proc.new表现不同,其差异就在于二者构建时的不同参数。

总结一下,我们可以这样理解Block、Closure和Proc之间的关系:
Block是语言提供的一种机制,Closure是一种对象,通常是通过Block构建出来,它的类型是Proc类型。

基于上面的讨论,有些问题就比较容易了。当我们希望像一个对象一样使用Block时,比如作为参数在不同的方法之间传递时,比如作为某个类的实例变量时,我们可以把它封装成一个Closure,当作一个对象来使用,roseanne的例子也展示了这一点。

至于Context,有兴趣的话,可以去研究proc_alloc的实现,其实只是一个复制的工作。所以,如果执行这段代码的时候,Context之间可能会有差异,这样造成的结果,就是可能会抛出异常。因为Ruby把这些内容放到了库中,而非语言中,编译时不去做检查,所以,才会出现这种令人费解的“看似正确,却抛出异常”的代码。
0 请登录后投票
   发表时间:2006-11-20  
In ruby 1.8, proc is a synonym of lambda, but in 1.9, proc is a synonym of Proc.new.

Proc.new is NOT closure, but lambda is.

I avoided to discuss proc (all lower case), because it causes confusion.
0 请登录后投票
   发表时间:2006-11-20  
Block, Proc.new are closure like stuff, but they are not closures strictly.
0 请登录后投票
   发表时间:2006-11-23  
dongbin 写道
按照SICP的说法,Closure有两个含义,第一个指的就是离散数学中的定义,大概意思是:

一个定义域和函数集合,使得函数的值域仍然落进定义域。

后来不知道为什么这个词用来形容包含自由变量的函数,这个自由变量就是上面所说的Context。

其实这两个定义没有任何关系。


我没有看过这几个语言中Closure的精确定义和用法, 但是凭感觉说一下:

大概Closure的区别在于它的参数表相当于实例变量, 然后一个Closure被 "构造"传递 出去以后还可以被继续传递, 而它的参数表里各参数的值, 在它这个实例的生存周期以内是一直保存的, 被它自己修改过以后, 如果yield了, 下次再执行回来, 读出的是修改过的值.

不知道有没有人验证一下, 看看有没有语言中同一个Closure实例被再传递的情况.
0 请登录后投票
   发表时间:2006-11-23  
roseanne 写道
差沙 写道
==== 以下全是个人的感觉 =======

block是不是就是原封不动的写在那个位置上,所以刚才的那个return就是return整个函数

& 这个可能就是传入一个函数的地址,调用的时候就是执行这个方法,所以return的话只是这个方法结束,但是外面的大函数还没有结束。

感觉是两个不同运行期执行的东西。


I don't know why you put "个人的感觉" here????

Have you tried qiezi's or mine code????

Where you got the "所以"??? (return的话只是这个方法结束,但是外面的大函数还没有结束)

Interesting!!!!!

We need the facts, not your "个人的感觉"!!!!

Thanks!



HEHE.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics