什么是在Rebol的2和3之间的结合行为的差异汇总?(What is the summary of

2019-07-19 17:19发布

当前深入上可变结合文档目标雷博尔2.有人能提供的Rebol的2和3之间的差异的汇总?

Answer 1:

是不是真的有一个总结的地方,让我们先回顾以下基本,或许更多一点非正式比Bindology 。 让拉吉斯拉夫写他的论文R3和红色的新版本。 我们还是要过的基本差异,按重要性排列。

对象和功能上下文

这里有很大的区别。

在R2,有基本上有两种上下文:正常对象上下文和system/words 。 双方进行了静态绑定,这意味着一旦bind函数运行,这个词的结合指向一个特定的对象有一个真正的指针。

system/words的上下文是能够在运行时被扩大到包括新词,但所有其他对象是不可。 功能使用常规对象上下文,一些两轮牛车当你递归调用函数切换出值块。

self话是只是一个普通的词,发生在对象上下文中的第一个,用一个显示黑客不显示在上下文中的第一个字; 功能上下文没有这个字,所以他们没有正确显示的第一条定期字。

在R3,几乎所有的是不同的。

在R3也有2种上下文:定期和堆栈的局部。 定期上下文由对象,模块,结合环,使用use ,基本上一切,但功能,它们是可扩展的像system/words是(是的,“是”,我们会到达那个)。 旧的固定长度的对象都没有了。 函数使用堆栈的局部环境,其中(除非我们还没有看到任何错误)不应该是可扩展的,因为这会弄糟堆栈帧。 与旧system/words ,你不能收缩背景下,因为从上下文中取出的话将打破这些词的任何绑定在那里。

如果你想将单词添加到常规情况下,你可以使用bind/newbind/setresolve/extendappend ,或调用这些,这取决于其他功能,你需要什么样的行为。 这是新的行为bind ,并append在R3的功能。

也就是说定期和堆栈的局部环境的绑定是静态的,如前。 值查找是另一回事。 对于经常上下文值查找是相当直接的,通过简单的间接指针做价值插槽的静态块。 对于堆栈的局部环境值块由堆栈帧链接和引用从那里,所以要找到合适的框架,你所要做的堆栈步即是O(堆栈深度)。 见错误#1946年的详细信息-我们将进入后的原因。

哦, self不是一般的字了,这是有约束力的把戏,关键字。 当您绑定字到对象或模块上下文的块,其结合关键字self其评估为上下文的引用。 然而,存在可以设置一个内部标志,它说,一个上下文是“无私”,它变成该self关键字关闭。 当该关键字被关闭,实际上你可以用这个词self作为一个字段在你的环境。 结合环, use和功能环境设置相应的语境无私标志和selfless? 功能检查这一点。

这种模式精制并记录在一个相当复杂的CureCode口水战,就像R2的模型是由REBOL邮件列表火焰战争早在1999 - 2000年记录在案。 :-)

功能与闭包

当我在谈论上述堆栈的局部功能的环境中,我的意思是由所使用的环境function! 类型的功能。 R3有很多功能类型,但其中大部分是天然的功能于一体的这样或那样的,和本机功能不使用这些堆栈的局部环境中(虽然他们得到堆栈帧)。 这是Rebol的代码的唯一功能类型function! 和一个新的closure! 类型。 闭包是从常规的功能非常不同。

当你创建一个function! ,你要创建一个功能。 它构建一个堆栈的局部上下文中,代码体结合到它,并捆绑在一起的代码体和规范。 当你调用该函数它与该功能的上下文的引用堆栈帧和运行的代码块。 如果访问的话在功能方面它的堆栈步行到找到合适的框架,然后从那里得到的值。 非常坦率的。

当你创建一个closure! ,在另一方面,你创建一个函数生成器 。 它建立了规范和功能体几乎一样的function! ,但是当你调用一个封闭它使一个新的定期无私的环境,然后做了bind/copy身体,转变为功能上下文中的所有引用是在副本中的新的常规范围内引用。 然后,当它的复制体,所有封字引用那些对象上下文的静态。

两者之间的另一个区别是,他们的行为方式的功能正在运行之前,该功能运行时,函数步骤完成后运行。

在R2, function! 背景仍然存在,当功能没有运行,但功能的上层呼叫的价值块仍然存在太多。 只有递归调用得到新的价值块,顶级的呼叫保持持久值块就像我说的,两轮牛车。 更糟的是,顶层值块不被清除函数返回时,所以你最好确保你没有任何引用敏感或要回收当函数返回时(使用also的功能来清理,那是什么我做了它)。

在R3的function! 该功能不运行时环境中仍然存在,但该值块不存在的。 所有的函数调用像递归调用在R2,因为它是这样设计的一路下跌,引用堆栈帧,而不是做了,除了更好。 该堆栈帧的范围是动态的(秆Lisp的风扇,如果你需要的是历史),所以只要功能是当前堆栈上运行(是的,“当前”,我们会到达那个),你可以使用它的一个关键词,以获得在最近该函数呼叫的值。 一旦所有的函数返回的嵌套调用的,不会有在范围内的任何值,你只会触发一个错误(错误的错误,但我们会解决这个问题)。

还有上绑定到我的待办事项列表,以尽快修复一个彻头彻尾的范围的虚词无用限制。 见错误#1893年的详细信息。

对于closure! 功能方面,封闭运行上下文之前不存在的 。 一旦闭合开始运行,上下文创建并持续存在。 如果再次,或递归调用关闭,创建另一个持久上下文。 从封闭泄漏任何文字只是指封闭的特定运行期间创建的上下文。

你不能绑定到R3的功能或关闭背景功能或关闭不运行时的一句话。 对于函数,这是一个安全问题。 对于关闭,这是一个定义问题。

瓶盖被认为是非常有用,所以拉吉斯拉夫和我两个人移植到R2,独立地产生类似的代码,古怪足够的时间不同。 我认为,拉吉斯拉夫的版本早于R3,并担任灵感R3的closure! 类型; 我的版本是基于测试该类型的外部行为,并试图复制它在R2为R2 /前进,所以这是有趣的,对于解决closure最终被如此的相似,拉吉斯拉夫原来的,我没有看到,直到很久以后。 我的版本得到了包括在R2本身开始2.7.7,作为closureto-closureclosure? 功能,以及closure! 字分配相同类型的值function! 在R2。

全球与当地环境

这里的事情变得非常有趣。

在Bindology有相当大量的文章谈到了“全球”上下文之间的区别(这竟然是system/words )和“本地”的环境中,为R2相当重要的区别。 在R3, 这样的区分是无关紧要的

在R3, system/words 消失了 。 有没有一个“全局”上下文。 所有常规上下文是在在R2意味着感,这使得“本地”无用那意思是“本地”。 对于R3,我们需要一套新的术语。

对于R3,唯一重要的区别是上下文是否是任务相对的 ,所以唯一有用的意思是“全球”环境是不直接任务,相对的,与“本土”背景是有任务的,相对的那些。 A“任务”,在这种情况下将是task! 型,这基本上是在当前的模型中的OS线程。

在R3,此刻,唯一的东西,到目前为止是任务相对(勉强)是堆栈变量,这意味着堆栈相对功能上下文应该是任务相对也。 这就是为什么堆栈步是必要的,因为否则我们就需要保持和维护TLS指针在每一个功能方面 。 所有常规上下文是全球性的。

另一个要考虑的是,根据该计划(其中大部分是未实现到目前为止),用户上下文system/contexts/usersystem本身也意在任务相对的,所以即使是R3的标准,他们会被视为“本地”。 而且,由于system/contexts/user基本上是R3有R2的最接近system/words ,那意味着什么脚本想为自己的“全局”上下文实际上应该是任务局部的R3。

R3确实有一对夫妇的系统,称为全球背景syslib ,虽然他们是从R2的全球范围内使用的完全不同。 此外,所有模块的上下文是全球性的。

这是可能的(普通)为只从任务局部根引用引用有在全球范围定义的上下文,这样就会使在间接任务局部效应的背景。 这是结合环,时通常会发生什么use ,关闭或私人模块从“用户代码”,基本上是指非模块脚本,获取绑定到被称为system/contexts/user 。 从技术上讲,这也是从模块调用以及功能的情况下(因为功能叠加局部),但这些提法往往最终会被分配到模块的话,这是全球性的。

不,我们还没有同步无论是。 不过,就是这样R3的设计应该有最终的型号,并已经部分一样。 请参阅模块结合文章的更多细节。

作为奖励,R3有一个真正的符号表现,而不是使用system/words作为一个特设的符号表。 这意味着,一字涨停R2用来击打很快在R3有效地消失了。 我不知道,已经达到了新的限制,甚至确定的极限有多高是任何应用程序,但它显然是远远超过几百万不同的符号。 我们应该检查源明白这一点,现在我们有它的访问。

加载和使用

末节。 在use函数初始化它的话有none ,而不是让他们取消设置。 而且因为没有“全局”上下文的方式存在于R2, load不一定在所有绑定的话。 这方面load结合依赖于中提到的情况下, 模块绑定物品 ,但除非另行指定它明确地结合的话system/contexts/user 。 而无论是现在是夹层功能。

拼写和别名

R3是基本相同R2在此,字绑定默认不区分大小写的。 这句话本身是保留大小写的,如果您使用的是区分大小写的方法对它们进行比较,你会看到不同之处仅在情况单词之间的差异。

在对象或函数上下文虽然,当一个字被映射到的值插槽,然后另一字被绑定到该上下文或在运行时查找,不同之处仅通过壳体被认为是有效地相同的字,并映射到相同的字值槽。

然而,人们发现,明确创建与制作别名alias功能,其中的别名单词的拼写在其他方面差异不仅仅是由案子破了对象和功能环境确实显着 。 在R2他们解决了这些问题, system/words ,这让alias只是难言之隐比演示之外的任何使用,而不是积极的危险。

正因为如此,我们去掉了外部可见的alias完全功能。 内部走样设施仍然有效,因为它仅别名通常会被视为等同上下文查找,这意味着环境不破的话。 但是,我们现在建议的定位和其他招数alias是用于演示,如果从来没有在实践中,采用与新的拼写另一个词分配值的老式的方法来实现。

字类型

issue! 现在类型是字类型。 你可以绑定。 到目前为止,没有人采取的能够结合的问题,而不是仅仅使用操作增加的速度优势。

这是相当多了,对于有意改变。 大多数的差异,其余的可能是上述情况,或者甚至错误或尚未实现的功能的副作用。 甚至有可能在R3 R2的一些类似的行为,这也是错误或尚未实现的功能的结果。 有疑问时,先询问。



文章来源: What is the summary of the differences in binding behaviour between Rebol 2 and 3?