如何在REBOL中的PARSE中进行本地单词分配?

时间:2014-03-12 13:30:30

标签: parsing rebol rebol3

我需要一个使用PARSECOPY x规则的函数,但不会在函数外部更改x。我尝试使用FUNCTION让它自动获取本地x,但它不起作用:

>> f: function [t] [parse t [copy x to end]]
>> f ["a"]
== true
>> print x
a

2 个答案:

答案 0 :(得分:3)

使用你的FUNCTION,你已经到了一半了。您可以结合两个最近的更改:

  1. FUNCTION automatically gathers所有set-word!s在体内用作局部变量。
  2. PARSE have been relaxed的COPY和SET规则也接受set-word!s作为第一个参数。
  3. 所以这会给你:

    ;; Note the subtle change of `x` to `x:` compared to your original version:
    >> f: function [t] [parse t [copy x: to end]]
    
    >> f ["a"]
    == true
    
    >> x
    ** Script error: x has no value
    

    或者,您也可以使用/local约定明确列出本地变量:

    >> f: function [t /local x] [parse t [copy x to end]]
    >> f ["a"]
    >> x
    ** Script error: x has no value
    

答案 1 :(得分:2)

或者,或者,你可以使用一个单词! 函数中,但之外解析。

>> f: function [t] [x: none c: charset [#"a" -#"] parse t [copy x some c] print x]
>> f "a"
a
>> x
** Script error: x has no value

虽然这比其他替代方案有更多的开销,但如果像这样使用它可能对调试有帮助:

>> f: function [t] [x: 10101 c: charset [#"a" -#"z"] parse t [copy x some c] print x]
>> f ""
10101

这很明显,规则没有抓到任何东西。