В разборе диалектов скобки оценивают выражения. Тем не менее, результат оценки не становится частью правила разбора. Это по замыслу, так что вы можете работать в этом стиле:
>> 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
AFAIK, Rebol 2 не имеет общего способа запускать выражения "DO" в середине синтаксического анализа и эффективно объединять выражения в правила. Поэтому вы должны использовать заключенный в скобки код для получения и установки слов, а затем использовать эти слова в правилах.
Rebol 3 предположительно добавил версию DO , но я не могу найти примеры, которые работают в текущей альфа-версии. Как описано в вики, я ожидал, что это вернет true
и захватит результат "abc":
>> result: none
== none
>> parse "abc" [copy result thru do [reverse "cba"]]
== false
>> result
== none
(Он также не работает на более простых примерах. Но я однажды попробовал это сделать из-за выражения «Оператор DO можно использовать в качестве аргумента правила для операций COPY, SET или RETURN. В нем ничего не сказано» * не может быть использован в другом месте , но также не сказано, что может быть использован в другом месте ...)