2009-11-01 48 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