2013-05-06 33 views
3

使用parse从数据中提取值时,我经常最终声明全局变量来捕获copy数据。 例如,在解析数据时复制数据时尽量减少命名空间污染

numbers: none 
rule: [ thru 5 copy numbers to 10 to end ] 
parse [ 1 2 3 4 5 6 7 8 9 10 ] [ rule ] 

什么是做到这一点,而无需使用numbers作为一个全球性的最佳方式? 我是否应该定义一个context来包装整批或者是否有更优雅的解决方案?

回答

2

的上下文将没有声明变量的上下文

>> unset 'a 
>> context [ parse "aa" [ copy a to end ]] 
>> a 
== "aa" 

内以同样的方式,你可以使用带有声明为局部变量的函数内的解析规则来阻止他们污染全局命名工作空间。

6

就R2而言。是的,将所有内容包装在一个环境中(使用CONTEXT)非常简单。你也可以做到这一点使用用途:

 
use [numbers][ 
    numbers: none 
    rule: [ thru 5 copy numbers to 10 to end ] 
    parse [ 1 2 3 4 5 6 7 8 9 10 ] [ rule ] 
] 

正如格雷厄姆说,使用的将默认组数字来没有一个函数的局部变量。

我经常会使用USE向我自己传达上下文是短暂的,或创建一个私有上下文。

+0

在这种情况下,不需要“数字:无”,因为如果您使用CONTEXT,它是必要的。 – endo64 2013-05-08 07:44:18

+1

Endo是的,如果规则成功就像这个例子那样是真的,但是说我的例子只包含前4个数字,而我没有“numbers:none”,那么数字就没有价值,即它将被取消设置!这是Rebol 2中USE的默认行为。这可能是也可能不是你想要的。在Rebol 3中使用有不同的行为,并会自动将数字设置为无。 – Brett 2013-06-19 02:50:42

+0

谢谢Brett,我不知道R3中的USE表现不同。 – endo64 2013-06-22 00:54:38