【问题标题】:Rebol 2: Using a parse rule to check input without executing codeRebol 2:使用解析规则检查输入而不执行代码
【发布时间】:2015-02-19 00:21:38
【问题描述】:

假设您有一个类似于下面来自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)
        ]
    )
]

【问题讨论】:

    标签: rebol rebol2


    【解决方案1】:

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

    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
    

    然后您可以使用 new-rule 进行解析。

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

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

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

    【讨论】:

    • 我实际上想知道这样做,但没有意识到这将是多少工作:-(我也害怕你的最后一个断言,即代码能够改变规则。这是一个那些我宁愿闭上眼睛堵住耳朵并说“啦啦啦”来挡住它的事情。
    • @mydoghasworms 当心,我是一个解析菜鸟。我的代码有效,但我绝对不能保证它是最好的、最短的或最简单的。如果我能找到一种方法来做到这一点,而不会看起来像这么多“工作”,我也会发布它。
    【解决方案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
    

    【讨论】:

    • 我诚挚的歉意。 into 似乎是 R3 中添加的东西,对吗?我可能需要更新我的答案以指出我正在使用 R2 :-(
    • 无论如何都支持帮助
    • 再次返回:查看 R2 文档后,我看到有一个 into 命令。和R3一样吗?我需要坐下来看看这如何解决我的问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多