SELECT和< =和> =运算符的奇怪行为返回垃圾或无

时间:2013-01-16 21:49:24

标签: map rebol

我正在尝试在Rebol 2中制作一个操作符的映射,例如:

op-map: [
    >= [<]
    <= [>]
]

这不适用于<=

>> select op-map to-word "<="
== none  ;-- expected [>]

>=提出了一个非常奇怪的回答:

>> select op-map to-word ">="
== [<]
    <= [>]  ;-- expected just [<]

这在Rebol 3中正常工作。这是一个错误吗?如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

添加空格 - 在单词中使用<>是特殊情况,因为标签中有双重用途(如您所建议)。与常规使用一样,例如3 < 4,在<之后放置一个空格会阻止解析器将其与标记混淆并视为单词:

op-map: [
    >= [< ]
    <= [>]
]

答案 1 :(得分:0)

看起来是Rebol 2解析逻辑中的一个错误。它会看到第一个<,然后开始将后续输入解释为TAG!输入(如HTML标签),直到找到结束>。请注意:

>> length? op-map
== 2

>> op-map/2/1
== <]
    <= [>

>> type? op-map/2/1
== tag!

所以对于Rebol的2个想法,它类似于你是否写了更多的东西:

op-map: [
    >= [<a href="http://hostilefork.com">]
]

这不仅仅是BLOCK!有这个问题,它发生在PAREN!太:

>> op-map: first [(>= (<) <= (>))]
== (>= (<) <= (>))

>> length? op-map
== 2

我不完全确定在Rebol 3中使这个工作的规则是什么。它不会禁止标记内的括号:

>> print <[o]>
== <[o]>

...但你不能在源代码中使用不匹配的结束括号,而开放的大括号是可以容忍的:

>> print <]>
** Syntax error: missing "[" at "end-of-block"
** Near: (line 1) print <]>

>> print <[>
<[>

...但是当它们在引号内时你可以使用不匹配的结束语:

>> print <"]">
<"]">

奇怪的是,您可以通过编程方式创建仅包含不匹配的闭合括号的标记:

>> print to-tag "]"
<]>

因此,虽然它看起来在给定的案例中有更好的行为,但很难说是否真的存在“修复”方面的形式化逻辑。新规则可能有类似但更微妙的问题。与此同时,为了安全起见,在Rebol 2中处理这些运算符时,您可以尝试从字符串创建它们:

op-map: compose/deep [
    (to-word ">=") [(to-word "<")]
    (to-word "<=") [(to-word ">")]
]

它更冗长。但是字符串分隔符的存在将阻止解析器尝试将<>解释为标记分隔符。