在解析方言中,括號會評估表達式。然而,評估的結果並未成爲分析規則的一部分。這是由設計,所以你可以在這種風格工作:
>> count: 0
== 0
>> parse "aab" [while ["a" (print "Match a" ++ count)] "b"]
Match a
Match a
== true
>> count
== 2
評估成爲分析規則的一部分是一個不同的用例。某些實例(如您的)適合COMPOSE,因爲它們僅評估一次表達式。但我的比賽計數表達會出差錯:
>> count: 0
== 0
>> rule: compose/deep [while ["a" (print "Match a" ++ count)] "b"]
Match a
== [while ["a" 0] "b"]
>> count
== 1
>> parse "aab" rule
== false
據我所知,雷博爾2具有運行在解析中間的「DO」的表達,並有有效的表達式合併到規則沒有通用的方法。所以你必須使用加括號的代碼來獲取和設置單詞,然後在規則中使用這些單詞。
Rebol 3據說已經添加了DO版本,但是我找不到任何可以在當前alpha版本中工作的例子。由於在wiki上所述,我希望這回true
並捕獲結果「ABC」:
>> result: none
== none
>> parse "abc" [copy result thru do [reverse "cba"]]
== false
>> result
== none
(這也不起作用更簡單的例子,但我想,一旦由於聲明「 DO語句可以用作COPY,SET或RETURN操作的規則參數,但並不是說它不能在其他地方使用,但它也沒有說它可以在其他地方使用 ...)
撰寫將在這個例子中工作,但他可能會問一般能否擁有一條運行表達式的解析規則,這就是R3的DO所要做的(http://www.rebol.net/wiki/Parse_Project#DO),但我無法得到它的工作,看到我的答案... – HostileFork 2010-08-13 22:58:17
非常感謝,它花了我一會兒,搞清楚,如何'撰寫'工作。順便說一句 - 是「字符集」AB「'和'字符集[#」一個「#」B「]'相當於? (我認爲後一種形式是用於範圍,如果我們插入'-') – mykhal 2010-08-13 23:35:46
'>>(charset「ab」)= charset [#「a」#「b」] == true' – 2010-08-14 01:47:04