看起来是 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">]
]
这不仅仅是块!有这个问题,它发生在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 ">")]
]
它更冗长。但是字符串定界符的存在将阻止解析器尝试将<
and解释>
为标记定界符。