2009-11-01 45 views

回答

3

另一种可能的方法是使用REBOL元编程功能并预处理自己的代码来捕获路径访问并添加处理程序代码。这里有一个例子:

apply-my-rule: func [spec [block!] /local value][ 
    print [ 
     "-- path access --" newline 
     "object:" mold spec/1 newline 
     "member:" mold spec/2 newline 
     "value:" mold set/any 'value get in get spec/1 spec/2 newline 
     "--" 
    ] 
    :value 
] 

my-do: func [code [block!] /local rule pos][ 
    parse code rule: [ 
     any [ 
      pos: path! (
       pos: either object? get pos/1/1 [ 
        change/part pos reduce ['apply-my-rule to-block pos/1] 1 
       ][ 
        next pos 
       ] 
      ) :pos 
      | into rule ;-- dive into nested blocks 
      | skip   ;-- skip every other values 
     ] 
    ] 
    do code 
] 

;-- example usage -- 

obj: make object! [ 
    a: 5 
] 

my-do [ 
    print mold obj/a 
] 

这会给你:

-- path access -- 
object: obj 
member: a 
value: 5 
-- 
5 

另一个(慢,但更灵活)的做法也可能是字符串模式通过你的代码的预处理允许从任何REBOL释放自己特定的语法规则像:

my-alternative-do { 
    print mold obj..a 
} 

预处理程序代码,然后将所有的现货..地方,更改代码以正确地插入到“应用 - 我的规则调用,并在T公司将他结束时,运行的代码:

do load code 

有一个关于多远,你可以处理,并在运行时改变你的整个代码(第一个例子中的所谓“块模式”是最有效的方式没有真正的限制)。

+0

非常有趣的感谢源代码,将与它一起玩。 – 2010-04-15 11:42:08

3

你的意思是更换(说)......

print mold system/options 

与(比如说)....

print mold system..options 

....在这里我把它换成REBOL的斜线点dot语法?

简短回答:。有些东西被硬连接到解析器中。

+0

运气不好,这将是有用的,通常插入一些业务规则来访问对象。 – 2009-11-03 19:00:17

+0

也许你可以使用表单[在系统'选项中] ... [在系统选项9999中设置]。将其封装在一个函数中,您可以在其中添加自己的代码层。 – Sunanda 2009-11-04 06:45:55