1

我正在尝试将运算符映射到 Rebol 2 中的对立面,例如:

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

这不适用于<=

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

并给出了一个非常奇怪的回应>=

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

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

4

2 回答 2

2

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

op-map: [
    >= [< ]
    <= [>]
]
于 2013-01-17T01:14:40.887 回答
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">]
]

这不仅仅是块!有这个问题,它发生在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解释>为标记定界符。

于 2013-01-16T21:49:23.740 回答