Rebol 2:使用解析规则检查输入而不执行代码
Rebol 2: Using a parse rule to check input without executing code
假设您有一条来自 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)
]
)
]
取决于您是指解析输入还是解析规则。
对于解析规则,您需要一些特殊的标志和函数来处理它:
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
好吧,您可以从您的规则中删除括号:
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
然后您可以使用新规则进行解析。
但是,我担心这仍然违反了您的 'easily' 要求!
并且它不处理嵌套规则引用。
顺便提一下,理论上您的问题没有答案。
例如,括号中的代码可能会更改规则。
假设您有一条来自 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)
]
)
]
取决于您是指解析输入还是解析规则。
对于解析规则,您需要一些特殊的标志和函数来处理它:
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
好吧,您可以从您的规则中删除括号:
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
然后您可以使用新规则进行解析。
但是,我担心这仍然违反了您的 'easily' 要求!
并且它不处理嵌套规则引用。
顺便提一下,理论上您的问题没有答案。 例如,括号中的代码可能会更改规则。