我正在尝试在Rebol 2中制作一个操作符的映射,例如:
op-map: [
>= [<]
<= [>]
]
这不适用于<=
:
>> select op-map to-word "<="
== none ;-- expected [>]
对>=
提出了一个非常奇怪的回答:
>> select op-map to-word ">="
== [<]
<= [>] ;-- expected just [<]
这在Rebol 3中正常工作。这是一个错误吗?如何解决这个问题?
答案 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 ">")]
]
它更冗长。但是字符串分隔符的存在将阻止解析器尝试将<
和>
解释为标记分隔符。