3

假设您有一个类似于Rebol docs on parsing中的以下规则。

如果您想根据规则检查某些输入以验证它,但没有评估括号的内容,您该怎么做?

有没有一种方法可以让您轻松地根据规则验证输入,而无需评估括号的内容?

rule: [
    set action ['buy | 'sell]
    set number integer!
    'shares 'at
    set price money!
    (either action = 'sell [
            print ["income" price * number]
            total: total + (price * number)
        ] [
            print ["cost" price * number]
            total: total - (price * number)
        ]
    )
]
4

2 回答 2

3

好吧,您可以从规则中删除括号:

unparen: func [b [block!]][forall b [case [
    paren! = type? b/1 [remove b] block! = type? b/1 [unparen b/1]]] head b]
new-rule: unparen copy/deep rule

然后您可以使用新规则进行解析。

但是,我担心这仍然违反了您的“轻松”要求!

而且它不处理嵌套的规则引用。

除了提供信息之外,理论上您的问题没有答案。例如,括号中的代码可能正在更改规则。

于 2015-02-17T21:14:05.977 回答
2

取决于您的意思是解析输入还是解析规则。

对于解析规则,您需要一些特殊的标志和函数来处理它:

do?: true
parse-do: function [code] [if do? [do code]]
rule: ['a (parse-do [print "got it"])]
parse [a] rule
do?: false
parse [a] rule

对于解析输入使用INTO

>> parse [paren (1 + 1)]['paren into [integer! '+ integer!]]
== true
于 2015-02-17T18:51:23.630 回答